аллегро 5 исполнение событий через определенный интервал

Я делаю свою первую игру в allegro 5, это игра со змейкой. Чтобы переместить игру со змеей, я бы хотел использовать квадратную сетку, которую я сделал, чтобы змея двигалась через равные промежутки времени.

Как я могу использовать таймеры, чтобы событие произошло в определенное время?

Например, я хочу, чтобы моя змея двигалась каждую секунду в заданном направлении, я знаю, как ею управлять, но я не знаю, как создать событие, которое происходит через определенный интервал. Я использую Codeblocks IDE с Windows XP SP3.


person Bugster    schedule 03.09.2012    source источник
comment
Почему за это проголосовали? Я задокументировал себя, прежде чем задавать этот вопрос, я даже пытался кодировать, и я могу предоставить код в качестве доказательства. То, что новичок задает что-то, что, по вашей теории, является глупым вопросом, не означает, что он глупый, это просто означает, что он новичок, и если вы можете ответить, просто ответьте и не минусуйте.   -  person Bugster    schedule 03.09.2012


Ответы (1)


Большинство людей, которые создают игры с Allegro, используют систему фиксированного интервала времени. Это означает, что X раз в секунду (часто 60 или 100) вы обрабатываете ввод и запускаете логический цикл. Затем, если у вас осталось время, вы рисуете графическую рамку.

Чтобы создать таймер с частотой 60 кадров в секунду и зарегистрировать его в очереди событий:

ALLEGRO_TIMER *timer = al_create_timer(1 / 60.0);
ALLEGRO_EVENT_QUEUE *queue = al_create_event_queue();

al_register_event_source(queue, al_get_timer_event_source(timer));

Теперь где-то в вашем основном цикле событий:

al_start_timer(timer);
while (playingGame)
{
  bool draw_gfx = false;

  do
  {
    ALLEGRO_EVENT event;
    al_wait_for_event(queue, &event);

    if (event.type == ALLEGRO_EVENT_TIMER)
    {
      do_logic();
      draw_gfx = true;
    }
    else if (event.type == ... )
    {
      // process keyboard input, mouse input, whatever
      // this could change the direction the snake is facing
    }
  }
  while (!al_is_event_queue_empty(queue));

  if (draw_gfx)
  {
    do_gfx();
    draw_gfx = false;
  }
}

Итак, теперь в do_logic() вы можете переместить свою змею на одну единицу в направлении, в котором она смотрит. Это означает, что он будет двигаться со скоростью 60 единиц в секунду. Вы можете использовать дробные единицы, если вам нужно больше детализации.

Возможно, вам захочется взглянуть на некоторые демоверсии, поставляемые с Allegro, поскольку в них есть полнофункциональные циклы событий. Это слишком много, чтобы включить его в один ответ SO.

person Matthew    schedule 03.09.2012
comment
Потеряв надежду на хороший ответ, я получил это. Я не могу больше благодарить тебя, ты такой классный, что я сразу же согласился. Спасибо! - person Bugster; 03.09.2012