2014-12-07 2 views
0

У меня такая проблема: я хочу показать сообщение «Привет!». рядом с центром экрана Allegro перед началом игры. Не знаю, почему всегда есть только полный белый цвет окна после компиляции программы, а не сообщения «Привет!». Я не знаю, почему он не показывает сообщение «Привет!» , Но если я удалю код между строками комментариев, программа // ***** покажет сообщение «Привет!». Что ж. Может ли кто-нибудь сказать мне, как решить эту проблему?Allegro5 показывая текст не работает

#include<allegro5\allegro5.h> 
#include<allegro5\allegro_native_dialog.h> 
#include<allegro5\allegro_font.h> 
#include<allegro5\allegro_ttf.h> 
#include<allegro5\allegro_primitives.h> 

#include<iostream> 
using namespace std; 
int main(){ 
    int ScreenWidth = 800, ScreenHeight = 600; 

    if (!al_init()) 
    { 
     al_show_native_message_box(NULL, NULL, NULL, "Could not initialize Allegro 5", NULL, NULL); 
     return -1; 
    } 

    al_set_new_display_flags(ALLEGRO_WINDOWED); 
    ALLEGRO_DISPLAY *display = al_create_display(ScreenWidth, ScreenHeight);//creating window with dimensions: 800:600 px 
    al_set_window_position(display, 200, 100);//place from left top positioning the frame of display 
    al_set_window_title(display, "Try to catch me!"); 

    if (!display)//show this message if sth wrong with display 
    { 
     al_show_native_message_box(display, "Sample Title", "Display Settings", "Display window was not created succesfully", NULL, ALLEGRO_MESSAGEBOX_ERROR); 
     return -1; 
    } 

    al_init_font_addon();//initialization font addon 
    al_init_ttf_addon();//initialization ttf(true type font) addon 

    //INTRO 
    ALLEGRO_FONT *fontOrbionBlack36 = al_load_font("fonts/Orbitron Black.ttf", 36, NULL); 
    al_draw_text(fontOrbionBlack36, al_map_rgb(44, 117, 255), ScreenWidth/2, ScreenHeight/2, ALLEGRO_ALIGN_CENTRE, "Hello!"); 
    al_rest(5.0); 

    //******************************************************************************** 
    al_init_primitives_addon(); 
    al_install_keyboard(); 

    ALLEGRO_COLOR electricBlue = al_map_rgb(44, 117, 255); 
    ALLEGRO_EVENT_QUEUE *event_queue = al_create_event_queue(); 

    al_register_event_source(event_queue, al_get_keyboard_event_source()); 

    bool done = false; 
    int x = 10, y = 10; 
    int moveSpeed = 5; 

    while (!done) 
    { 
     ALLEGRO_EVENT events; 
     al_wait_for_event(event_queue, &events); 
     if (events.type = ALLEGRO_EVENT_KEY_DOWN) 
     { 
      switch (events.keyboard.keycode) 
      { 
      case ALLEGRO_KEY_DOWN: 
       y += moveSpeed; 
       break; 
      case ALLEGRO_KEY_UP: 
       y -= moveSpeed; 
       break;   
      case ALLEGRO_KEY_ESCAPE: 
       done = true; 
       break; 
      } 
     } 
     al_draw_rectangle(x, y, x + 20, y + 20, electricBlue, 2.0); 
     al_flip_display(); 
     al_clear_to_color(al_map_rgb(0, 0, 0)); 
    } 
    //***************************************************************************************** 

    al_flip_display(); 
    al_rest(10.0);//rest is very simmilar to Sleep() it is waitg function, waiting 3s then close the allegro display 
    //al_destroy_font(fontOrbionBlack18); 
    al_destroy_font(fontOrbionBlack36); 
    al_destroy_display(display);//destroy the display at the end of the programm 


    return 0; 
} 

ответ

0

Здесь есть несколько проблем, которые мешают вам видеть текст.

  1. Вы создали «WAIT-на-события, то сделать» цикл, который обычно ассоциируется с использованием таймера, но у вас нет таймера. Это означает, что если вы не вызываете какое-либо событие (например, нажатием клавиши клавиатуры), al_wait_for_event будет останавливаться на неопределенный срок, и ваша программа никогда не достигнет вызова до al_flip_display. Вы можете узнать больше о таймерах here, но пока просто знайте, что вам нужно будет нажать клавишу клавиатуры, чтобы эта программа продвигалась вперед.

  2. Заказы на звонки с четкими/обратными/флипными переводами немного запутанны.

Попробуйте что-то подобное в вашей основной цикл:

al_clear_to_color(al_map_rgb(0, 0, 0));` 
al_draw_rectangle(x, y, x + 20, y + 20, electricBlue, 2.0); 
al_draw_text(fontOrbionBlack36, al_map_rgb(44, 117, 255), ScreenWidth/2, ScreenHeight/2, ALLEGRO_ALIGN_CENTRE, "Hello!"); 
al_flip_display(); 

Другими словами, ясно, а затем рисовать, затем перевернуть. В настоящее время вы только рисуете текст один раз (до основного цикла). Это означает, что очистка экрана очистит текст - вам нужно нарисовать текст в каждом кадре после, очистив экран, но до щелкнуть по экрану.

Если вы измените эти две вещи, вы сможете увидеть текст после нажатия кнопки клавиатуры. Тем не менее, есть несколько других изменений, которые могли бы помочь:

  1. Я бы удалить эти вызовы al_rest, если они не служат полезной цели. В настоящее время они просто заставят вас ждать 5 секунд, прежде чем вы начнете свой основной цикл (это означает, что вы не сможете сразу увидеть текст, даже если вы нажмете клавишу).

  2. Невозможно перевернуть дисплей после выхода основного петли, хотя, я думаю, это осталось от ваших предыдущих экспериментов с отображением текста.

  3. При проверке типа события используйте events.type == ALLEGRO_EVENT_KEY_DOWN вместо events.type = ALLEGRO_EVENT_KEY_DOWN. В настоящее время вы фактически присваиваете значение ALLEGRO_EVENT_KEY_DOWN до events.type, перезаписывая все, что имело его первоначальное значение. Ваш компилятор может (и, вероятно, должен) предупредить вас об этом.