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

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/

10-11 16:14