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

画面の寸法と長方形の位置とサイズがあるため、画面からどれだけ切り取られるかがわかります。
画面にブリットする前に、すべての四角形をチェックする必要があります。
カットを検出した場合は、単純にその量を計算し、画面の反対側の変位座標で同じ長方形に対して別のブリット呼び出しを行うため、長方形の一部にすぎません。見えます。

あなたのコードで

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

長方形が(部分的に)画面外にある場合は、異なる座標で別の呼び出しを追加します。

于 2013-03-02T20:26:11.343 に答える