Swift SpriteKit双跳问题仅在部分时间有效

Swift SpriteKit双跳问题仅在部分时间有效,swift,sprite-kit,Swift,Sprite Kit,代码: func jumpAction(JumpPos:CGPoint,uuClickpos:CGPoint){ 如果跳线计数小于2{ 变量距离=(单击位置y-跳位置y) var distx=单击位置x self.physicsBody?.velocity=CGVector(dx:0,dy:0) self.physicsBody?.applyImpulse(CGVector(dx:distx,dy:disty)) 如果onGround==false{ 跳线计数+=1 } } }// func D

代码:

func jumpAction(JumpPos:CGPoint,uuClickpos:CGPoint){
如果跳线计数小于2{
变量距离=(单击位置y-跳位置y)
var distx=单击位置x
self.physicsBody?.velocity=CGVector(dx:0,dy:0)
self.physicsBody?.applyImpulse(CGVector(dx:distx,dy:disty))
如果onGround==false{
跳线计数+=1
}
}
}//
func DIDBENGIN(uu其他:SKSpriteNode,u联系人:SKPHYSICCONTACT){
如果触点.contactPoint.y
我有3个以上的功能。当我按下屏幕上的跳转按钮时,将调用跳转操作。当播放机与平台顶部发生接触时,调用DIDBENG和didEnd函数

我的问题:

所以,如果玩家在平台上,我跳转,跳转动作在didEnd函数之前被调用。这就是为什么当玩家接触平台时,我将jumpCount设置为1。这个很好用

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

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

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

这就是我来这里的原因。我希望即使有我前面解释过的轻微弹跳,我也能跳两下

提前谢谢你

其他信息:
我使用onGround标志,这样,如果球员在地面上,如果他们在正确的位置按下跳转按钮,他可以沿着地面滑动…

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

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
}

显然,您可以尝试精确的持续时间,以确保“反弹”刚好有足够的时间结束

确切地说,“dined函数”是什么?DidEnd函数?当玩家对象与平台失去接触时调用。明白了。您可能需要编辑您的问题-“在进餐函数之前被调用”哦,我的糟糕。是的,我刚刚修复了它。您不想在didEnd阶段设置您的
onGround=false
。当distY>0时,您希望在加速时立即设置它,因此基本上
if(distY>0){onGround=false}
。注意,这与onGround=(distY>0
)不同,因为这意味着他在地面上,而他可能不会接受建议。这将消除这个问题。但我更希望球员能尽快跳起。如果这似乎合适,我可以更新这个问题?我不认为这会影响他第二次跳转的能力,因为当第二次跳转被称为跳转时,onGround还没有被设置为false(它在几分之一秒后被设置)。这不是你要解决的问题吗?再一次,你可能想调整我在这里硬编码的半秒,但我很确定这会给你你想要的确切行为。哦,我明白你的意思。我误解了代码。它可以工作,但会导致跳转问题。如果持续时间太长,您可以在它注册跳转之前跳转多次。若它太短,有时我只能跳一次而不是两次。这是一个好主意,但我不确定它是否适用于我的情况。你真的应该使用SKActions.wait(forDuration:…)而不是SpriteKit游戏中的DispatchQueue。它像一个符咒一样工作,延迟0.1秒。谢谢大家的帮助!
let waitAction = SKAction.wait(forDuration: 0.5)
scene.runAction(waitAction, completion: {
                  self.onGround = false

            })