среда, 14 марта 2012 г.

Andengine. Использование таймеров - пример создания спрайтов

Оригинал статьи: http://www.andengine.org/forums/tutorials/using-timer-s-sprite-spawn-example-t463.html

Поговорим о таймерах и как вы можете использовать их в игре.

Итак, что такое таймер? В общем, вы можете создать объект типа таймер, чтобы ваша игра выполняла определенные действия через определенные промежутки времени. При регистрации этого обработчика в AndEngine, он будет выполнять callback функцию один раз в указанное время.

Итак, где мы можем использовать такую ​​функциональность? Ну я использую это в моем
Explosion Live Wallpaper (можете загрузить и посмотреть их совершенно бесплатно), чтобы создавать взрывы в определенные промежутки времени, которые регулирует пользователь. Мне поступило предложение создать эту статью, чтобы показать вам, как можно создавать новые спрайты на экране, по событиям таймера  с помощью его callback вызова. Итак, приступим!

Прежде всего, создаем основной метод, создающий для нас спрайты:

/**
 * Создает спрайт в определенном месте экрана
 * @param pX координата X вашего спрайта
 * @param pY координата Y вашего спрайта
 */
private void createSprite(float pX, float pY) {
 Sprite sprite = new Sprite(pX, pY, this.mSpriteTextureRegion);
 this.mEngine.getScene().getTopLayer().addEntity(sprite);
}

Хорошо, теперь пишем метод, который создает наш обработчик таймера и регистрирует его:

/**
 * Создание хэндлера таймера, используется для создания спрайтов
 */
private void createSpriteSpawnTimeHandler()
{
 TimerHandler spriteTimerHandler;
 
 this.getEngine().registerUpdateHandler(spriteTimerHandler = new TimerHandler(mEffectSpawnDelay, new ITimerCallback()
 {   
     @Override
     public void onTimePassed(final TimerHandler pTimerHandler)
     {

     }
 }));
}
Посмотрите на код выше. Он довольно простой. Все, что он делает - это создает новый TimerHandler и регистрирует его. TimerHandler принимает на вход два параметра. Первый параметр, pTimerSeconds, определяет период времени, через который TimerHanlder вызывает callback функцию. Второй параметрITimerCallbak, определяет callback функцию.

Итак, как теперь создать спрайт? Нужно изменить  метод createSpriteSpawnTimeHandler() следующим образом:


/**
 * Создание хэндлера таймера, используется для создания спрайтов
 */
private void createSpriteSpawnTimeHandler()
{
 TimerHandler spriteTimerHandler;
 
 this.getEngine().registerUpdateHandler(spriteTimerHandler = new TimerHandler(mEffectSpawnDelay, new ITimerCallback()
 {   
     @Override
     public void onTimePassed(final TimerHandler pTimerHandler)
     {      
      //Random Position Generator
      final float xPos = MathUtils.random(30.0f, (CAMERA_WIDTH - 30.0f));
  final float yPos = MathUtils.random(30.0f, (CAMERA_HEIGHT - 30.0f));
   
  createSprite(xPos, yPos);
     }
 }));
}
Если вы сейчас запустите таймер, вы увидите как создается спрайт через заданный промежуток времени, который задан в TimerHandler. Но сейчас таймер срабатывает только один раз. Что нужно сделать чтобы спрайты создавались постоянно? Для этого нужно каждый раз сбрасывать TimerHandler. Законченный код выглядит следующим образом:



/**
 * Создание хэндлера таймера, используется для создания спрайтов
 */
private void createSpriteSpawnTimeHandler()
{
 TimerHandler spriteTimerHandler;
 
 this.getEngine().registerUpdateHandler(spriteTimerHandler = new TimerHandler(mEffectSpawnDelay, new ITimerCallback()
 {   
     @Override
     public void onTimePassed(final TimerHandler pTimerHandler)
     {
      spriteTimerHandler.reset();
      
      //Random Position Generator
      final float xPos = MathUtils.random(30.0f, (CAMERA_WIDTH - 30.0f));
   final float yPos = MathUtils.random(30.0f, (CAMERA_HEIGHT - 30.0f));
   
   createSprite(xPos, yPos);
     }
 }));
}


И это всё! Добавьте эти два метода в Ваше приложение, измените их по своему усмотрению, а затем вызовите createSpawnTimerHandler() из метода onLoadScene(). И вы сможете в вашем приложении создавать спрайты через определенные промежутки времени.

Комментариев нет: