首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Andengine安全地删除sprite

使用Andengine安全地删除sprite
EN

Stack Overflow用户
提问于 2012-02-19 18:08:09
回答 2查看 4.8K关注 0票数 3

我创造了许多球精灵,在屏幕周围弹跳随机。当我碰触球的时候,我想把球从现场移开。(如果一个以上的球占据相同的空间,那么这个空间现在也会被移除)。

我意识到scene.detachChild必须在runOnUpdateThread上运行,所以在我的Ball sprite子类中,我通过重写onAreaTouched进行触控:

代码语言:javascript
复制
        @Override
    public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY)
    {
        ((BaseGameActivity) thisAct).runOnUpdateThread(new Runnable() {
            @Override
            public void run() {
                /* Now it is save to remove the entity! */


                    //scene.unregisterTouchArea(Ball.this);
                    scene.detachChild(Ball.this);

            }
        });
        return false;
    }

我必须将主要活动传递给球精灵的构造者,然后将球从主要活动场景中移除。

如果我取消对scene.unregisterTouchArea(Ball.this)行的注释,以停止对触摸的操作(这不影响移除,但认为最好停止处理触摸),我将收到Ball.this(我认为这与不从runOnUpdateThread中分离精灵有关)。

代码语言:javascript
复制
**java.lang.IndexOutOfBoundsException: Invalid index 90, size is 90
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
at java.util.ArrayList.get(ArrayList.java:311)
at org.anddev.andengine.entity.scene.Scene.onSceneTouchEvent(Scene.java:320)**

两个问题:

我是否正确地处理了删除球子类中的sprite,使用了重写unregisterTouchArea?,或者是否应该以某种方式将删除操作带回到主活动中(首先我需要一个子类)?如果我包含,

  1. 知道为什么要得到IndexOutOfBoundsException吗?

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2012-02-20 10:18:23

永远不要在TouchListener中进行删除。你应该坚持使用IUpdateHandler

1.)没有必要对子类进行子类,您可以在可以访问场景的任何地方执行删除操作。

2.)之所以会发生IndexOutOfBoundException,是因为您在TouchListener中执行删除操作。当你移除雪碧时,可能有一些方法会给场景添加新的东西。将删除放在UpdateHandler中可以解决这一问题。

票数 3
EN

Stack Overflow用户

发布于 2014-02-13 11:31:47

代码语言:javascript
复制
/*
         * Removing entities can only be done safely on the UpdateThread. Doing
         * it while updating/drawing can cause an exception with a suddenly
         * missing entity. Alternatively, there is a possibility to run the
         * TouchEvents on the UpdateThread by default, by doing:
         * engineOptions.getTouchOptions().setRunOnUpdateThread(true); when
         * creating the Engine in onLoadEngine();
         */
        MainActivity.this.runOnUpdateThread(new Runnable() {
            @Override
            public void run() {
                /* Now it is safe to remove the entity! */
                mScene.detachChild(face);
            }
        });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9351744

复制
相关文章

相似问题

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