我有一个代表炮弹的精灵,我用这种方法射击:
func shoot() {
let ball = Ball(radius: 8.0)
ball.position = CGPointMake(size.width / 2.0, 72.0)
self.addChild(ball)
// Explosion is just a simple particle system
let explosion = Explosion()
explosion.position = CGPointMake(size.width / 2.0, 64.0)
self.addChild(explosion)
let force = CGVectorMake(0.0, 20000.0)
ball.physicsBody!.applyForce(force)
}
球是质量为1.0的物体,其创建方式如下:
init(radius: CGFloat) {
super.init()
let path = UIBezierPath(arcCenter: CGPointZero, radius: radius, startAngle: 0.0, endAngle: 2.0 * PI, clockwise: false)
self.path = path.CGPath
self.strokeColor = SKColor.blackColor()
self.fillColor = SKColor.blackColor()
self.name = "Ball \(self)"
let body = SKPhysicsBody(circleOfRadius: radius)
body.dynamic = true
body.categoryBitMask = BallCategory
body.contactTestBitMask = EnemyCategory
body.collisionBitMask = EnemyCategory
body.mass = 1.0
body.affectedByGravity = false
physicsBody = body
}
问题是,我第一次(也是唯一一次)击球时,它的速度太快了。其他时候他们的速度都不一样,为什么?
最佳答案
看起来您使用applyForce的方式不对。从文档中:
力的作用时间长度取决于
从应用力到
将处理模拟的下一帧。因此,要应用
连续力对一个物体,你需要做出适当的方法
每次处理新帧时调用。力通常用于
连续效应
意味着您必须在applyForce:
:方法内调用update
。从代码中可以看出,您没有这样做(shoot()方法可能在touchebegan内部调用)。
同样来自applyForce
方法相关的文档:
加速度应用于一个模拟步骤(一帧)。
关于超快速球的问题…我有一个理论,但不能肯定到底发生了什么,特别是因为你没有使用它的意思,我认为这是主要的问题。
所以,理论是这样的:
每帧之间的时间差可能会有所不同,特别是当你启动一个应用程序时,事情是第一次加载,因为力乘以时间差,你会得到奇怪的结果。
另一方面,applyImpulse
:非常适合您的情况。射门是一种即时动作,而applyImpulse
并不依赖于模拟时间,比如applyForce
(参见我发布的文档中的引用)。
解决方案:
使用applyImpulse
来击球。这是被批准的方式。如果你想用applyForce
移动一个球,在每一帧中通过update方法来移动。
另外,在开始一个实际的游戏之前,还要考虑资源预加载(预加载声音、发射器、纹理),这将在游戏开始时从fps drops中为您节省资源。
希望这有帮助!
关于swift - 第一次球射得太快了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32683867/