1

我正在改编 Mario Zechner 的Beginning Android Games框架来创建一个幼儿颜色学习应用程序。在测试的最后阶段,我发现如果用户同时按下和释放两个不同的按钮(例如下面屏幕截图中的“设置”和“主页”按钮),“颜色!”已停止。出现通知。在此处输入图像描述

Zechner 的框架以列表的形式提供对输入的处理,然后单独处理每个输入。我相信问题在于代码的@Override 更新区域:

@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 循环之前但收到相同的结果

感谢您的任何帮助!

4

1 回答 1

1

“设置”和“主页”按钮通向另一个Screen实现,例如game.setScreen(new HomeScreen()). 在该方法中,Screen参数更新为增量时间为零。如果参数Screen的 update 方法还通过从游戏实例的事件中获取触摸事件来迭代它们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
        }
    }
}
于 2013-10-23T00:49:38.040 回答