顺利移动精灵"#34;

时间:2014-08-13 00:03:05

标签: sprite-kit sprite skphysicsbody

我正在尝试使用physicsBody.velocity属性在屏幕上按设定方向移动精灵。然而,动作非常“跳跃”(让游戏看起来像是滞后)。我认为这与每次调用update - 方法之间的不同时间间隔有关。我怎样才能实现更“平稳”的动作?

现在这是我在更新循环中的代码,以使精灵向前推进:

if (_movingForward) {
  CGFloat forwardVel = _ball.physicsBody.velocity.dx;
  forwardVel += 20.0;
  if (forwardVel > bMaxForwardVelocity) {
    forwardVel = bMaxForwardVelocity;
  }
  _ball.physicsBody.velocity = CGVectorMake(forwardVel, _ball.physicsBody.velocity.dy);
}

正如您所看到的,我正在尝试提速,因此它不会立即达到终端速度。这是为了让动作看起来更自然。然而,即使假想精灵以设定的速度行进,滞后也会大大破坏这种效果。

编辑1:

我正在尝试制作一个平台式游戏(如超级马里奥等),当用户点击屏幕时,_ball沿着地面水平移动。将球向右移动的代码包含在编辑上方。地面由多个 tile 组成,每个32x32并且彼此相邻,并且两者之间没有间隙。

根据要求,这是设置_ball物理实体的代码:

self.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:self.size.width/2.0];
self.physicsBody.dynamic = YES;
self.physicsBody.restitution = 0.5f;
self.physicsBody.usesPreciseCollisionDetection = YES;
self.physicsBody.allowsRotation = NO;
self.physicsBody.mass = 0.5f;
self.physicsBody.friction = 0.0f;
self.physicsBody.linearDamping = 0.0f;
self.physicsBody.categoryBitMask = CollisionCategoryBall;

这是每个 tile 的physicsBody的代码:

tile.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:tile.size];
tile.physicsBody.dynamic = NO;
tile.physicsBody.categoryBitMask = CollisionCategoryGround;

物理世界的设置如下:

self.physicsWorld.gravity = CGVectorMake(0, -4);
self.physicsWorld.contactDelegate = self;

谢谢!

编辑2:

这是一个横向滚动游戏,所以“相机”跟随球。这是移动背景图层的代码:

- (void)centerViewOn:(CGPoint)centerOn {
  CGFloat x = Clamp(centerOn.x, (self.size.width / 2.0), (_bgLayer.layerSize.width) - (self.size.width / 2.0));

  _worldNode.position = CGPointMake((int)-x, _worldNode.position.y);
}

Clamp的原因是“相机”不会滚动超出背景范围。这是当球接近水平的开始或结束时。 我将位置转移到int,因为没有它,瓷砖之间有时会出现小间隙。我被告知这是因为某些不准确或其他原因。然而,即使没有将位置转换为int,它仍然是一个“迟钝”。但由于瓷砖之间的差距,它看起来更糟糕。

1 个答案:

答案 0 :(得分:0)

问题在于您的滚动代码。

更改此行:

_worldNode.position = CGPointMake((int)-x, _worldNode.position.y);

_worldNode.position = CGPointMake(-x, _worldNode.position.y);

然后运动如丝般顺滑。

但是你确实得到了这些接缝。你应该在这些瓷砖的位置解决这个问题。您可能会使用浮点值定位_worldNode图块。