我正在研究一个简单的游戏,玩家通过收集硬币来提高等级。玩家收集的每一枚硬币都会使它们在关卡中移动得更远。下面是一张图片,可以更详细地说明这一点:
有两种不同的硬币-普通硬币和“特殊”硬币。普通硬币给他们一个正常的刺激。特殊的硬币会给玩家一个暂时的额外的提升。
特殊硬币总是可以在普通硬币组的中间找到(如图所示)。我的问题是,当一个用户点击一个特殊的硬币,它只给他们一瞬间的推动,因为他们最终击中一个正常的硬币几乎紧接着。
我尝试了三种不同的选择,但没有一种能像我计划的那样工作。
选项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速度是否太高,然后减少或根本不做增强。

  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))
    }

你也可以根据电流速度改变脉冲。这完全取决于你想要力学是什么,以及最大速度应该是多少。

关于swift - 在SpriteKit中施加脉冲,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32290323/

10-10 19:36