我在屏幕上有一个sprite节点,玩家可以左右移动。我知道如何使用touchesMoved使其左右移动,但是,如果玩家触摸某个位置,则节点会捕捉到该位置。 例如,如果该节点位于屏幕的左侧,并且玩家触摸了屏幕的右侧,则该节点将立即移至触摸位置。我不要这种行为。我只希望节点在玩家向左或向右移动手指时移动,而不是在他们触摸某个位置时移动。以下是我当前使用的代码。没有任何代码会影响touchesBegan或touchesEnded函数中的playerNode x位置。
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches
{
if game.state == .game
{
let position = touch.location(in: playableArea)
game.playerNode.position.x = position.x
}
}
}
如何阻止这种行为的发生,只有在玩家的手指向左或向右移动时才让节点移动?
答案 0 :(得分:0)
我最终解决了我的问题。我知道我实际上必须相对于触摸位置移动节点,但是我不确定该怎么做。这就是我的工作方式。
首先,我创建了一个变量,该变量将等于玩家的触摸位置。此变量在touchesBegan中设置。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
if game.state == .game
{
let position = touch.location(in: playableArea)
playerTouchPosition = position
}
}
我将此变量用作触摸的起点。当玩家移动手指时,它会计算玩家相对于起点移动手指的程度。例如,如果玩家触摸X值100,然后将手指移至X值120,则可以计算出玩家将手指移了20。找到该值后,我将playerTouchPosition设置为touchesMoved。这是为了使下一个动作相对于上一个动作。然后,我将玩家节点移动手指移动的数量。
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches
{
if game.state == .game
{
let position = touch.location(in: playableArea)
let newX : CGFloat!
if position.x > playerTouchPosition.x
{
newX = position.x - playerTouchPosition.x
}else
{
newX = -(playerTouchPosition.x - position.x)
}
playerTouchPosition = position
game.playerNode.position.x = game.playerNode.position.x + newX
}
}
}
这阻止了玩家节点立即移动到触摸位置X值所在的位置。