TimerHandler в спрайтах нереста андегина с интервалом - PullRequest
3 голосов
/ 15 января 2012

Я использую этот TimerHandler в andEngine для порождения спрайтов в определенные моменты времени.

  mScene.registerUpdateHandler(new TimerHandler(0.02f, true, new ITimerCallback() {
                   @Override
                   public void onTimePassed(TimerHandler pTimerHandler) {
                          addSpriteTime1 += 2; // because timer update = 0.02 seconds
                           if (addSpriteTime1 == nextSprite1Time) {
                                  addFace();
                                   addSpriteTime1 = 0;
                           }

                           addSpriteTime2 += 2;
                           if (addSpriteTime2 == nextSprite2Time) {
                                 addFace2();
                                   addSpriteTime2 = 0;
                           }

                           addSpriteTime3 += 2;
                           if (addSpriteTime3 == nextSprite3Time) {
                                   addFace3();
                                   addSpriteTime3 = 0;
                           }
                   }
           }));

Теперь у меня есть переменные типа int, объявленные на уровне класса ..

private int nextSprite1Time = 100;// initial value, could be changed during game
private int nextSprite2Time = 100;
private int nextSprite3Time = 100;

У меня тогда естьметод, который позволяет мне изменить скорость или nextSpriteTimes.

 private void speed(int f, int g, int h){

    this.nextSprite1Time = f;
    this.nextSprite2Time = g;
    this.nextSprite3Time = h;
    Log.e("Time Changed", String.valueOf(this.nextSprite1Time+ "," + this.nextSprite2Time + ","+ this.nextSprite3Time));

     }

Проблема заключается в том, когда я пытаюсь изменить скорость, например ..

 speed(30, 50, 70);

Это просто останавливает все вместеи теперь добавляются спрайты,

Кто-нибудь видит, где я иду с этим неправильно или может сделать это по-другому?

1 Ответ

2 голосов
/ 15 января 2012

Прежде всего - Ваше лог-сообщение в методе speed является , а не ошибкой - почему вы используете метод Log.e? Это из-за ошибок ... Используйте Log.d (отладка) или Log.i (информация).

Вернемся к вашей проблеме. Я не совсем понял, что вы имели в виду, но я вижу проблему: Допустим, что nextSprite1Time = 100 и addSpriteTime1 = 70. До здесь все нормально, верно? Еще к пяти onTimePassed вызовам будет добавлен новый спрайт.

Но теперь вы изменили nextSprite1Time на 60. addSpriteTime1 по-прежнему 70, и, поскольку он больше 60, он никогда не добавит новый спрайт!

Решение: используйте >= вместо ==, и не обнуляйте счетчики, а уменьшайте значение nextSpriteTime из них, например, для спрайта 1:

addSpriteTime1 += 2;
if(addSpriteTime1 >= nextSprite1Time) {
    addFace();
    addSpriteTime1 -= nextSprite1Time;
}
...