【问题标题】:How do I make a sprite change directions when tapped?点击时如何使精灵改变方向?
【发布时间】:2015-12-16 14:34:08
【问题描述】:

第一次触摸时,我的播放器开始向上移动 y 轴,我将其设置如下:

 override func touchesBegan(...) {
if isMovingup == true  {
        let up = SKAction.moveByX(0, y: 900, duration: 9)
         player.runAction(up)
    }
    else {
        let down = SKAction.moveByX(0, y: -900, duration: 9)
        player.runAction(down)
 }
    isMovingup = !isMovingup
    }

但是,当第二次点击节点时,我希望它向下移动 y 轴,但到目前为止,它什么也不做。如有必要,将发布更多代码。

【问题讨论】:

  • 再看一遍,也许你发布的代码需要重新输入,或者更详细。您在 isMovingup 更改上方有一个额外的花括号,这是故意的,还是输入错误?截至目前,您的代码甚至不应该编译,这让我想知道您的 touchBegan 函数是否设置正确

标签: swift sprite-kit skaction


【解决方案1】:

您需要使用player.removeAllActions() 停止上一个操作,否则您的操作将继续堆叠。

override func touchesBegan(...) {
    player.removeAllActions() //<-- Touching always causes the player to change direction, so lets cancel out the previous action before assigning a new one
    if isMovingup == true  {
        let up = SKAction.moveByX(0, y: 900, duration: 9)
        player.runAction(up)
    }
    else {
        let down = SKAction.moveByX(0, y: -900, duration: 9)
        player.runAction(down)
    }
    isMovingup = !isMovingup
}

【讨论】:

  • 你能详细说明一下吗?
  • 这非常有效。非常感谢!对不起,原来的错字。
  • 没关系,我以为是错字,但在其他人的回答之后,我不得不发表评论以确保我们以某种方式更正了问题
  • 请注意,您应该将 removeAllActions 放在 if 语句中的唯一情况是,如果存在触摸不会导致玩家改变方向的情况。冗余代码越少意味着可能发生的错误越少。
【解决方案2】:

看起来你的布尔翻转超出了函数的范围。尝试将行 isMovingup = !isMovingup 移动到最后一个花括号内。

override func touchesBegan(...) {
    if isMovingup {
        let up = SKAction.moveByX(0, y: 900, duration: 9)
        player.runAction(up)
    }
    else {
        let down = SKAction.moveByX(0, y: -900, duration: 9)
        player.runAction(down)
    }
    isMovingup = !isMovingup
}

【讨论】:

  • 哎呀,这是一个错字。它在最后一个花括号内,但没有做我希望的事情。
  • 我明白了。 KnightOfDragon 的回答可能解决了你的问题。
  • 好的,我会把它放在条件句的什么地方?
  • 可能在每个 if / else 子句中,在向玩家对象添加 updown 操作之前。
  • 你能给我一个代码示例吗?抱歉,还早。
【解决方案3】:

好像是那段代码

isMovingup = !isMovingup

在函数之外定义,所以它没有被运行。在 else 语句之后将它移到函数内部,这样每次调用函数时都会运行它

override func touchesBegan(...) {
    if isMovingup == true  {
        let up = SKAction.moveByX(0, y: 900, duration: 9)
        player.runAction(up)
    }
    else {
        let down = SKAction.moveByX(0, y: -900, duration: 9)
        player.runAction(down)
   }
   isMovingup = !isMovingup
}

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    相关资源
    最近更新 更多