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

Posted

技术标签:

【中文标题】双跳的 SpriteKit 问题仅在某些时候有效【英文标题】:SpriteKit Issue with Double Jump only working some of the time 【发布时间】:2017-04-18 21:57:32 【问题描述】:

代码:

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 个函数。当我按下屏幕上的 Jump 按钮时会调用 JumpAction。 didBegin 和 didEnd 函数在玩家与平台顶部发生接触时被调用。

我的问题:

所以如果玩家在平台上并且我跳跃,跳跃动作会在 didEnd 函数之前调用。这就是为什么当玩家联系平台时我将 jumpCount 设置为 1。这工作正常...

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

发生这种情况时,onGround 标志在调用跳转动作之前被翻转为 false,并且我的玩家只能单跳。

我正在尝试找到一种简单的方法来解决这个问题,而无需实现一堆代码,但还没有找到方法。

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

提前谢谢你!!!

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

【问题讨论】:

究竟什么是“dined 函数”? DidEnd 函数?当玩家对象与平台失去联系时调用它。 知道了。您可能想编辑您的问题 - “在 dined 函数之前调用” 哦,我的错。是的,我刚刚修好了。 你不想在你的 didEnd 阶段设置你的onGround = false。当你的 distY > 0 时,你想在加速时立即设置它,所以基本上是if(distY &gt; 0) onGround = false。请注意,这与onGround = (distY &gt; 0) 不同,因为这意味着他在地上,而他可能不在 【参考方案1】:

您是否尝试过将“地面”标志的设置延迟几分之一秒?

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

            )

显然,您可以试验确切的持续时间,以确保它为“反弹”提供了足够的时间来结束。

【讨论】:

感谢您的建议。这将消除这个问题。但如果玩家能够尽快跳跃,我会更喜欢它。如果这看起来合适,我可以更新问题? 我认为这不会影响他第二次跳跃的能力,因为当第二次调用 jump 时,onGround 尚未设置为 false(它被设置为几分之一秒之后)。这不正是您要解决的问题吗?同样,您可能想要调整我在这里硬编码的半秒,但我很确定这会给您提供您正在寻找的确切行为。 哦,我明白你的意思了。我误解了代码。它有效,但随后会导致跳跃问题。如果持续时间太长,您可以在它注册跳转之前跳转多次。如果太短,有时我只能跳 1 次而不是 2 次。这是个好主意,但我不确定它是否适合我的情况。 你真的应该在 SpriteKit 游戏中使用 SKActions.wait(forDuration: ... ) 而不是 DispatchQueue。 像魅力一样工作,延迟为 0.1 秒。感谢大家的帮助!

以上是关于双跳的 SpriteKit 问题仅在某些时候有效的主要内容,如果未能解决你的问题,请参考以下文章

Instagram 公共 API (/?__a=1) 有效,但仅在某些时候有效

Angular6:点击功能仅在某些时候有效

低 SpriteKit FPS 会导致碰撞丢失?

为啥 glreadpixels 仅在某些情况下有效?

SpriteKit 应用程序仅在任务切换器中显示灰色/白色边框

SpriteKit 目标 c 节点仅在 x 轴上移动