Как можно эффективно создать меню заголовка allegro 5?

Я работаю над своей первой игрой в Allegro 5, у меня есть рендеринг меню заголовка как такового, однако я хочу добавить кликабельный текст в меню. Как мне сделать так, чтобы при наведении курсора на текст можно было щелкнуть по нему? Я думаю, что наличие оператора for, проверяющего пиксели, было бы очень плохо для производительности, вот что у меня есть до сих пор:

#include <allegro5\allegro.h>
#include <allegro5\allegro_image.h>
#include <allegro5\allegro_primitives.h>

const int width = 1280;
const int height = 720;

int main(void)
{
    al_init();

    al_init_primitives_addon();
    al_init_image_addon();

    ALLEGRO_DISPLAY *display = al_create_display(width, height);
    ALLEGRO_BITMAP *title = al_load_bitmap("titlemenu.bmp");

    al_clear_to_color(al_map_rgb(0, 0, 0));
    al_draw_bitmap(title, 0, 0, 0);
    al_flip_display();
    al_rest(3.0);
    al_destroy_display(display);
    return 0;
}

Я использую кодовые блоки в Windows XP SP3.


person Bugster    schedule 02.09.2012    source источник
comment
Переход от рисования статического изображения на экран к работе с графическим интерфейсом — долгий шаг. Сначала вам нужно иметь функционирующий цикл рендеринга.   -  person Nicol Bolas    schedule 03.09.2012
comment
Я нигде не нашел этой информации, что за игра без графического интерфейса? Если бы вы могли объяснить возможный очень простой метод работы с графическим интерфейсом в аллегро, я был бы очень признателен, поскольку я просто нигде не нашел информации о том, как это сделать. :(   -  person Bugster    schedule 03.09.2012


Ответы (2)


Чтобы сделать это «правильно», вам нужно использовать какую-то библиотеку с графическим интерфейсом. Но вы можете легко создать интерактивную часть экрана, жестко задав координаты прямоугольника.

Сначала вам нужно настроить обработку событий:

ALLEGRO_EVENT_QUEUE *queue;
queue = al_create_event_queue();
al_install_keyboard();
al_register_event_source(queue, al_get_keyboard_event_source());

Не вдаваясь в особенности обработки событий (это целая отдельная тема), вот соответствующий бит:

int selection = 0;

while (!selection)
{
  ALLEGRO_EVENT event;
  al_wait_for_event(queue, &event);
  if (event.type == ALLEGRO_EVENT_KEY_UP)
  {
    if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE)
      selection = MYGAME_QUIT;
  }
  else if (event.type == ALLEGRO_EVENT_MOUSE_BUTTON_UP)
  {
    if (event.mouse.x >= MYGAME_MENU_X1 && event.mouse.x < MYGAME_MENU_X2 &&
        event.mouse.y >= MYGAME_MENU_Y1 && event.mouse.y < MYGAME_MENU_Y2)
    {
      selection = MYGAME_OPTION1;          
    }
  }
}

Есть множество способов улучшить этот пример... Это просто для начала.

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

PS: Используйте косую черту при использовании путей к файлам, так как они кроссплатформенные:

#include <allegro5/allegro.h>
person Matthew    schedule 03.09.2012
comment
Также спасибо за указание косой черты, я думал, что это то же самое. - person Bugster; 03.09.2012

Вышесказанное неверно; Вы можете добавить клавиатуру в свою игру, а затем у вас есть 2 варианта обнаружения столкновений: идеальный пиксель и ограничительная рамка, оба из которых описаны в вики allegro 5. Галочка здесь, чтобы создать лучшее меню IMO, состоит в том, чтобы создать цикл и таймер для меню, а затем перечислить события клавиатуры, мыши и таймера отдельно. Затем сделайте несколько операторов if, чтобы событие мыши или клавиатуры срабатывало только тогда, когда вы на самом деле щелкаете по нему, это необходимо, чтобы вы могли прокручивать меню с помощью мыши и клавиатуры, или вы можете просто сделать так, чтобы мышь не влияла на экран до тех пор, пока вы щелкаете, но прежний выглядит лучше, по крайней мере, ИМО.

person Apprentice Coder    schedule 16.02.2015
comment
Если вы хотите написать что-то о другом ответе или добавить что-то, напишите комментарий - person Rizier123; 22.02.2015