我创造了许多球精灵,在屏幕周围弹跳随机。当我碰触球的时候,我想把球从现场移开。(如果一个以上的球占据相同的空间,那么这个空间现在也会被移除)。
我意识到scene.detachChild必须在runOnUpdateThread上运行,所以在我的Ball sprite子类中,我通过重写onAreaTouched进行触控:
@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中分离精灵有关)。
**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?,或者是否应该以某种方式将删除操作带回到主活动中(首先我需要一个子类)?如果我包含,
谢谢你的帮助。
发布于 2012-02-20 10:18:23
永远不要在TouchListener中进行删除。你应该坚持使用IUpdateHandler。
1.)没有必要对子类进行子类,您可以在可以访问场景的任何地方执行删除操作。
2.)之所以会发生IndexOutOfBoundException,是因为您在TouchListener中执行删除操作。当你移除雪碧时,可能有一些方法会给场景添加新的东西。将删除放在UpdateHandler中可以解决这一问题。
发布于 2014-02-13 11:31:47
/*
* 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);
}
});https://stackoverflow.com/questions/9351744
复制相似问题