我的角色的Sprite Node在移动时会发抖,为什么?

时间:2015-01-28 19:46:44

标签: objective-c sprite-kit skspritenode skphysicsbody shake

我的主角,即带有physicsBody的SKSpriteNode,在移动或跳跃时会发抖。

我通过更改character.physicsBody.velocity.dx来移动我的角色(为了模拟加速或减速),我使用applyImpulse让他跳跃。

代码:

移动:

 [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx - 30, self.physicsBody.velocity.dy)];

跳转:

if (!isJumping)
{
    [self.physicsBody applyImpulse:CGVectorMake(0.0f, 6.0f)];
}

此外,我使用我在互联网上找到的方法来更改地图上的摄像头位置,以便跟随角色:

- (void)setViewpointCenter:(CGPoint)position
{
    NSInteger x = MAX(position.x, self.size.width / 2);
    NSInteger y = MAX(position.y, self.size.height / 2);
    x = MIN(x, (self.map.mapSize.width * self.map.tileSize.width) - self.size.width / 2);
    y = MIN(y, (self.map.mapSize.height * self.map.tileSize.height) - self.size.height / 2);

    CGPoint actualPosition = CGPointMake(x, y);
    CGPoint centerOfView = CGPointMake(self.size.width/2, self.size.height/2);
     CGPoint viewPoint = CGPointSubtract(centerOfView, actualPosition);
self.map.position = viewPoint;
}

结果?

Here it is(使用iPhone 5中的QuickTime录制)。你可以很容易地看到这个视频的麻烦以及这是多少让我头晕目眩(以及我刚刚开始开发的游戏)。

事实上,经常(不是每次,有时它都是完美的)像鬼一样,他变得模糊。我什么都不懂,我找不到任何解决办法。

我在模拟器和我的设备上试过这个,效果相同。

如果你愿意,我可以发布更多代码,并且可以告诉你一切,我希望有人能找到我做错的地方!

提前

Thanx!

修改1:

感谢您的评论!

我在屏幕上显示了8个绘图,145个节点并且物理上没有出现任何实际问题!

要将我的角色向左移动,我只需运行:

- (无效)moveToLeft {

    if (isJumping && isOnRightSide)
    {
        [self.physicsBody setVelocity:CGVectorMake(-self.physicsBody.velocity.dx / 2.0, self.physicsBody.velocity.dy)];
    }
    [self setIsOnRightSide:NO];
    [self setIsStopping:NO];
    [self setIsRunning:YES];
    [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx - 30, self.physicsBody.velocity.dy)];
}

在右边:

-(void)moveToRight
{
    if (isJumping && !isOnRightSide)
    {
        [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx / 2.0, self.physicsBody.velocity.dy)];
    }
    [self setIsStopping:NO];
    [self setIsOnRightSide:YES];
    [self setIsRunning:YES];
    [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx + 30, self.physicsBody.velocity.dy)];
}

然后:

if (_isStopping)
{
    if (isOnRightSide)
    {
        int ralentissement = MIN(self.physicsBody.velocity.dx, 10);
        [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx - ralentissement, self.physicsBody.velocity.dy)];
    }
    else
    {
        int ralentissement = MAX(self.physicsBody.velocity.dx, -10);
        [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx - ralentissement, self.physicsBody.velocity.dy)];
    }


    if (abs(self.physicsBody.velocity.dx) < 1)
    {
        isRunning = NO;
        _isStopping = NO;
        if (self.hasActions)
            [self removeAllActions];
        [self.physicsBody setVelocity:CGVectorMake(0, self.physicsBody.velocity.dy)];
    }
}


if (isOnRightSide && isRunning && self.physicsBody.velocity.dx < 150 && !_isStopping)
{
    [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx + 10, self.physicsBody.velocity.dy)];
}
else if (!isOnRightSide && isRunning && self.physicsBody.velocity.dx > -150 && !_isStopping)
{
    [self.physicsBody setVelocity:CGVectorMake(self.physicsBody.velocity.dx - 10, self.physicsBody.velocity.dy)];
}

if (abs(self.physicsBody.velocity.dx) > 150)
{
    if (isOnRightSide)
        [self.physicsBody setVelocity:CGVectorMake(150, self.physicsBody.velocity.dy)];
    else
        [self.physicsBody setVelocity:CGVectorMake(-150, self.physicsBody.velocity.dy)];
}

有没有更好的解决办法,加速和减速不断施加力?

我检查了所有图像,它们都有相同的尺寸!

我关闭了相机功能,确实,停止震动!所以这个功能必须是错误的部分,我在raywenderlich上找到它,我不知道如何替换它。你知不知道怎么 ?谢谢!

编辑2:

所以,我试图将我的相机移动方法调用到didFinishUpdate,而它的效果确实更好!这种晃动的感觉消失了,我现在可以在没有那种糟糕体验的情

但是当角色跳跃时仍然会发生一件事(这是由于applyForce方法完成的):当他上升时,他似乎有时会下降,只是这里或那里有1个像素。它非常特别,我不知道Sprite Kit的真正问题,还是我的纹理太大或其他什么。我试着用物理体绘制动画,实际上有一些垂直震动(更准确地说,蓝色的矩形似乎在闪烁)。

您对最后一期有什么想法吗?

水平运动现在非常完美,谢谢大家的帮助。

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题(也遵循了Ray的教程)。你通过跟随你看起来非常酷的角色来制作相机的动画,但它会引起口吃。世界正朝着一个方向前进,角色朝着相反的方向移动,你得到一个跑步机有点事情,这会导致角色口吃。在Ray的当前着作中他做到了:

override func didSimulatePhysics() {
   let target = getCenterPointWithTarget(player.position)
   worldNode.position += (target - worldNode.position) * 0.1

我确定这与你正在做的非常相似?这使得世界节点不断尝试赶上球员的动作。它给相机带来弹性感。

试着去吧

worldNode.position = getCenterPointWithTarget(player.position)

如果修复它,那么我们会进一步缩小范围。这里的问题是你失去了很酷的相机缓和效果。

问题是我不知道你在哪里改变了球员的动作..我不知道这些只是你打电话的一次方法,或者它们在你的更新中运行循环。

我只想举例说明我在游戏中的表现:

更新中的

    // update ship position
    ship.update(self.delta)

我在didFinishUpdate中移动屏幕,所以我确保这是最后发生的事情。希望这可以阻止任何口吃。

<强> didFinishUpdate

override func didFinishUpdate() {
    // move BG Nodes
    self.moveBGNodes()
}

moveBGNodes方法

func moveBGNodes(){

    // method that calculates camera position (stops camera at screen edges)
    let target = self.pointToCenterViewOn(ship.position)

    // ease gameworld into ship's position
    gameLayer.position += (target - gameLayer.position) * 0.1