我正在对游戏进行编码" 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分隔灯光?
非常感谢你们!
答案 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 :(得分: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));
}
}