如何根据SpriteKit中的加速度计为玩家添加动画效果

时间:2014-10-17 11:11:09

标签: animation ios7 sprite-kit

我正在制作像MegaJump这样的跳投游戏。我尝试使用以下代码为玩家左右旋转动画(不是zRotation)设置动画:

// HANDLE ACCELEROMETER L&R

if(_xAcceleration < -kAccelerationDeadZone && (_currentPlayerHeading == PlayerHeadingUp || _currentPlayerHeading == PlayerHeadingUpRight )){

    _currentPlayerHeading = PlayerHeadingUpLeft;
    [_player runAction:_playerAnimationHeadUpLeft];

}
else if (_xAcceleration > kAccelerationDeadZone && (_currentPlayerHeading == PlayerHeadingUp || _currentPlayerHeading == PlayerHeadingUpLeft )) {

    _currentPlayerHeading = PlayerHeadingUpRight;

    [_player runAction:_playerAnimationHeadUpRight];

}

左右动画中的每一个都是从3-4帧构建的。问题是它不能平稳地响应加速度计的变化,我注意到在MegaJump这样的游戏中,动画非常流畅,好像它对每个加速度计的响应逐帧变化(尽管那里的动画也是创建的)从每侧3-4帧旋转)

有没有办法让它更顺畅地工作,可能会响应较小的加速度计变化来显示不同的动画帧?

1 个答案:

答案 0 :(得分:0)

根据你的上一个回答,我怀疑你的问题可能是同一侧的动画运行了几次,因此导致它看起来搞砸了。

请记住,加速计更新非常敏感,例如您可能会得到:

0.6378
0.8041
0.6424

在几分之一秒内,根据你的kAccelerationDeadZone,它可能导致3个动画几乎同时运行。

您可以尝试两件事:

1.-为其运行动画时创建另一个玩家状态,并忽略加速度计处理程序中对玩家的任何其他更新。这样动画必须在开始另一个之前完成。根据你运行3-4帧的速度,它可能看起来不错,例如当从左到右转换得太快时你可能会发现你的播放器正在运行_playerAnimationHeadUpRight动画但向左移动......

2.-不要根据加速度计值运行动画。相反,只需根据这些动作应用玩家的动作(使用kAccelerationDeadZone),并在更新时:方法检查玩家的动作,以了解它是向左还是向右移动,另外,这个检查频率低于默认的60次/秒,足以每秒检查几次方向变化。

即:

playerTimer += deltaTime;
if (playerTimer >= kPlayerUpdateDelay) {
    if (player.position.x > previousPosition.x) {
        // Moving right
    }else if(player.position.x < previousPosition.x){
        // Moving left
    }
    previousPosition.x = player.position;
}

如果您在创建动画的地方发布了代码,也可以提供帮助,以防万一。

让我知道任何更新。