如何在不导致fps滞后的情况下移动精灵

时间:2017-04-11 09:27:49

标签: swift3 sprite-kit xcode8

我正在创建一个spritekit游戏,我对swift很新。我想要两个按钮让玩家向右或向左移动。当按下按钮时,例如左按钮,精灵必须开始向左移动而不停止。当它撞到左墙时它会改变方向并向右移动到另一面墙,依此类推......我设法让精灵通过使用更新功能来做到这一点。每次调用它时都会检查玩家是否按下按钮并相应地移动精灵,然而,它会导致FPS延迟(FPS会下降到50)。

我尝试使用像MoveBy和MoveTo这样的SKActions,但无法重新创建我想要的精灵。

所以我的问题是:如何使用两个按钮使精灵按照我想要的方式移动而不会导致FPS延迟。任何帮助,将不胜感激。谢谢

以下是我在更新功能中调用的函数,它们起作用但导致滞后。

func moveRight() {
    sprite.xScale = 1
    sprite.position.x += 4
}

func moveLeft() {
    sprite.xScale = -1
    sprite.position.x -= 4
}

1 个答案:

答案 0 :(得分:2)

试试这段代码:

当按下按钮时,它会永远运行移动动作,当按钮被释放时,它会移除动作

这将使玩家有希望在不降低帧率的情况下移动。要在精灵撞到墙壁时改变精灵的方向,你必须检查碰撞。当它碰到墙壁时,你可以检查它是否是正在应用的leftMove或rightMove动作,然后删除该动作并启动相反的动作。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    for touch in touches {
        let location = touch.location(in: self)

        if(leftButton.contains(location) { // check if left button was pressed
            moveLeft()
        } else if(rightButton.contains(location) { //check if right button was pressed
            moveRight()
        }
    }
}

func moveLeft() {
    //Check if it's already moving left, if it is return out of function
    if((sprite.action(forKey: "leftMove")) != nil) {
        return
    }
    //Check if its moving right, if it is remove the action
    if((sprite.action(forKey: "rightMove")) != nil) {
        sprite.removeAllActions()
    }
    //Create and run the left movement action
    let action = SKAction.move(by: -100, duration: 1)
    sprite.run(SKAction.repeatForever(action), withKey: "leftMove")
}

func moveRight() {
    //Check if it's already moving right, if it is return out of function
    if((sprite.action(forKey: "rightMove")) != nil) {
        return
    }
    //Check if its moving left, if it is remove the action
    if((sprite.action(forKey: "leftMove")) != nil) {
        sprite.removeAllActions()
    }
    //Create and run the right movement action
    let action = SKAction.move(by: 100, duration: 1)
    sprite.run(SKAction.repeatForever(action), withKey: "rightMove")
}