第一次击球太快

拉米·阿尔·祖瓦里(Ramy Al Zuhouri)

我有一个代表炮弹的精灵,我用这种方法射击:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章