双跳的SpriteKit问题仅在某些时候有效

时间:2017-04-18 21:57:33

标签: swift sprite-kit

代码:

func jumpAction(_ JumpPos: CGPoint, _ clickPos: CGPoint) {
    if jumpCount < 2 {
        var disty = (clickPos.y - JumpPos.y)
        var distx = clickPos.x

        self.physicsBody?.velocity = CGVector(dx: 0, dy: 0)
        self.physicsBody?.applyImpulse(CGVector(dx: distx, dy: disty))

        if  onGround == false {
            jumpCount += 1
        }
    }
}//

func didBegin(_ other: SKSpriteNode, _ contact: SKPhysicsContact) {
    if contact.contactPoint.y < self.frame.minY + 10 {
        jumpCount = 1
        onGround = true
    }
    if other.physicsBody?.categoryBitMask == Mask.SpinPlat {
        jumpCount = 0
    }
}

func didEnd(_ contact: SKPhysicsContact) {

    onGround = false
}

我上面有3个功能。当我按下屏幕上的跳转按钮时,会调用JumpAction。当与播放器发生与平台顶部的接触时,会调用didBegin和didEnd函数。

我的问题:

因此,如果玩家在平台上并跳转,则在didEnd函数之前调用跳转动作。这就是当玩家联系平台时我将jumpCount设置为1的原因。这很好用......

真正的问题是当我的球员落在平台上时,他稍微反弹(由于恢复原状)然后按下跳跃按钮。

发生这种情况时,onGround标志会在调用跳转动作之前翻转为false,而我的播放器只能单跳。

我试图找到一种简单的方法来解决这个问题,而不必实现一堆代码,但尚未找到方法。

所以这就是我在这里的原因。我希望能够双跳,即使我之前解释的那个轻微的反弹。

提前谢谢!!!

其他信息: 我使用onGround标志,这样如果玩家在地上,如果他们按下正确位置的跳跃按钮,他可以沿地面滑动......

1 个答案:

答案 0 :(得分:1)

您是否尝试过简单地延迟在地面上设置&#34;&#34;标志只有几分之一秒?

let waitAction = SKAction.wait(forDuration: 0.5)
scene.runAction(waitAction, completion: {
                  self.onGround = false

            })

显然,您可以尝试确切的持续时间,以确保它能够提供&#34;反弹&#34;足够的时间结束。