首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在SpriteKit中根据加速度计实现播放器动画

如何在SpriteKit中根据加速度计实现播放器动画
EN

Stack Overflow用户
提问于 2014-10-17 19:11:09
回答 1查看 103关注 0票数 0

我正在建立一个跳投游戏一样的MegaJump为基础。我尝试使用以下代码为播放器的左右旋转动画(而不是zRotation)设置动画:

代码语言:javascript
运行
复制
// 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帧创建的)。

有没有办法让它工作得更流畅,也许可以对加速度计的微小变化做出反应,以显示不同的动画帧?

EN

回答 1

Stack Overflow用户

发布于 2014-10-22 18:12:06

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

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

代码语言:javascript
运行
复制
0.6378
0.8041
0.6424

在不到一秒的时间内,取决于你的kAccelerationDeadZone是什么,它可能会导致3个动画几乎同时运行。

您可以尝试两种方法:

1.-在运行动画时创建另一个播放器状态,并忽略加速度计处理程序中对播放器的任何其他更新。这样,动画必须在开始另一个动画之前完成。取决于你运行这3-4帧的速度,它可能看起来好还是不好,例如,当从左到右和后面改变得太快时,你可能会发现你的播放器正在运行_playerAnimationHeadUpRight动画,但却在向左移动……

2.-不要运行基于加速度计数值的动画。取而代之的是基于这些来应用玩家的移动(使用kAccelerationDeadZone),并在你的更新中:方法检查你的玩家的移动,知道它是向左还是向右移动,另外,比默认的60次/秒更少地执行这种检查,每秒检查几次方向变化就足够了。

即:

代码语言:javascript
运行
复制
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;
}

如果你发布了创建动画的代码,也会有所帮助,以防万一。

如果有任何更新请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26423754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档