以速度移动精灵以跟随手指



有没有一种方法可以使用速度使精灵遵循您的手指?我希望一个精灵跟随我的手指,但我不希望它被拖放。我希望它能够与其他精灵与委托属性进行交互。

例如:当撞墙时,我希望一个球重置。我设置了代码以重置球。当球撞到墙壁时,它不会重置。我提出了打印声明,以查看其是否注册了碰撞。当球撞到墙壁时,它会打印说明。

那是我如何使球移动的问题,对

或我的代码可能会出现错误。

代码:

import SpriteKit
import GameplayKit

class GameScene: SKScene {
    var ball = SKSpriteNode()
    var danger1 = SKSpriteNode()
    var danger2 = SKSpriteNode()
    var goal = SKSpriteNode()

    override func didMove(to view: SKView) {
        physicsWorld.contactDelegate = self
        ball = self.childNode(withName: "ball") as! SKSpriteNode
        danger1 = self.childNode(withName: "danger1") as! SKSpriteNode
        danger2 = self.childNode(withName: "danger2") as! SKSpriteNode
        goal = self.childNode(withName: "goal") as! SKSpriteNode
        let border = SKPhysicsBody(edgeLoopFrom: self.frame)
        border.friction = 0
        border.restitution = 0
        danger1.physicsBody = SKPhysicsBody(rectangleOf: danger1.size)
        danger1.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory
        danger1.physicsBody?.isDynamic = false
        danger2.physicsBody = SKPhysicsBody(rectangleOf: danger2.size)
        danger2.physicsBody?.categoryBitMask = PhysicsCategories.dangerCategory
        danger2.physicsBody?.isDynamic = false
        ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width/2)
        ball.physicsBody?.categoryBitMask = PhysicsCategories.ballCategory
        ball.physicsBody?.contactTestBitMask = PhysicsCategories.dangerCategory | PhysicsCategories.goalCategory
        ball.physicsBody?.collisionBitMask = PhysicsCategories.none
        ball.physicsBody?.isDynamic = true
        ball.physicsBody!.affectedByGravity = false
        goal.physicsBody = SKPhysicsBody(rectangleOf: goal.size)
        goal.physicsBody?.categoryBitMask = PhysicsCategories.goalCategory
        goal.physicsBody?.isDynamic = false

        setupPhysics()
        startGame()
    }
    func setupPhysics() {
        physicsWorld.gravity = CGVector(dx: 0.0, dy: 0.0)
        physicsWorld.contactDelegate = self
    }

    func startGame() {
        ball.position = CGPoint(x: 0, y: 550)
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
        }
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location = touch.location(in: self)
            ball.position.x = location.x
            ball.position.y = location.y
        }
    }
    override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendered
    }
}
extension GameScene: SKPhysicsContactDelegate {

    func didBegin(_ contact: SKPhysicsContact) {
        let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
        if contactMask == PhysicsCategories.ballCategory | PhysicsCategories.dangerCategory {
            print("Contact")
        } else if contactMask == PhysicsCategories.ballCategory | PhysicsCategories.goalCategory {
            print("goal contact")
        }
    }
}

如您提到的,您应该使用速度而不是位置。

您必须应用位置的差异。为了使其更顺畅,您也应该将重量施加到速度。

这尚未进行测试,看起来更像伪代码,但这是您基本上应该做的。

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let destination = touch.location(in: self)
        let position = ball.position
        let direction = destination - position // the vector of the difference
        let weight = 0.95 // 0.0 to 1.0 
        ball.velocity = CGVector(direction * weight) // multiply the vector by the weight
    }
}

您应该在运行每一帧并使用标志的循环中执行此操作,以查看是否有手指触摸屏幕,因为当您触摸屏幕但不要移动手指时,它不会施加速度。

最新更新