Ios 为什么在spritekit中按下按钮时,节点的速度越来越快?

Ios 为什么在spritekit中按下按钮时,节点的速度越来越快?,ios,swift,Ios,Swift,正如标题所示,每次我点击一个按钮节点,一个项目节点就会变得更快。我怎样才能保持速度一致这是函数的代码。 let ball: Ball = Ball(textureName: "ball.png") func attackButton() { ball.removeFromParent() ball.position = CGPointMake(100, hero.position.y) ball.startMoving() hero.throwBall() /

正如标题所示,每次我点击一个按钮节点,一个项目节点就会变得更快。我怎样才能保持速度一致这是函数的代码。

let ball: Ball = Ball(textureName: "ball.png")
func attackButton() {

    ball.removeFromParent()

    ball.position = CGPointMake(100, hero.position.y)
    ball.startMoving()
    hero.throwBall() // for just movement of his arm
    playThrowSound()
    addChild(ball)

}

func startMoving() {
    let moveLeft = SKAction.moveByX(200, y: 0, duration: 3)
    ball.runAction(SKAction.repeatActionForever(moveLeft))

    let rotating = SKAction.rotateByAngle(CGFloat(M_PI), duration: 6)
    ball.runAction(SKAction.repeatActionForever(rotating))
}
另外,虽然这段代码可以工作,但不是我想要的方式。生成球后,删除该球并生成下一个球。我知道这是因为
removeFromParent()
,但我想不出其他方法。我希望这个曾经制作过的球只有在离开屏幕时才被删除


所以,如果你能给我这两个问题的解决方案,我真的很感激

也许您必须删除最后一个
SKAction
,然后在调用startMoving函数时运行新操作。您可以使用
removeActionForKey(“”
removeAllActions()
为您的
球类添加代码好吗?我想在你的
球类中
是你的应用程序崩溃的问题。在功能
attackButton
中,您将删除
球并将其添加到场景中。但是我认为在你的
Ball类中
你添加了一个SKNode,但是你没有在那里删除它。因此,如果您修复了
Ball类中的问题,下面的代码应该可以工作(您没有发布代码-因此您必须自己检查)


编辑:永远运行动作以在3秒内移动200点是没有意义的。这就是为什么你的球总是移动得太快。即使删除了节点,上一个操作仍然有效,因为它与应用该操作的变量相同

如果要在球离开屏幕后将其删除,则可以执行两项操作:计算球位置何时在视图之外,或在几秒钟后将其删除(无论移出场景需要多长时间)

要在退出视图后删除,可以执行以下操作。将此代码作为全局变量添加到任意位置或类中

//Used to get the ratio of the device for later calculation
var deviceWidth = UIScreen.mainScreen().bounds.width
var deviceHeight = UIScreen.mainScreen().bounds.height
var playableArea: CGRect!
根据方向,选择一个并将其添加到didMoveToView()中

这段代码的作用是:它画了一个矩形框,包围了用户能够看到的整个手机视图。现在,您只需检查球的位置是否在可玩区域矩形之外

if ball.x > playableArea.x || ball.x < playableArea.x {
    //If the ball has moved out of the view horizontally
    runAction(SKAction.sequence([SKAction.waitForDuration: 0.5, ball.removeFromParent()]))
} else if ball.y > playableArea.y || ball.y < playableArea.y {
    //If the ball has moved out of the view vertically
    runAction(SKAction.sequence([SKAction.waitForDuration: 0.5, ball.removeFromParent()]))
}

不工作。有一条错误消息说“由于未捕获的异常‘NSInvalidArgumentException’而终止应用程序,原因:'试图添加已具有父节点的SKNode:这意味着您正在添加一个已存在且未删除的精灵。这就像我将球添加到场景中,然后在不删除最后一个球的情况下再次添加球。仅供参考,这是因为球不是局部变量。我尝试过,但目前尚未成功。如果我将其写为本地,那么现在用作全局的现有代码将无法运行,因为它是在“didBeginContact(contact:skphysiccontact)”方法中编写的。因为它现在被用作全局,所以很好。要解决这个问题,有什么办法吗?
//USE THIS FOR PORTRAIT
 let maxAspectRatio: CGFloat = deviceHeight / deviceWidth
 let playableWidth = size.height / maxAspectRatio
 let playableMargin = (size.width - playableWidth) / 2.0
 playableArea = CGRect(x: playableMargin, y: 0, width: playableWidth, height: size.height)

 //USE THIS FOR LANDSCAPE
 let maxAspectRatio: CGFloat = deviceWidth / deviceHeight
 let playableHeight = size.width / maxAspectRatio
 let playableMargin = (size.height - playableHeight) / 2.0
 playableArea = CGRect(x:0, y: playableMargin, width: size.width, height: playableHeight)
if ball.x > playableArea.x || ball.x < playableArea.x {
    //If the ball has moved out of the view horizontally
    runAction(SKAction.sequence([SKAction.waitForDuration: 0.5, ball.removeFromParent()]))
} else if ball.y > playableArea.y || ball.y < playableArea.y {
    //If the ball has moved out of the view vertically
    runAction(SKAction.sequence([SKAction.waitForDuration: 0.5, ball.removeFromParent()]))
}
ball.runAction(SKAction.sequence([SKAction.moveByX(200, y: 0, duration: 3), SKAction.removeFromParent()]))