如何使矩形平滑地越过显示边框,同时显示在另一侧

How to make the rectangle smoothly cross the display border while appearing on the opposite side?

本文关键字:显示 边框 平滑 何使矩      更新时间:2023-10-16

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

#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;
}

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

你有屏幕尺寸,位置和矩形的大小,这样你就知道它将被屏幕切断多少。
你必须检查每一个矩形,然后再把它放到屏幕上。
如果你检测到一个切割,只需计算多少,并在屏幕另一边的位移坐标上对相同的矩形进行另一个blit调用,所以只有一部分矩形是可见的。

在你的代码

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

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