C++ 如何在C+中使文本闪烁而不阻塞整个程序+;快板?
正如你所看到的,我有一个无休止的循环,它阻止了整个程序,以便文本闪烁。问题是我如何做眨眼,使其他事情继续像后续事件一样工作C++ 如何在C+中使文本闪烁而不阻塞整个程序+;快板?,c++,allegro,C++,Allegro,正如你所看到的,我有一个无休止的循环,它阻止了整个程序,以便文本闪烁。问题是我如何做眨眼,使其他事情继续像后续事件一样工作 (当用户单击X时,窗口在此关闭)在主循环之外: 创建计时器:timer=al_创建计时器(…) 创建事件队列:event_queue=al_Create_event_queue() 在主循环的顶部: 最好的方法是在绘制文本时检查要绘制的状态(闪烁打开或关闭)。这可以从当前时间导出。比如: al_wait_for_event(event_queue, &ev);
(当用户单击X时,窗口在此关闭)在主循环之外:
timer=al_创建计时器(…)代码>
event_queue=al_Create_event_queue()代码>
最好的方法是在绘制文本时检查要绘制的状态(闪烁打开或关闭)。这可以从当前时间导出。比如:
al_wait_for_event(event_queue, &ev);
if (ev.type == ALLEGRO_EVENT_TIMER)
{
// do your blinking stuff here
}
运行时{
自动清除颜色(自动映射rgb(255、255、255));
绘制位图(位图,0,0,0);
如果(fmod(al_get_time(),2)<1.5){//每2秒显示文本1.5秒。
画图文字(字体,地图rgb(0,0,0),760375,0,“播放(空格键)”;
}
al_flip_display();
//例如,以非阻塞方式处理事件
//使用al_get_next_事件(而不是al_wait_for_事件)。
}
使用某种计时器,并在计时器过期时绘制闪烁效果,在任何其他时间都可以执行程序的任何操作。我理解你的意思,这就是代码现在的样子:bool running=true;运行时,{al_clear_to_color(al_map_rgb(255,255,255));al_draw_位图(位图,0,0,0);if(fmod(al_get_time(),2)<1.5){//每2秒显示文本1.5秒。al_draw_文本(字体,al_map_rgb(0,0),760,375,0,“播放(空格键)”)}al_翻转显示();快板事件;al_等待_事件(event_queue,&event);if(event.type==ALLEGRO_event_DISPLAY_CLOSE){running=false;}}令人惊讶的是,它不起作用!因为文本没有闪烁,所以将这一行:if(event.type==ALLEGRO_event_DISPLAY_CLOSE)更改为if(event.type!=ALLEGRO_event_DISPLAY_CLOSE)现在,当我快速单击退出按钮时,文本正在闪烁!此事件有一些奇怪的行为。你知道为什么吗?啊,是的,我没有注意到你有al_wait_for_事件
。这种闪烁方式期望图形持续发生,以便在闪烁状态更改时可以重新绘制,但al_wait_for_事件
会停止绘制执行,直到事件发生。请尝试使用足够小的值来设置secs
参数的al\u wait\u for\u event\u timed
,或al\u get\u next\u event
以完全不发生等待。
al_wait_for_event(event_queue, &ev);
if (ev.type == ALLEGRO_EVENT_TIMER)
{
// do your blinking stuff here
}
while (running) {
al_clear_to_color(al_map_rgb(255, 255, 255));
al_draw_bitmap(bitmap, 0, 0, 0);
if (fmod(al_get_time(), 2) < 1.5) { // Show the text for 1.5 seconds every 2 seconds.
al_draw_text(font, al_map_rgb(0, 0, 0), 760, 375, 0, "Play (Spacebar)");
}
al_flip_display();
// Handle events in a non-blocking way, for example
// using al_get_next_event (not al_wait_for_event).
}