编码"西蒙"对于Android;很难暂停代码

时间:2015-05-29 06:45:51

标签: java android handlers

我正在对游戏进行编码" Simon"以及我在如何使用runnables和处理程序方面遇到了一些麻烦。这是游戏的一部分,在玩家必须按下按钮之前,颜色以序列模式点亮。

这是我到目前为止的代码:

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);   
    }
}

按钮全部同时点亮,因为,我猜,它们全部一个接一个地放在&#34;消息序列中#34;?我如何使用runnables / handle分隔灯光?

非常感谢你们!

2 个答案:

答案 0 :(得分:1)

所有按钮同时亮起的原因是因为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]);的参数是什么意思/是我的方式,我上面添加的代码如下:

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

答案 1 :(得分:0)

我通过为每个未点亮的颜色和每个点亮的颜色创建一个runnable来实现它,所以我总共有8个runnables和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));   
    }
}