2013-06-08 21 views
5

Tôi đã lỗi mà tôi không có ý tưởng về sau:AndEngine GLES2- IndexOutOfBoundsException bên Entity.java line: 1402

06-08 19:59:54.367: E/AndroidRuntime(11629): FATAL EXCEPTION: UpdateThread 
06-08 19:59:54.367: E/AndroidRuntime(11629): java.lang.IndexOutOfBoundsException: Invalid index 11, size is 0 
06-08 19:59:54.367: E/AndroidRuntime(11629): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at java.util.ArrayList.get(ArrayList.java:304) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.entity.Entity.onManagedUpdate(Entity.java:1402) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.entity.scene.Scene.onManagedUpdate(Scene.java:284) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.entity.Entity.onUpdate(Entity.java:1167) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.engine.Engine.onUpdateScene(Engine.java:591) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.engine.Engine.onUpdate(Engine.java:586) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.engine.Engine.onTickUpdate(Engine.java:548) 
06-08 19:59:54.367: E/AndroidRuntime(11629): at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820) 

Tôi tin rằng đó là một cái gì đó liên quan với onManagedUpdate() bên trong một MoveModifier tôi sử dụng bên trong mã của tôi .

Trả lời

7

Điều này hầu như luôn luôn là do tách các thực thể trong chuỗi sai. Kiểm tra ở bất kỳ nơi nào bạn có thể tách các thực thể để phản hồi lại tương tác của người dùng hoặc trong một cuộc gọi lại Modifier và quấn nó trong runOnUpdateThread. Ví dụ:

@Override 
public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) { 
    engine.runOnUpdateThread(new Runnable() { 
     @Override 
     public void run() { 
      widget.detachSelf(); 
     } 
    }); 
} 
+0

Nếu tôi không thể tách nó trênModifierFinished thì tôi có thể tách nó ở đâu khác? Tôi thực sự đang thay đổi scene trênModifierFinished. Bất kỳ ý tưởng? – Nafis

+2

Bạn có thể tách nó trong onModifierFinished miễn là bạn bọc nó trong "runOnUpdateThread" như trong ví dụ của tôi. Điều này hoạt động tốt bởi vì nó không chạy lệnh tách trong luồng hiện tại - thay vào đó nó cho biết "chuỗi cập nhật" để thực hiện nó ngay khi có thể. – simonp

+1

Lý do này sửa chữa mọi thứ là nó cho phép các chủ đề cập nhật để đảm bảo rằng những thay đổi cảnh không xảy ra khi nó đang ở giữa lặp qua cảnh. Nếu bạn thực hiện tách ra bên ngoài luồng cập nhật, thì bạn có nguy cơ làm việc đó trong khi luồng cập nhật lặp qua một mảng chứa thực thể đó và kích hoạt một ArrayIndexOutOfBoundsException - chính xác những gì đã xảy ra với bạn. – simonp