我正在尝试使用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,它仍然是一个“迟钝”。但由于瓷砖之间的差距,它看起来更糟糕。
答案 0 :(得分:0)
问题在于您的滚动代码。
更改此行:
_worldNode.position = CGPointMake((int)-x, _worldNode.position.y);
到
_worldNode.position = CGPointMake(-x, _worldNode.position.y);
然后运动如丝般顺滑。
但是你确实得到了这些接缝。你应该在这些瓷砖的位置解决这个问题。您可能会使用浮点值定位_worldNode
图块。