【问题标题】:AnimatedSprite Within AnimatedSprite onAreaTouch is not getting remove AndengineAnimatedSprite 内的 AnimatedSprite onAreaTouch 没有被移除 Andengine
【发布时间】:2013-04-17 03:35:28
【问题描述】:

我是 Andengine 的新手。我已经检查了关于 stackoverflow 的所有删除精灵问题,但我的情况有点不同。我有两个动画精灵。我正在制作简单的动画错误,它正在移动。当玩家点击虫子时,血液会从中流出。所以我有两个AnimatedSprite,bug和blood。

在虫子精灵的 onAreaTouched 中,我将血精灵附在其中。一切正常,但动画后我没有从其中移除血精灵。

注意:我也检查过 onAnimationEnd 函数

请帮忙!谢谢

final AnimatedSprite bug= new AnimatedSprite(10, 10, 48, 64, this.mBugTextureRegion, this.getVertexBufferObjectManager()){
        @Override
        public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
            
            
            final AnimatedSprite blood= new AnimatedSprite(pSceneTouchEvent.getX(), pSceneTouchEvent.getY(), mBloodTextureRegion, this.getVertexBufferObjectManager());
            

            //removing bug
            scene.detachChild(this);
            
            blood.setScale(2);
            blood.animate(100, false);
            scene.attachChild(blood);
            //blood.dispose();
            //this.dispose();
            //this=null;
            
            
            if(blood.getCurrentTileIndex() == 6){
                runOnUpdateThread(new Runnable() {
                @Override                
                public void run() {
                    //face.dispose();
                    
                    
                    //scene.unregisterTouchArea(blood);
                    scene.detachChild(blood);
                    
                    
                }
               });                
            }
            
            
            
            return true;
        }
    };





 04-16 21:44:10.440: D/AndEngine(6272): FPS: 57.68 (MIN: 9 ms | MAX: 33 ms)
 04-16 21:44:11.361: I/ActivityManager(194): Starting: Intent {     act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.sonyericsson.home/.HomeActivity } from pid 194
 04-16 21:44:11.371: D/AndEngine(6272): PathModifierExample.onPause @(Thread: 'main')
 04-16 21:44:11.391: D/AndEngine(6272): PathModifierExample.onPauseGame @(Thread: 'main')
 04-16 21:44:11.451: I/WindowManager(194): Setting rotation to 0, animFlags=1
 04-16 21:44:11.451: I/ActivityManager(194): Config changed: { scale=1.0 imsi=410/6 loc=en_US touch=3 keys=1/1/2 nav=3/1 orien=1 layout=34 uiMode=17 seq=133 themeResource=null}
 04-16 21:44:11.631: W/IInputConnectionWrapper(6272): showStatusIcon on inactive InputConnection
 04-16 21:44:11.822: I/ActivityManager(194): No longer want com.google.android.gm (pid 2712): hidden #16
 04-16 21:44:11.852: W/SurfaceComposerClient(194): Destroying surface while a transaction is open. Client 0x1954c0: destroying surface 135, mTransactionOpen=1
 04-16 21:44:13.944: D/dalvikvm(194): GC_EXPLICIT freed 246K, 44% free 6159K/10887K, external 5271K/6582K, paused 117ms

【问题讨论】:

    标签: android andengine


    【解决方案1】:

    ==在下面的 cmets 之后编辑== 我认为条件语句

     if(blood.getCurrentTileIndex() == 6){
    

    只会被调用一次,就在加血之后。如果当时血块不在索引 6 上,则永远不会被移除。

    【讨论】:

    • 您好,感谢您回复 Strugeon。我添加了logcat。我说的是血精灵。错误精灵被成功删除。问题在于移除血精灵。
    • 啊,我误会了。你确定那个块被调用了吗? " if(blood.getCurrentTileIndex() == 6){" 也许试试里面的日志看看它是否被调用过。
    • 是的,没有调用条件语句。谢谢斯特鲁金。我已经回答了。你可以查。在 AnimatedSprite 上,我们可以在其动画中应用 detachChild。
    【解决方案2】:

    好的,我明白了。可能对其他人有帮助。

      final AnimatedSprite bug= new AnimatedSprite(10, 10, 48, 64, this.mBugTextureRegion, this.getVertexBufferObjectManager()){
            @Override
            public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
    
    
                final AnimatedSprite blood= new AnimatedSprite(pSceneTouchEvent.getX(), pSceneTouchEvent.getY(), mBloodTextureRegion, this.getVertexBufferObjectManager());
                //final EngineLock engineLock = this.getEngineLock();
                //engineLock.lock();
    
                /* Now it is save to remove the entity! */
                scene.detachChild(this);
    
                scene.attachChild(blood);
                blood.setScale(2);
                blood.animate(100, false , new IAnimationListener (){
    
                    @Override
                    public void onAnimationStarted(
                            AnimatedSprite pAnimatedSprite,
                            int pInitialLoopCount) {
                        // TODO Auto-generated method stub
    
    
                    }
    
                    @Override
                    public void onAnimationFrameChanged(
                            AnimatedSprite pAnimatedSprite, int pOldFrameIndex,
                            int pNewFrameIndex) {
                        // TODO Auto-generated method stub
    
    
                    }
    
                    @Override
                    public void onAnimationLoopFinished(
                            AnimatedSprite pAnimatedSprite,
                            int pRemainingLoopCount, int pInitialLoopCount) {
                        // TODO Auto-generated method stub
    
    
                    }
    
                    @Override
                    public void onAnimationFinished(
                            AnimatedSprite pAnimatedSprite) {
                        // TODO Auto-generated method stub
                        runOnUpdateThread(new Runnable() {
                            @Override
                            public void run() {
                                scene.detachChild(blood);
                            }
                    });
    
    
    
                    }});
    
                return true;
            }
        };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2017-07-30
      相关资源
      最近更新 更多