实现游戏对象的特定跳跃行为

Achieving specific jumping behavior of a game object

我正在尝试创建类似 Doodle Jump 的东西来练习。

对于那些不了解游戏的人;你有一个玩家可以跳到随机位置的砖块上,如果它们在他上方则不会与它们发生碰撞,并且只要他落在它们上面就会跳起来。

我无法实现原始 Doodle 跳线的跳跃行为,如下所述。

我已将玩家和砖块的碰撞位掩码设置为 none。每当玩家落在砖块上时(当 'didBeginContact' 被触发时玩家在砖块上方)我对玩家施加一个冲量,但是因为不止一次检测到碰撞,所以冲量真的很大而且玩家跳得很高(我希望他的速度有限)。

我试过这个(当检测到碰撞时调用这个函数):

func playerCollidedWithBrick(brick: Brick) {
    if player.position.y > brick.position.y && brick.physicsBody?.velocity.dy <= 0 {
        //the player is above the brick and is falling
        player.physicsBody?.applyImpulse(CGVectorMake(0, 20))
    }
}

但是除了他先跳下的那块之外,玩家不会跳下其他砖块 - 这不是我想要的。

我希望他能以有限的速度从落地的任何砖块上跳下来。我也喜欢对他施加冲动的效果 - 有点像他落在砖块上时的 spring 效果。

我怎样才能做到这一点?任何想法或建议表示赞赏。

你为什么不在你的积木 class 中放置一个自定义 属性 来指定玩家是否已经击中了那块积木

var playerHitBrick: Bool = false

func playerCollidedWithBrick(brick: Brick) {
    if player.position.y > brick.position.y && brick.physicsBody?.velocity.dy <= 0 && !brick.playerHitBrick {
        //the player is above the brick and is falling
        brick.playerHitBrick = true
        brick.runAction(SKAction.waitForDuration(1.0), completion: { brick.playerHitBrick = false })
        player.physicsBody?.applyImpulse(CGVectorMake(0, 20))
    }
}

这样它会在玩家第一次击中砖块时触发,但不会计算玩家离开砖块时的后续击中