我有一个代表炮弹的精灵,我用这种方法射击:
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)
}
Ball是质量为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()方法可能在touchesBegan内部被称为)。
另外从与applyForce
方法有关的文档中:
加速度应用于单个模拟步骤(一帧)。
关于超快球问题...我有一个理论,但是不能肯定发生了什么,特别是因为您没有像它的意思那样使用applyForce,我认为这是主要问题。
因此,这里是理论:
每个帧之间的时间差异可能会有所不同,尤其是在您启动应用程序且首次加载内容时,并且由于力乘以该时间差异,您会得到怪异的结果。
另一方面,applyImpulse
:非常适合您的情况。投篮是一个瞬时动作,并且applyImpulse
不依赖于类似的模拟时间applyForce
(请参阅我发表的文档中的引用)。
解决方案:
使用applyImpulse
拍摄一球。这是批准的方式。如果您想使用来移动球applyForce
,请通过每帧中的update方法进行操作。
在开始实际游戏之前,还应考虑资源预加载(预加载声音,发射器,纹理),这将使您免于游戏开始时的fps下降。
希望这可以帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句