gpt4 book ai didi

java - AndEngine GLES 2 删除没有 java.lang.IndexOutOfBoundsException 的 Sprite

转载 作者:太空狗 更新时间:2023-10-29 14:15:23 26 4
gpt4 key购买 nike

我有一个简单的 TimerHandler,它改变了一些 Sprites(Place extends Sprite)。

我的代码

ArrayList<Place> itemsToVisit = new ArrayList<Place>();

public void Somemethod(){}
TimerHandler effectTimer = new TimerHandler(3f, true, new ITimerCallback() {

@Override
public void onTimePassed(final TimerHandler pTimerHandler) {

delegate.RequestEntity().unregisterUpdateHandler(pTimerHandler);
updateOnEffect = new Handler(Looper.getMainLooper());
updateOnEffect.post(new Runnable() {

@Override
public void run() {

for (Place l : itemsToVisit) {

if (youAreThePlace(l)) {

int indexForChange = itemsToVisit.indexOf(l);
swapPlace(l, indexForChange);
}

}
}
}
});
}
});
delegate.RequestEntity().registerUpdateHandler(effectTimer);
}
public void swapPlace(Place l, int indexForChange) {
((Scene) delegate.RequestEntity().getParent()).unregisterTouchArea(l);
l.detachSelf();

l = createNewPlace(l, false);

itemsToVisit.set(indexForChange, l);
delegate.RequestEntity().attachChild(l);
((Scene) delegate.RequestEntity().getParent()).registerTouchArea(l);
}

有时它在崩溃前工作了 4 次,有时在第一次运行后。

错误

java.lang.IndexOutOfBoundsException: Invalid index 40, size is 40
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
at java.util.ArrayList.get(ArrayList.java:304)
at org.andengine.entity.Entity.onManagedDraw(Entity.java:1635)
at org.andengine.entity.Entity.onDraw(Entity.java:1398)
at org.andengine.entity.Entity.onManagedDraw(Entity.java:1635)
at org.andengine.entity.scene.Scene.onManagedDraw(Scene.java:259)
at org.andengine.entity.Entity.onDraw(Entity.java:1398)
at org.andengine.engine.Engine.onDrawScene(Engine.java:647)
at org.andengine.engine.Engine.onDrawFrame(Engine.java:637)
at org.andengine.opengl.view.EngineRenderer.onDrawFrame(EngineRenderer.java:105)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

我不知道我做错了什么?当我用 activity.runOnUpdateThread((new Runnable() {然后在第一次运行时我得到了关于 Looper.prepare()

的错误
 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.widget.Toast$TN.<init>(Toast.java:322)
at android.widget.Toast.<init>(Toast.java:91)
at android.widget.Toast.makeText(Toast.java:238)
at pl.newaxis.szyfraki.Controller.LetterManager$1$1$1.run(PlaceManager.java:51)
at org.andengine.engine.handler.runnable.RunnableHandler.onUpdate(RunnableHandler.java:42)
at org.andengine.engine.Engine.onUpdateUpdateHandlers(Engine.java:617)
at org.andengine.engine.Engine.onUpdate(Engine.java:605)
at org.andengine.engine.Engine.onTickUpdate(Engine.java:568)
at org.andengine.engine.Engine$UpdateThread.run(Engine.java:858)

你能告诉我我做错了什么吗?


解决

我不得不将 activity.runOnUpdateThread 中的唯一项分离。所以最终 swapPlace 看起来像这样

public void swapPlace(Place l, int indexForChange) {
((Scene) delegate.RequestEntity().getParent()).unregisterTouchArea(l);
activity.runOnUpdateThread(new Runnable() {
@Override
public void run() {
finalL.detachSelf();
}
});

l = createNewPlace(l, false);

itemsToVisit.set(indexForChange, l);
delegate.RequestEntity().attachChild(l);
((Scene) delegate.RequestEntity().getParent()).registerTouchArea(l);
}

最佳答案

这个错误几乎总是因为 Sprite 在 updateThread 之外被移除。当您像这样删除它时,索引不会正确更新,下次 updateThread 尝试刷新内容时 - 缺少某些内容,因此 indexOutofBounds。

查看此问题/答案 java.lang.IndexOutOfBoundsException: Invalid index 13, size is 13有关如何确保删除 updateThread 上的 Sprite 的一些提示。

关于java - AndEngine GLES 2 删除没有 java.lang.IndexOutOfBoundsException 的 Sprite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22698850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com