更流畅的Sprite-Kit对象移动

问题描述 投票:0回答:1

我目前正在为Mac编程一个小pong-game,但我找不到让拨片平滑移动的方法。我使用keyDown函数来检测何时按下一个键(例如W)。这将执行一个运行命令。

override func keyDown(with event: NSEvent) {
        if event.keyCode == 126 {
            pR.run(SKAction.move(by: CGVector(dx: 0, dy: 15), duration: 0))
        }
}

问题是,当我按下箭头向上键(keyCode 126)时,我的spritepaddle(pR)移动了一次,如果我继续按住按钮,它就开始持续移动。

另外,如果我有两个if指令(例如两个玩家都有一个),似乎不能同时有两个输入,也就是说,两个玩家都不能按下一个按钮并期望得到回应。

如何解决这些问题?希望能得到大家的帮助。

swift macos sprite-kit pong
1个回答
0
投票

问题1:为什么我的拨片移动不顺畅? 为什么你运行一个持续时间为0的运动SKAction?这是完全相同的改变它的y位置,你可以使持续时间更长,如0.1。

如果你想这样做,你应该在每次按W键时删除p1的SKAction,为什么呢? 你不想让它同时运行两个SKAction。 (我假设pR是你的玩家1桨。代表Paddle Right吧。)

pR.removeAllActions()
pR.run(SKAction.move(by: CGVector(dx: 0, dy: 15), duration: 0.1))

或者,如果你希望它是立即的,你可以这样做,而不是(虽然你的桨会移动相当快,取决于你的帧速率)。

pR.position.y += 15

我推荐第一种方案。或者,如果你喜欢第二个方案,因为它比较干净,你就把15换成10或5。


问题2:不能同时做两个输入端。 - 1:你不可能在 "完全 "同一时间点击2个按钮。 - 2:这是什么意思? - 3:Swift用你按下的第一个键运行keyDown。 - 4:然后Swift用你按的第二个键运行keyDown。

(即使你认为你同时按了两个键,你也没有。其中一个可能是在第二个键之前一微秒按下的。这就是时间问题。这对于iOS上的SpriteKit来说也是一样的,你不可能同时有两个'touchesBegan'输入。这是很罕见的)。)

如何修复它。你应该可以为玩家2的另一个键添加第二个'if'语句。示例代码(除了我使用了一个开关以节省空间外

override func keyDown(with event: NSEvent) {
        switch Int(event.keyCode) {

        // W Key
        case 13: // (Player 1 moves up)
        // S Key
        case 1: // (Player 1 moves down)

        // I Key
        case 34: // (Player 2 moves up)
        // K Key
        case 40: // (Player 2 moves down)

        // Someone clicked the wrong key
        default: return
        }
}

你猜怎么着! 这个代码^^几乎可以用了。我还没有回答你的第三个问题。


问题3:Paddle移动一次,停止,然后开始持续移动。 这显然是keyDown函数的工作原理,我的建议是这样的。

- 在一个变量中记录哪些键被按下了 - 使用 "keyUp "函数来删除这些存储的值。

这是如何工作的?

var keysPressed: Set<Int> = []

override func keyDown(with event: NSEvent) {
        keysPressed.insert(event.keyCode)
}
override func keyUp(with event: NSEvent) {
        keysPressed.remove(event.keyCode)
}
override func update(_ currentTime: TimeInterval) {
        for i in keysPressed {
           // Put my Movement Switch Statement In Here
        }
}

我希望这能帮助你 如果你有任何问题,请随时回复。


啪,我才发现这个问题已经在上面的小评论区回答过了。哦,好吧。

© www.soinside.com 2019 - 2024. All rights reserved.