在SpriteKit中应用脉冲

时间:2015-08-29 20:21:32

标签: swift skaction

我正在制作一个简单的游戏,玩家通过收集硬币来升级。玩家收集的每枚硬币都会将它们进一步移动到关卡中。这是一张图片,可以解释一下:

有两种不同的硬币 - 普通硬币和'特殊'硬币。普通硬币给他们正常的提升。特殊硬币应该给玩家一个临时的额外提升。

在普通硬币组中间总能找到特殊硬币(如图所示)。我的问题是,当用户点击一个特殊的硬币时,它只会给他们一瞬间的提升,因为他们几乎立刻就会立即击中普通硬币。

我尝试了3个不同的选项,但没有一个按照我的计划工作。

选项1 - (问题 - 一个'特殊'明星会给他们一瞬间提升,但是当他们接触到正常的星球时,玩家几乎会立即恢复正常速度)

if starType == .Special {
         player.physicsBody?.velocity = CGVector(dx: player.physicsBody!.velocity.dx, dy: 900.0)
    }
    else {
        player.physicsBody?.velocity = CGVector(dx: player.physicsBody!.velocity.dx, dy: 500.0)
    }

选项2-使用SKAction在触摸特殊星形后延迟3秒,使其不会读取常规星形的任何内容(问题 - 与上述相同)

if starType == .Special {
        let wait = SKAction.waitForDuration(3)
        let boost = SKAction.runBlock({
             player.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 80.0))
        })
        let action = SKAction.group([boost, wait])
          player.runAction(action)

    }
    else {
        player.physicsBody?.velocity = CGVector(dx: player.physicsBody!.velocity.dx, dy: 500.0)
    }

选项3 - 使用脉冲而不是设置新的速度。 (问题 - 每次冲动都会增加到最后一个,让玩家快速超速并在几秒钟内完成关卡)

  if starType == .Special {
         player.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 90.0))
    }
    else {
        player.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 40.0))
    }

任何有关更好实施的建议都会很棒。

由于

1 个答案:

答案 0 :(得分:1)

我建议使用选项3 +检查y速度是否过高,然后减少或不进行增强。

  if starType == .Special  && player.physicsBody?.velocity.dy <= 40 {
//40 is just an example number
         player.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 90.0))
    }
    else {
        player.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 40.0))
    }

您还可以根据当前速度改变脉冲。这一切都取决于你想要的力学,以及最大速度应该是什么。