我正在制作像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帧旋转)
有没有办法让它更顺畅地工作,可能会响应较小的加速度计变化来显示不同的动画帧?
答案 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;
}
如果您在创建动画的地方发布了代码,也可以提供帮助,以防万一。
让我知道任何更新。