我有这样的问题:我想要显示消息"你好!"比赛开始前,靠近Allegro屏幕中心。不知道为什么在编译程序之后总是只有全窗口白色而不是消息"你好!"。我不知道为什么它没有显示消息"你好!" 。但是如果我删除注释行之间的代码// *****程序显示消息" Hello!"好。有人可以告诉我如何解决这个问题吗?
#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 :(得分:0)
这里有一些问题阻止你看到文字。
您已经设置了'等待事件然后绘制'循环,这通常与使用计时器有关,但您没有计时器。这意味着除非您触发某种事件(例如,通过按键盘键),al_wait_for_event
将无限期停止,您的程序将永远不会拨打al_flip_display
的电话。您可以阅读有关计时器here的更多信息,但暂时知道您必须按键盘键才能使该程序继续进行。
您的清除/平局/翻转调用的顺序有点令人困惑。
在主循环中尝试这样的事情:
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();
换句话说,首先清除,然后绘制,然后翻转。目前您只绘制一次文本(在主循环之前)。这意味着清除屏幕将清除文本 - 您需要在清除屏幕后每隔一帧绘制文本,而在翻转显示之前。
如果你改变这两件事,你应该能够在按下键盘按钮后看到文字。但是,还有一些其他更改可能有所帮助:
我会删除对al_rest
的这些来电,除非它们有用。目前它们只是让你在开始主循环之前等待5秒(这意味着即使按下某个键,你也无法立即看到文本)。
在主循环退出后没有理由翻转显示,虽然我想这是你早期的显示文字实验所遗漏的。
检查事件类型时,请使用events.type == ALLEGRO_EVENT_KEY_DOWN
代替events.type = ALLEGRO_EVENT_KEY_DOWN
。目前,您实际上正在将值ALLEGRO_EVENT_KEY_DOWN
分配给events.type
,覆盖其原始值。你的编译器可能(也可能应该)警告过你。