【问题标题】:How to animate player according to accelerometer in SpriteKit如何根据 SpriteKit 中的加速度计为玩家设置动画
【发布时间】:2014-12-12 23:05:53
【问题描述】:

我正在构建一个基于 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 帧)

有什么方法可以让它更流畅地工作,也许可以响应加速度计的微小变化来显示动画的不同帧?

【问题讨论】:

  • 您所说的“它不会对加速度计变化做出平滑响应”是什么意思。运行动画的时间是否比预期的要长,还是动画不流畅?
  • 在运行纹理动画时,您可以定义每帧显示的持续时间,当您将其绑定到加速度计时,它会运行得很快,或者如果我使用容差,它看起来像是损坏的动画

标签: animation ios7 sprite-kit


【解决方案1】:

根据您的最后一个答案,我怀疑您的问题可能是同一侧的动画运行了多次,因此导致它看起来混乱。

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

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;
}

如果您在创建动画的位置发布代码也会有所帮助,以防万一。

让我知道任何更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多