在我的游戏中,我在屏幕底部有一个节点,它喜欢使用触摸沿x轴移动。我希望我的节点可以根据拖动的方向向左或向右移动,也可以移动与拖动相同的距离。因此,如果用户从左向右拖动(CGPoint(x: 200, y: 500)
到CGPoint(x:300, y: 500))
,则节点将向右移动100。这是我试过的,但它没有用。如果有人有办法解决这个问题,我真的很感激
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
let touch = touches.first as! UITouch
let touchLocation = touch.locationInNode(self)
firstTouch = touchLocation
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
let touch = touches.first as! UITouch
let touchLocation = touch.locationInNode(self)
secondTouch = touchLocation
if gameStarted {
let change = secondTouch.x - firstTouch.x
let move = SKAction.moveToX(greenGuy.position.x + change, duration: 0.1)
greenGuy.runAction(move)
}
}
答案 0 :(得分:1)
使用以下代码更新touchesMoved
:
let touch = touches.first as! UITouch
let touchLocation = touch.locationInNode(self)
secondTouch = touchLocation
if gameStarted {
let change = secondTouch.x - firstTouch.x
//Update greenGuys position
greenGuy.position = CGPoint(x: greenGuy.position.x + change, y:greenGuy.position.y)
//Update the firstTouch
firstTouch = secondTouch
}
我以前评论过没有使用SKAction
的原因是因为我们不知道两次touchesMoved
方法调用之间会经过多长时间,所以我们不知道确切地在SKAction duration
输入的时间。
答案 1 :(得分:0)
你有一个很好的开始。首先,改变:
let move = SKAction.moveToX(greenGuy.position.x + change, duration: 0.1)
为:
let move = SKAction.moveByX(greenGuy.position.x + changeInX, duration: moveDuration)
如果您想要进行二维移动,请改用SKAction
moveByX:ChangeInX y:ChangeInY duration:moveDuration
。现在,您还有一些基于滑动持续时间/距离的变量。您为moveDuration
选择的持续时间将取决于您,它将是某个系数和滑动距离的乘积。
要获取滑动距离:
我建议你放弃触摸方法并使用UIGestureRecognizer
。你需要的是UIPanGestureRecognizer
。
这是一个有用的链接,详细说明了它的用法:UISwipeGestureRecognizer Swipe length。
基本上它具有在用户开始或结束滑动/拖动动作时设置的不同状态。然后,您可以在那些时刻取locationInView
并计算它们之间的距离:D