【发布时间】:2014-08-13 04:17:11
【问题描述】:
更新:我已经解决了这个问题,并找到了一种比提供的答案更简单的方法。我的解决方案是让太空船的速度等于它与我手指触摸的距离。为了更快地移动,您可以将此速度乘以一个常数。在这种情况下,我使用了 16。我还摆脱了在 touchesEnd 事件中将 lastTouch 设置为 nil。这样,即使我松开手指,船仍然会停下来。
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
if let touch = lastTouch {
myShip.physicsBody.velocity = CGVector(dx: (lastTouch!.x - myShip.position.x) * 16, dy: 0)
}
}
=================================
我有一个 SPACESHIP 节点,其运动限制在 X 轴上。当用户按下并按住屏幕上的某处时,我希望太空船能够移动到手指的 x 坐标,并且在手指松开之前不会停止向手指移动。如果 SPACESHIP 靠近用户手指并且用户手指仍然按下,我希望它逐渐减速并停止。我还希望在太空船改变方向、启动和停止时应用这种平滑的运动。
我正在尝试找出最好的方法。
到目前为止,我已经创建了节点并且它移动正确,但是有一个问题:如果我在屏幕上按住并按住,船最终会越过我的手指并继续移动。这是因为只有在我移动手指时才会触发改变船方向的逻辑。所以本质上,将我的手指移动到船上来改变船的方向是可行的,但是如果船越过我静止的手指,它不会改变方向
我需要 SPACESHIP 节点来识别它何时越过我静止的手指,并根据它与我手指的距离来改变它的方向或停止。
以下是相关代码:
第 1 部分:当用户按下时,找出触摸的来源并使用速度相应地移动 myShip (SPACESHIP)
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
/* Called when a touch begins */
let touch = touches.anyObject() as UITouch
let touchLocation = touch.locationInNode(self)
if (touchLocation.x < myShip.position.x) {
myShip.xVelocity = -200
} else {
myShip.xVelocity = 200
}
}
第 2 部分当用户移动他们的手指时,触发一个事件来检查手指现在是否已移动到船的另一侧。如果是这样,改变船的方向。
override func touchesMoved(touches: NSSet!, withEvent event: UIEvent!) {
let touch = touches.anyObject() as UITouch
let touchLocation = touch.locationInNode(self)
//distanceToShip value will eventually be used to figure out when to stop the ship
let xDist: CGFloat = (touchLocation.x - myShip.position.x)
let yDist: CGFloat = (touchLocation.y - myShip.position.y)
let distanceToShip: CGFloat = sqrt((xDist * xDist) + (yDist * yDist))
if (myShip.position.x < touchLocation.x) && (shipLeft == false) {
shipLeft = true
myShip.xVelocity = 200
}
if (myShip.position.x > touchLocation.x) && (shipLeft == true) {
shipLeft = false
myShip.xVelocity = -200
}
}
第 3 部分当用户从屏幕上松开手指时,我希望飞船停止移动。
override func touchesEnded(touches: NSSet!, withEvent event: UIEvent!) {
myShip.xVelocity = 0
}
第 4 部分更新改变船舶位置的事件
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
let rate: CGFloat = 0.5; //Controls rate of motion. 1.0 instantaneous, 0.0 none.
let relativeVelocity: CGVector = CGVector(dx:myShip.xVelocity - myShip.physicsBody.velocity.dx, dy:0);
myShip.physicsBody.velocity = CGVector(dx:myShip.physicsBody.velocity.dx + relativeVelocity.dx*rate, dy:0);
感谢阅读,期待回复!
【问题讨论】:
-
对于任何在这里搜索的人,我为这个老问题提供了一个正确/现代的答案,希望对您有所帮助
标签: ios swift sprite-kit