2015-05-29 2 views
2

Я кодирую игру «Саймон», и у меня возникли проблемы с выяснением того, как использовать runnables и обработчики. Это для той части игры, где цвета загораются в шаблоне последовательности, прямо перед тем, как игрок должен нажать кнопки.Кодирование «Simon» для Android; Трудно приостановить код

Это код, который я до сих пор:

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

Кнопки все легкие в то же самое время, так как, я думаю, все они размещены один после другого в «последовательности сообщений»? Как я могу использовать runnables/handles для разнесения разметки?

Большое спасибо, ребята!

ответ

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. Добавить все запаздывающие обработчики с выше циклом, проходя цвет
  2. в каждом обработчике установить все кнопки назад по умолчанию и выбранный цвет кнопка на правильный цвет
0

Я получил его на работу по креатинфосфату g запускается для каждого цвета без подсветки и каждого освещенного цвета, поэтому у меня было всего 8 runnables с 1 обработчиком. Затем, как предложил реже, я создал задержку, основанную на итерации, например:

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)); 
    } 
} 
Смежные вопросы