在 SpriteKit 中应用脉冲
Applying impulses in SpriteKit
我正在开发一款简单的游戏,玩家通过收集金币升级关卡。玩家收集的每一枚硬币都会使他们在关卡中走得更远。这是一张图片,可以对其进行更多解释:
有两种不同的硬币 - 普通硬币和 'special' 硬币。普通硬币给他们一个正常的提升。特殊硬币应该给玩家一个临时的额外提升。
特殊钱币总能在普通钱币组中间找到(如图)。我的问题是,当用户击中一枚特殊硬币时,它只会给他们带来一瞬间的提升,因为他们最终几乎立即击中了普通硬币。
我已经尝试了 3 种不同的选择,其中 none 按我的计划工作。
选项 1 -(问题 - 'special' 星星会给他们瞬间提升,但当玩家接触到普通星星时几乎立即恢复正常速度)
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))
}
任何关于更好实施的建议都会很棒。
谢谢
我建议使用选项三 + 检查 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))
}
您还可以根据当前速度改变冲量。这完全取决于你想要的机制,以及最大速度应该是多少。
我正在开发一款简单的游戏,玩家通过收集金币升级关卡。玩家收集的每一枚硬币都会使他们在关卡中走得更远。这是一张图片,可以对其进行更多解释:
有两种不同的硬币 - 普通硬币和 'special' 硬币。普通硬币给他们一个正常的提升。特殊硬币应该给玩家一个临时的额外提升。
特殊钱币总能在普通钱币组中间找到(如图)。我的问题是,当用户击中一枚特殊硬币时,它只会给他们带来一瞬间的提升,因为他们最终几乎立即击中了普通硬币。
我已经尝试了 3 种不同的选择,其中 none 按我的计划工作。
选项 1 -(问题 - 'special' 星星会给他们瞬间提升,但当玩家接触到普通星星时几乎立即恢复正常速度)
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))
}
任何关于更好实施的建议都会很棒。
谢谢
我建议使用选项三 + 检查 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))
}
您还可以根据当前速度改变冲量。这完全取决于你想要的机制,以及最大速度应该是多少。