2013-03-02 22 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); 但整个矩形出现在顶部。我认为这是因为左上角的负坐标。难道我做错了什么? – 2013-03-02 21:20:04

+0

我认为你需要改变所有的x和y参数。阅读[文档](https://www.allegro.cc/manual/5/al_draw_rectangle)并继续尝试。 – 2013-03-02 21:22:15

+0

哦,我的不好,应该是(y + 20> ScreenHeight)。再一次感谢你 :) – 2013-03-02 21:36:13

相关问题