Animation Can';t在Andengine中正确设置空闲和运行动画

Animation Can';t在Andengine中正确设置空闲和运行动画,animation,sprite,andengine,Animation,Sprite,Andengine,我试图在我的角色空闲时设置一个动画,在他左右移动时设置另一个动画。现在我的游戏更新中有以下代码: if (!player_self_sprite.isAnimationRunning()) if (isPlayerMoving) player_self_sprite.animate(new long[] { 100, 100, 100, 100}, 10 ,14, true); else player_self_sprite.animate(new

我试图在我的角色空闲时设置一个动画,在他左右移动时设置另一个动画。现在我的游戏更新中有以下代码:

if (!player_self_sprite.isAnimationRunning())
    if (isPlayerMoving)
        player_self_sprite.animate(new long[] { 100, 100, 100, 100}, 10 ,14, true);
    else
        player_self_sprite.animate(new long[] { 100, 100, 100, 100}, 14,18, true);
问题是,直到“运行”动画尚未完成(即使我的播放器已经停止),才会显示“空闲”动画。另一种情况是相同的:我的播放器可以移动,但动画是空闲的,直到它没有完成


在Andengine中,难道没有办法区分两种类型的动画吗?如果我使用“stopAnimation”代码,我可能停止了错误的代码。

经过100次测试,我终于解决了它。诀窍是检测玩家何时从“空闲”过渡到“移动”,并在onUpdate中反之亦然。当发生这种情况时(比较两个布尔值),我停止正在发生的动画,并根据isPlayerMoving布尔值启动另一个动画。摘要代码为:

private boolean wasPlayerMoving = false;
private boolean isPlayerMoving = false;

...

Sprite left = new Sprite(-10, CAMERA_HEIGHT - 160, mLeftTextureRegion) {
    @Override
        public boolean onAreaTouched(TouchEvent pEvent, float pX, float pY) {

            if (!pEvent.isActionOutside() && !isDead && !isPaused) {
                isPlayerMoving = true;
            }

            if (pEvent.isActionUp())  {
                if (isPlayerMoving) {
                    isPlayerMoving = false;
                }
            }
            return true;
        }

  // similar code when pressing Right sprite
  ...

this.mScene.registerUpdateHandler(new IUpdateHandler() {
        public void onUpdate(float pSecondsElapsed) {

         // THE TRICK
         if (wasPlayerMoving!=isPlayerMoving)
                player_self_sprite.stopAnimation();

         if (!isNotJumping && !player_self_sprite.isAnimationRunning())
             if (isPlayerMoving)
                player_self_sprite.animate(...animation when moving..)
             else 
                player_self_sprite.animate(...animation when idle..)
        }

        wasPlayerMoving = isPlayerMoving;
 }

经过100次测试,我终于解决了这个问题。诀窍是检测玩家何时从“空闲”过渡到“移动”,并在onUpdate中反之亦然。当发生这种情况时(比较两个布尔值),我停止正在发生的动画,并根据isPlayerMoving布尔值启动另一个动画。摘要代码为:

private boolean wasPlayerMoving = false;
private boolean isPlayerMoving = false;

...

Sprite left = new Sprite(-10, CAMERA_HEIGHT - 160, mLeftTextureRegion) {
    @Override
        public boolean onAreaTouched(TouchEvent pEvent, float pX, float pY) {

            if (!pEvent.isActionOutside() && !isDead && !isPaused) {
                isPlayerMoving = true;
            }

            if (pEvent.isActionUp())  {
                if (isPlayerMoving) {
                    isPlayerMoving = false;
                }
            }
            return true;
        }

  // similar code when pressing Right sprite
  ...

this.mScene.registerUpdateHandler(new IUpdateHandler() {
        public void onUpdate(float pSecondsElapsed) {

         // THE TRICK
         if (wasPlayerMoving!=isPlayerMoving)
                player_self_sprite.stopAnimation();

         if (!isNotJumping && !player_self_sprite.isAnimationRunning())
             if (isPlayerMoving)
                player_self_sprite.animate(...animation when moving..)
             else 
                player_self_sprite.animate(...animation when idle..)
        }

        wasPlayerMoving = isPlayerMoving;
 }

你能用“停止动画”来描述(或添加代码)吗?从当前代码中,我只能承认,在手动调用“player\u self\u sprite.stopAnimation()”之前,“isAnimationRunning”返回true,因此在此之前无法检查播放器是否正在移动(手动动画停止)。另外,我的建议是停止现有动画,并在您设置“playerMoving”的位置或onUpdate()以外的位置启动新动画。这是因为onUpdate()每秒调用的次数太多。但这只是我的想法,我试过用那种方法。问题是,我可以在播放器开始移动(左右)时设置新动画,但我无法在播放器停止移动时使用用户输入进行检测(这就是我将其移动到onUpdate方法的原因)。您可以将代码粘贴到读取用户输入并开始移动的位置吗?我认为这将有助于给出更准确的解决方案。在这之前,我将只描述这个想法:我认为你必须跟踪单位位置的变化。当单元位置变为永久时,您可以停止动画(但遗憾的是,您没有可能检测到“关键点释放”),我可以检测到“关键点释放”,并在发生这种情况时设置空闲动画。问题是当我来自“跳跃”动画时。你能用“停止动画”来描述(或添加代码)吗?从当前代码中,我只能承认,在手动调用“player\u self\u sprite.stopAnimation()”之前,“isAnimationRunning”返回true,因此在此之前无法检查播放器是否正在移动(手动动画停止)。另外,我的建议是停止现有动画,并在您设置“playerMoving”的位置或onUpdate()以外的位置启动新动画。这是因为onUpdate()每秒调用的次数太多。但这只是我的想法,我试过用那种方法。问题是,我可以在播放器开始移动(左右)时设置新动画,但我无法在播放器停止移动时使用用户输入进行检测(这就是我将其移动到onUpdate方法的原因)。您可以将代码粘贴到读取用户输入并开始移动的位置吗?我认为这将有助于给出更准确的解决方案。在这之前,我将只描述这个想法:我认为你必须跟踪单位位置的变化。当单元位置变为永久时,您可以停止动画(但遗憾的是,您没有可能检测到“关键点释放”),我可以检测到“关键点释放”,并在发生这种情况时设置空闲动画。问题是当我来自“跳跃”动画时。嗨,芭芭拉。对于复杂的依赖状态的行为,你可以(例如)使用“状态机”模式(你可以在谷歌上找到大量信息)。它将帮助你建立一个更好的结构,更容易调试。嗨,芭芭拉。对于复杂的依赖状态的行为,你可以(例如)使用“状态机”模式(你可以在谷歌上找到大量信息)。它将帮助您构建更易于调试的更好的结构。