Как сделать так, чтобы прямоугольник плавно пересекал границу дисплея, при этом появляясь на противоположной стороне?

Вот как я сделал прямоугольник для перемещения, нажимая кнопки:

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

Как изменить код, чтобы прямоугольник плавно пересекал границу экрана, при этом отображаясь на противоположной стороне? Плавно означает, что он не должен полностью появляться на противоположной стороне.

2

Решение

У вас есть размеры экрана, а также положение и размер вашего прямоугольника, таким образом, вы знаете, насколько он будет отрезан от экрана.
Вы должны проверить каждый прямоугольник, прежде чем переместить его на экран.
Если вы обнаружите разрез, просто рассчитайте, сколько и сделайте еще один блиц-вызов для того же прямоугольника по смещенным координатам на другой стороне экрана, поэтому просто часть прямоугольника. виден

В вашем коде

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

добавьте еще один вызов с другими координатами, если прямоугольник (частично) находится за пределами экрана.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]