0

以上是我遇到的问题。我正在使用 C++ 中的 Visual Studio 2010 和 Allegro 库进行游戏开发。我遇到了一个问题,在某些情况下,我的测试程序总是全白的,直到我按下按钮。我真的不明白如何解决这个问题,也不知道出了什么问题。我知道它与所使用的代码无关,因为网站上的一些示例代码从未发生过这种情况;现在,这个项目似乎一直在发生。如果有人可以指出可能的错误修复,将不胜感激。

下面是代码:

#include <allegro5\allegro.h>
#include <allegro5\allegro_primitives.h>                //Our primitive header file

int main(void)
{
    int width = 640;
    int height = 480;

    bool done = false;
    int pos_x = width / 2;
    int pos_y = height / 2;

    ALLEGRO_DISPLAY *display = NULL;
    ALLEGRO_EVENT_QUEUE *event_queue = NULL;

    if(!al_init())                                      //initialize Allegro
        return -1;

    display = al_create_display(width, height);         //create our display object

    if(!display)                                        //test display object
        return -1;

    al_init_primitives_addon();
    al_install_keyboard();

    event_queue = al_create_event_queue();

    al_register_event_source(event_queue, al_get_keyboard_event_source());

    while(!done)
    {
        ALLEGRO_EVENT ev;
        al_wait_for_event(event_queue, &ev);

        if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
        {
            switch(ev.keyboard.keycode)
            {
                case ALLEGRO_KEY_UP:
                    pos_y -= 10;
                    break;
                case ALLEGRO_KEY_DOWN:
                    pos_y += 10;
                    break;
                case ALLEGRO_KEY_RIGHT:
                    pos_x += 10;
                    break;
                case ALLEGRO_KEY_LEFT:
                    pos_x -= 10;
                    break;
            }
        }
        else if(ev.type == ALLEGRO_EVENT_KEY_UP)
        {
            if(ev.keyboard.keycode == ALLEGRO_KEY_ESCAPE)
                done = true;
        }

        al_draw_filled_rectangle(pos_x, pos_y, pos_x + 30, pos_y + 30, al_map_rgb(255,0,255));
        al_flip_display();
        al_clear_to_color(al_map_rgb(0,0,0));
    }

    al_destroy_event_queue(event_queue);
    al_destroy_display(display);                        //destroy our display object

    return 0;
}

正如我所说,它是来自在线教程的示例代码。

4

1 回答 1

0

快速修复正是@mythagel 在评论中提到的。

通常对于 Allegro 游戏,您会想要创建一个计时器并让它以某个固定的时间间隔(例如,每秒 60 次)计时并将其附加到您的事件队列中。每次它滴答作响,您将游戏逻辑推进一帧,然后重新绘制图形(如果没有其他事情可做)。

因此,无需在按键事件期间直接处理输入,您只需将按键标记为按下或按下即可。因此,您可能有一个key_left表示向左移动的变量,并将其设置为true在 keydown 事件和falsekeyup 事件中。

然后在ALLEGRO_EVENT_TIMER你的计时器事件(if (key_left == true) pos_x -= 10;

There are more advanced ways of handling input that don't involve a fixed frame rate, but this is the easiest approach and usually works just fine.

于 2012-10-28T23:19:08.397 回答