2011-05-25 122 views
1

这是我的代码的游戏循环和绘图代码:动画闪烁问题

float frames_per_second = 60; 

    display_timer = al_create_timer(1/frames_per_second); 
    queue = al_create_event_queue(); 
    al_register_event_source(queue, al_get_timer_event_source(display_timer)); 
    al_start_timer(display_timer); 
    while(!end_game) 
    { 
     ALLEGRO_EVENT event; 
     al_wait_for_event(queue, &event); 
     if(event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) break; 
     if(event.any.source == al_get_timer_event_source(display_timer)) 
     {update_display();} 
     update_input(); 
    } 

    void update_display() 
    { 
     al_clear_to_color(al_map_rgb(255, 255,255)); 
     draw_objects(); //this is just an al_draw_bitmap() call 
     al_flip_display(); 
    } 

通过在屏幕上移动对象创建动画闪烁,我很惊讶这个,因为我写的后台缓冲区屏幕因此我期望双缓冲。我能做些什么来纠正闪烁?谢谢。

+0

默认情况下它是双缓冲的。你可以发布图纸代码吗?你所提供的一点与这个问题无关。 – Matthew 2011-05-25 16:34:54

+0

我已更新帖子。我很好奇,游戏循环如何不相关?这就是控制屏幕更新的速度,我认为这必须是更新率问题。 – Findrzkeeprz 2011-05-25 16:46:11

+0

这是无关紧要的,因为如果它是双缓冲的,刷新屏幕的速度有多快并不重要,你永远不会闪烁。而通过闪烁,你的意思是屏幕白色短暂一秒,然后你看到的物体? (与剪切物体显示的一半剪切相反)。在创建显示之前,您可能需要尝试'al_set_new_display_option(ALLEGRO_SINGLE_BUFFER,0,ALLEGRO_REQUIRE);'。 – Matthew 2011-05-25 16:50:35

回答

1

与问题无关,您可以通过查找ALLEGRO_EVENT_TIMER事件来检查计时器。如果您有多个计时器,您可以使用event.timer.source来检查它是哪个计时器。

我认为这里的主要问题是您正在以60fps的速度绘制图形,但是您正在以无限制的速率更新输入。这实际上是倒退。您想要以固定的速率更新输入。您可以随心所欲地绘制图形...尽管如果没有更改,更新图形是没有意义的。

所以应该看起来更像是:

if(event.type == ALLEGRO_EVENT_TIMER) 
{ 
    update_input(); 
    update_display(); 
} 

然而,这并没有实现跳帧如果事情变得过于缓慢。你应该做的是在一个专用队列中设置定时器(不包含其他事件源)。然后只要有事件坐在专用定时器队列中,就更新输入。

然后更新显示器,假设您已经处理了至少一个记号。所以,如果速度太慢,可能会为每个绘制帧执行多个输入更新。

+0

动画不闪烁,但仍然存在。我猜在这种情况下使用'al_get_next_event'而不是'al_wait_for_event'应该没问题。我注意到'al_wait_for_event'增加了内存使用量。 – Findrzkeeprz 2011-05-25 17:47:33