Проблема с потоками Handler; java
Пишу змейку. Хочу чтобы яблоко генерировалось с условием, если за 5 секунд змейка его не успела съесть.
private Handler handler;
private Runnable r ;
r=new Runnable() {
@Override
public void run() {
//handler.postDelayed(this,1000);
invalidate();
}
};
Вот часть кода с отрисовкой Все должно было быть устроено таким способом, что при условии, что яблоко не было съедено, идет счетчик шагов handler и при прошествии 5 шагов должно спавнится яблоко (и так через каждые 5 шагов).
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
canvas.drawColor(0xFF1B007C);
for (int i = 0; i < arrGrass.size(); i++) {
canvas.drawBitmap(arrGrass.get(i).getBm(), arrGrass.get(i).getX(), arrGrass.get(i).getY(), null);
}
snake.update();
snake.draw(canvas);
apple.draw(canvas);
if (snake.getArrPartSnake().get(0).getrBody().intersect(apple.getR())) {
randomApple();
apple.reset(arrGrass.get(randomApple()[0]).getX(), arrGrass.get(randomApple()[1]).getY());
snake.addPart();
Log.d("start", "Яблоко скушано");//Проверка
} else {
int i = 0;
while (true) {
if (handler.postDelayed(r, 100)) {
i++;
Log.d("start", "Счет передвижений змейки");//Проверка
if (i % 5 == 0) {
apple.reset(arrGrass.get(randomApple()[0]).getX(), arrGrass.get(randomApple()[1]).getY());
Log.d("start", "Рандом яблока");//Проверка
break;
}
}
}
}
handler.postDelayed(r, 100);
}
В итоге программа заставляет змейку статично увеличивать свою скорость, а яблоко генерится со скоростью движения змейки.
Заранее спасибо за ответ.
Ответы (1 шт):
Автор решения: Наташа Карбан
→ Ссылка
Решение было найдено! благодаря System.currentTimeMillis()
public long start = System.currentTimeMillis();
@Override
public void draw(Canvas canvas){
super.draw(canvas);
timer = new Timer();
canvas.drawColor(0xFF1B007C);
for (int i=0; i<arrGrass.size();i++){
canvas.drawBitmap(arrGrass.get(i).getBm(),arrGrass.get(i).getX(),arrGrass.get(i).getY(), null);
}
snake.update();
snake.draw(canvas);
apple.draw(canvas);
if(snake.getArrPartSnake().get(0).getrBody().intersect(apple.getR())){
randomApple();
this.valueApple++;
apple.reset(arrGrass.get(randomApple()[0]).getX(),arrGrass.get(randomApple()[1]).getY());
main.appleValue.setText(Integer.toString(this.valueApple));
snake.addPart();
Log.d("start", "Яблоко скушано");
this.start= System.currentTimeMillis();//начало подсчета
}else{
long finish = System.currentTimeMillis();//конец подсчета
if(finish-this.start>=5000){
apple.reset(arrGrass.get(randomApple()[0]).getX(),arrGrass.get(randomApple()[1]).getY());
Log.d("start", "Рандом яблока");
this.start= System.currentTimeMillis();//возобновление подсчета
}
}
handler.postDelayed(r,100);