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