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).
    }