2

这就是我通过按下按钮使矩形移动的方式:

#include <stdio.h>
#include <allegro5/allegro.h>
#include <allegro5/allegro_native_dialog.h>
#include <allegro5/allegro_primitives.h>

#define ScreenWidth 1440
#define ScreenHeight 790

int main()
{
    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); 
    al_set_window_position(display, 0, 0);
    al_set_window_title(display, "Lab 14"); 

    if (!display)
    {
        al_show_native_message_box(display, "Error", NULL, "Display window was not created succesfully", NULL, ALLEGRO_MESSAGEBOX_ERROR);
        return -1;
    }

    al_init_primitives_addon();
    al_install_keyboard();

    ALLEGRO_COLOR orange = al_map_rgb(255, 160, 0);

    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;

    int state = NULL;

    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_RIGHT:
                    x += moveSpeed;
                    break;
                case ALLEGRO_KEY_LEFT:
                    x -= moveSpeed;
                    break;
                case ALLEGRO_KEY_ESCAPE:
                    done = true;
                    break;
            }
        }

        al_draw_rectangle(x, y, x + 20, y + 20, orange, 2.0);
        al_flip_display();
        al_clear_to_color(al_map_rgb(0, 0, 0));
    }
    al_draw_rectangle(300, 600, 500, 200, orange, 2.0);
    al_destroy_display(display);
    al_destroy_event_queue(event_queue);

    return 0;
}

如何修改代码以使矩形平滑地越过显示边框,同时出现在另一侧?平滑意味着它不应该完全出现在对面。

4

1 回答 1

1

你有你的矩形的屏幕尺寸和位置和大小,因此你知道它会从屏幕上切掉多少。
在将它传送到屏幕之前,您必须检查每个矩形。
如果您检测到剪切,只需计算多少,然后在屏幕另一侧的位移坐标上对同一个矩形进行另一个 blit 调用,因此只是矩形的一部分。可见。

在您的代码中

 al_draw_rectangle(x, y, x + 20, y + 20, orange, 2.0);

如果矩形(部分)在屏幕外,则添加另一个具有不同坐标的调用。

于 2013-03-02T20:26:11.343 回答