2013-03-02 4 views
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; 
} 

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

ответ

1

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

В коде

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

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

+0

Спасибо за ваш ответ! Я написал следующее для нижней части окна: if (y> ScreenHeight) al_draw_rectangle (x, y-ScreenHeight, x + 20, y + 20-ScreenHeight, orange, 2.0); , но весь прямоугольник появляется сверху. Я думаю, что это из-за отрицательной координаты верхнего левого угла. Я делаю что-то неправильно? –

+0

Думаю, вам нужно изменить все параметры x и y. Прочитайте [документацию] (https://www.allegro.cc/manual/5/al_draw_rectangle) и продолжайте попытки. – 2013-03-02 21:22:15

+0

О, мое плохое, это должно быть (y + 20> ScreenHeight). Еще раз, спасибо :) –

 Смежные вопросы

  • Нет связанных вопросов^_^