我在将精灵套件游戏与物理暂停时遇到了问题。游戏中包含一个在SpriteScene中移动的球,并具有以下参数:
self.ball.physicsBody.friction = 0;
self.ball.physicsBody.linearDamping = 0;
self.ball.physicsBody.restitution = 1.0f;
self.ball.physicsBody.affectedByGravity = NO;
self.ball.physicsBody.usesPreciseCollisionDetection = YES;
问题在于,当我暂停游戏时,我称这些方法为:
self.scene.physicsWorld.speed = 0;
self.ball_velocity = self.ball.physicsBody.velocity;
self.ball.physicsBody.velocity = CGVectorMake(0, 0);
self.ball.speed = 0;
self.ball.physicsBody.dynamic = NO;
[self.scene.view setPaused:YES];
当恢复时,请拨打以下电话:
self.scene.physicsWorld.speed = 1;
self.ball.physicsBody.velocity = self.ball_velocity;
self.ball.physicsBody.dynamic = YES;
self.ball.speed = 1;
[self.scene.view setPaused:NO];
这会停止球动画,但是当恢复时,球的位置会发生变化,看起来在暂停期间是否正在移动。
顺便说一句,它在iOS 8上运行良好,但在iOS 9上它总是失败。有什么建议吗?!!
答案 0 :(得分:2)
聊天之后,我们得出结论,在iOS8和iOS9之间,Apple做了一个改变,暂停现场暂停更新循环。由于更新循环正在暂停,因此未正确计算时间变化。现在发生的是,时间的变化将是未到期的时间 - 暂停时的时间,模拟滞后状态。速度将使数学生效,并根据时间差异移动对象。要解决此问题,只需创建一个包含所有场景对象的父节点,然后暂停父节点。这将允许仍然调用更新,从而允许时间的变化与帧速率保持一致。