2013-04-24 76 views
1

我正在適應馬里奧Zechner的開始Android遊戲框架來創建一個幼兒色彩學習應用程序。在測試的最後階段,我發現如果用戶同時按下並釋放兩個不同的按鈕(例如下面屏幕截圖中的'settings'和'home'按鈕),「Colors!已停止」。出現通知。 enter image description here多個水龍頭創建索引超出界限例外

Zechner框架以列表的形式提供輸入處理,然後逐個處理每個輸入。我認爲問題在於代碼的@覆蓋更新區域:

@Override 
public void update(float deltaTime) { 
    world.timer = world.timer + deltaTime; 

    List<TouchEvent> touchEvents = game.getInput().getTouchEvents(); 
    int len = touchEvents.size(); 

    for (int i = 0; i < len; i++) { 
     TouchEvent event = touchEvents.get(i); 

     if (event.type == TouchEvent.TOUCH_UP) { 
      // This is where the guts of my app are 
     } 
    } 
} 

以下是從logcat中顯示異常(我注意到,「無效的指數」將取決於有多少接觸,使用不同,但大小常是0):

04-24 19:27:55.239: E/AndroidRuntime(28002): FATAL EXCEPTION: Thread-555 
04-24 19:27:55.239: E/AndroidRuntime(28002): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 
04-24 19:27:55.239: E/AndroidRuntime(28002): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
04-24 19:27:55.239: E/AndroidRuntime(28002): at java.util.ArrayList.get(ArrayList.java:304) 
04-24 19:27:55.239: E/AndroidRuntime(28002): at com.lilyandrosieshow.colors.GameScreen.update(GameScreen.java:153) 
04-24 19:27:55.239: E/AndroidRuntime(28002): at com.badlogic.androidgames.framework.impl.AndroidFastRenderView.run(AndroidFastRenderView.java:42) 
04-24 19:27:55.239: E/AndroidRuntime(28002): at java.lang.Thread.run(Thread.java:856) 
04-24 19:28:59.301: D/dalvikvm(28002): GC_CONCURRENT freed 482K, 4% free 15473K/16071K, paused 2ms+2ms 
04-24 19:32:55.262: I/Process(28002): Sending signal. PID: 28002 SIG: 9 
04-24 19:32:55.262: E/AndroidRuntime(28002): Handle UnCaght exceptions. KILLING PID: 28002 

我曾嘗試之前添加

if (len != 0) 

for循環,但收到了同樣的結果

感謝您的幫助!

+0

有沒有辦法只使用單一觸摸響應而不管使用哪個版本的Android? – Wayde 2013-04-26 12:04:34

回答

1

「設置」和「主頁」按鈕導致另一個Screen執行,通過諸如game.setScreen(new HomeScreen())的呼叫。在該方法內部,Screen參數的更新時間爲零。如果自變量Screen的更新方法也通過從遊戲的UserInput實例的事件中獲取它們來遍歷觸摸事件,則當前事件列表不再與舊Screen中迭代的那個相同。修復方法是立即從任何呼叫返回setScreen()。無需繼續觸摸處理。

@Override 
public void update(float deltaTime) { 
    world.timer = world.timer + deltaTime; 

    List<TouchEvent> touchEvents = game.getInput().getTouchEvents(); 
    int len = touchEvents.size(); 

    for (int i = 0; i < len; i++) { 
     TouchEvent event = touchEvents.get(i); 

     if (event.type == TouchEvent.TOUCH_UP) { 
      if (touchingHomeButton(event)) { 
       game.setScreen(new HomeScreen()); 
       return; // return immediately 
     } 
    } 
}