【问题标题】:Applying impulses in SpriteKit在 SpriteKit 中应用脉冲
【发布时间】:2015-08-30 10:46:43
【问题描述】:

我正在开发一个简单的游戏,玩家通过收集硬币来提升关卡。玩家收集的每个硬币都会使它们在关卡中进一步移动。这是一张图片,可以更详细地解释它:

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

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

我尝试了 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))
    }

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

谢谢

【问题讨论】:

  • 使用选项 3,但要确保它们在 y 方向的速度不会太高。如果它太高,不要施加冲动,或施加较少的冲动。
  • @Kendel,非常感谢。这样可行!如此简单的解决方案!
  • 没问题,我会抛出一个答案来帮助人们。

标签: swift skaction


【解决方案1】:

我建议使用选项三+检查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))
    }

您还可以根据当前速度更改冲量。这完全取决于您想要的机制,以及最大速度应该是多少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多