我正在制作一个 Simon 游戏,在这样做时,我创建了一个名为“计算机”的方法,该方法在游戏开始时被激活,之后,每次玩家成功后重复序列。
以下是代码:
private void Computer(){
rounds.setText("Round " + index);
new CountDownTimer(500, 500) {
public void onTick(long millisUntilFinished) {
}
public void onFinish()
{
ResetArray(Player);
//Pushing buttons
Red.setClickable(false);
Blue.setClickable(false);
Green.setClickable(false);
Yellow.setClickable(false);
for (int i = 0; i < index; i++)
{
final Handler handler = new Handler();
final int temp=Game[i];
if (temp == 0)
{
Red.setImageResource(R.drawable.red1);
handler.postDelayed(new Runnable() {
@Override
public void run()
{
StartSound(red);
Red.setImageResource(R.drawable.red);
}
}, 100);
}
if (temp == 1)
{
Green.setImageResource(R.drawable.green1);
handler.postDelayed(new Runnable() {
@Override
public void run() {
StartSound(green);
Green.setImageResource(R.drawable.green);
}
}, 100);
}
if (temp == 2)
{
Blue.setImageResource(R.drawable.blue1);
handler.postDelayed(new Runnable() {
@Override
public void run() {
StartSound(blue);
Blue.setImageResource(R.drawable.blue);
}
}, 100);
}
if (temp == 3)
{
Yellow.setImageResource(R.drawable.yellow1);
handler.postDelayed(new Runnable() {
@Override
public void run() {
StartSound(yellow);
Yellow.setImageResource(R.drawable.yellow);
}
}, 100);
}
}
Red.setClickable(true);
Blue.setClickable(true);
Green.setClickable(true);
Yellow.setClickable(true);
}
}.start();
}
所以基本上,我在这里做的是一个短暂的延迟,500毫秒,然后它开始自我“推”。这是为了在游戏开始/开始新一轮之间创造一些空间。
指数 - 回合数。
游戏 - 一个iv'e创建的数组,其中有50个随机数字表示序列,每一轮我都为索引添加一个。
红色,绿色,蓝色,黄色 - ImageButtons的参考。
处理程序延迟是在按下按钮之间给出一些时间(通过将图像资源切换为相同的颜色但更亮,提供按下按钮的效果)并取消按下它,没有它,改变会如此之快,以至于玩家将无法看到任何图形变化。
基本上我需要一种方法来在每次推送之间停止程序一段时间。我需要一个延迟器,它会在每次开始时延迟循环。倒计时器和处理程序不适合,因为程序在声明和设置之后保持“运行”,唯一的效果是按钮被推到一起但是延迟,这不是我需要的。
现在的结果是按钮似乎被推到了 ,我需要以某种方式分开他们的推送。 我尝试了一切,我找不到任何东西。
谢谢, 谢夫。
答案 0 :(得分:0)
使用Handler
和postDelayed(...)
IS 正是您所需要的,但您接近错误。
基本上你正在做的是几乎立即在你的for
循环中运行,并且在每个循环中你以{100}的延迟调用postDelayed(...)
。
我将进一步解释 - 假设index
为4,并且只需要1毫秒来完成for
循环的每次运行。当循环的4次运行完成后,您将有4次postDelayed
次事件,时间为100ms,99ms,98ms&amp; 96ms - - 所有意图和目的,当它们触发它们时,它们似乎都会立即触发。
使用您的代码解决这个问题的一个简单方法是根据循环计数增加每个延迟...
int delayTime;
for (int i = 0; i < index; i++)
{
delaytime = (i + 1) * 100;
final Handler handler = new Handler();
final int temp=Game[i];
if (temp == 0)
{
Red.setImageResource(R.drawable.red1);
handler.postDelayed(new Runnable() {
@Override
public void run()
{
StartSound(red);
Red.setImageResource(R.drawable.red);
}
}, delayTime); // NOTE USING delayTime AS THE DELAY
}
//
// REPEAT THE ABOVE CODE FOR BLUE, GREEN & YELLOW HANDLER DELAYS
}
换句话说,当i=0
,delayTime
为100毫秒,i=1
时,delayTime
为200毫秒等等
答案 1 :(得分:-1)
可能你想让线程睡眠500毫秒,然后你可以这样做来睡觉你的线程。
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}