为 Android 编码 "Simon";很难暂停代码

Coding "Simon" for Android; Difficult to pause code

我正在编写游戏 "Simon",但我在弄清楚如何使用可运行对象和处理程序时遇到了一些问题。这是针对游戏的一部分,在玩家必须按下按钮之前,颜色会按顺序模式亮起。

这是我目前的代码:

Handler handler = new Handler();
Runnable g = new Runnable() {
    @Override
    public void run() {
        setBtnBackGround(oldColors[0], 10, mButtons[0]);
    }
};
Runnable r = new Runnable() {
    @Override
    public void run() {
        setBtnBackGround(oldColors[1], 10, mButtons[1]);
    }
};
Runnable y = new Runnable() {
    @Override
    public void run() {
        setBtnBackGround(oldColors[2], 10, mButtons[2]);
    }
};
Runnable b = new Runnable() {
    @Override
    public void run() {
        setBtnBackGround(oldColors[3], 10, mButtons[3]);
    }
};

另外:

for (int i = 0; i < mGame.getLevel(); i++) {
    int color = colors.get(i);
    setBtnBackGround(newColors[color], 10, mButtons[color]);
    if (color == 0) {
        handler.postDelayed(g, 1000);
    } else if (color == 1) {
        handler.postDelayed(r, 1000);
    } else if (color == 2) {
        handler.postDelayed(b, 1000);
    } else {
        handler.postDelayed(y, 1000);   
    }
}

所有按钮同时亮起,因为,我猜,它们都一个接一个地放在 "message sequence"?我如何使用 runnables/handles 来 space 分开灯?

非常感谢你们!

所有按钮同时亮起的原因是因为您 for 循环遍历了 i 的所有值,中间根本没有等待。

所以它有效地调用了

//start loop
//i = 0
handler.postDelayed(g, 1000);
...
//i = 1
handler.postDelayed(r, 1000);
...
//i = mGame.getLevel()-1
handler.postDelayed(b, 1000);
//end loop

同时进行。

本身没有队列,因此您需要根据您所在的 i 增加延迟来自行安排。试试这个:

int LIGHT_DURATION = 1000;

for (int i = 0; i < mGame.getLevel(); i++) {
    int color = colors.get(i);
    int delay = LIGHT_DURATION*i;
    setBtnBackGround(newColors[color], 10, mButtons[color]);
    if (color == 0) {
        handler.postDelayed(g, delay);
    } else if (color == 1) {
        handler.postDelayed(r, delay);
    } else if (color == 2) {
        handler.postDelayed(b, delay);
    } else {
        handler.postDelayed(y, delay);   
    }
}

我不确定 setBtnBackGround(newColors[color], 10, mButtons[color]); mean/are 的参数是什么,但是我使用上面添加的代码的方式如下:

  1. 使用上述 for 循环添加所有延迟处理程序,传递颜色
  2. 在每个处理程序中,将所有按钮设置回默认值,并将所选颜色按钮设置为正确的颜色

我通过为每种未亮起的颜色和每种亮起的颜色创建一个可运行对象来使其工作,因此我总共有 8 个可运行对象和 1 个处理程序。然后,正如 roarster 所建议的,我根据迭代创建了一个延迟,如下所示:

for (int i = 0; i < mGame.getLevel(); i++) {
    int color = colors.get(i);


    if (color == 0) {
        handler.postDelayed(newG, (long) ((0.1+i)*1000));
        handler.postDelayed(oldG, (long) ((0.9+i)*1000));
    } else if (color == 1) {
        handler.postDelayed(newR, (long) ((0.1+i)*1000));
        handler.postDelayed(oldR, (long) ((0.9+i)*1000));
    } else if (color == 2) {
        handler.postDelayed(newY, (long) ((0.1+i)*1000));
        handler.postDelayed(oldY, (long) ((0.9+i)*1000));
    } else {
        handler.postDelayed(newB, (long) ((0.1+i)*1000));
        handler.postDelayed(oldB, (long) ((0.9+i)*1000));   
    }
}