如何制作一个不会不加速物体的力SpriteKit Swift
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何制作一个不会不加速物体的力SpriteKit Swift相关的知识,希望对你有一定的参考价值。
所以我想制作一个能够在场景中移动物理对象而不会不断加速它们的力。就像几何破折号一样。因此,当我使用重力时,它就像摔倒,但我不希望它像那样加速。
希望你明白,解释起来有点棘手。谢谢
答案
在SKPhysicsBody术语中,这是force
(经常应用)和impulse
(瞬间应用)之间的区别:
你可以选择施加一种力量或一种冲动:
- 基于在施加力和处理模拟的下一帧之间经过的模拟时间量,施加力一段时间。因此,要对主体应用连续的力,每次处理新帧时都需要进行适当的方法调用。力量通常用于连续效果
- 脉冲使身体的速度瞬间变化,这与已经过的模拟时间量无关。脉冲通常用于立即改变身体的速度。
(摘自Apple documentation of SKPhysicsBody的“让物理身体移动”。)
因此,为了对你的身体施加冲动,从而避免不断加速,请使用方法applyImpulse。
另一答案
在你的游戏场景中,添加一个从jump()
调用的新touchesBegan
方法。使用touchesBegan
和touchesEnded
设置一个在触摸屏幕时跟踪的bool。您可以使用场景的didBegin
方法来跟踪玩家何时落在地面上(或与障碍物碰撞等)。
像这样的东西:
class GameScene: SKScene, SKPhysicsContactDelegate {
var person = SKSpriteNode()
var isJumping = Bool()
var isTouching = Bool()
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
isTouching = true
jump()
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
isTouching = false
}
func jump(){
if isTouching == true {
if isJumping == false {
person.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 600))
isJumping = true
}
}
}
func didBegin(_ contact: SKPhysicsContact) {
let bodyA = contact.bodyA.node
let bodyB = contact.bodyB.node
// Collided with ground
if bodyA?.physicsBody?.categoryBitMask == 2 && bodyB?.physicsBody?.categoryBitMask == 1 {
isJumping = false
jump()
}
}
}
以上是关于如何制作一个不会不加速物体的力SpriteKit Swift的主要内容,如果未能解决你的问题,请参考以下文章