lewus Temat założony przez niniejszego użytkownika |
[Allegro5] wstawianie grafiki w wybranym miejscu » 2021-02-21 07:04:01 Witam Chcialbym wstawic kólko w miejscu gdzie najechałem sterowanym z klawiatury kwadratem. Oto moja nieudolna próba: #include <allegro5/allegro.h> #include <allegro5/allegro_font.h> #include <iostream> #include <allegro5/allegro_primitives.h> int szer = 320, wys = 240, rozm = 40; int main() { al_init(); al_install_keyboard(); al_init_font_addon(); al_init_primitives_addon(); ALLEGRO_KEYBOARD_STATE klawiatura; ALLEGRO_DISPLAY * okno = al_create_display( szer, wys ); al_set_window_title( okno, "Allegro5 klawiatura i czas" ); ALLEGRO_BITMAP * kwadrat = al_create_bitmap( rozm, rozm ); ALLEGRO_FONT * font8 = al_create_builtin_font(); al_set_target_bitmap( kwadrat ); al_clear_to_color( al_map_rgb( 200, 0, 0 ) ); al_set_target_bitmap( al_get_backbuffer( okno ) ); ALLEGRO_COLOR green = al_map_rgb( 0, 255, 0 ); ALLEGRO_EVENT_QUEUE * event_queue = NULL; int x = 140, y = 100; double czas = al_get_time(); do { al_get_keyboard_state( & klawiatura ); if( al_get_time() > czas + 0.01 ) { if( al_key_down( & klawiatura, ALLEGRO_KEY_RIGHT ) && x < szer - rozm ) x = x + 1; if( al_key_down( & klawiatura, ALLEGRO_KEY_LEFT ) && x > 0 ) x = x - 1; if( al_key_down( & klawiatura, ALLEGRO_KEY_DOWN ) && y < wys - rozm ) y = y + 1; if( al_key_down( & klawiatura, ALLEGRO_KEY_UP ) && y > 0 ) y = y - 1; if( al_key_down( & klawiatura, ALLEGRO_KEY_SPACE ) ) { al_draw_filled_circle( x, y, 30, green ); al_flip_display(); } czas = al_get_time(); } al_clear_to_color( al_map_rgb_f( 0.5, 0.5, 0.5 ) ); al_draw_bitmap( kwadrat, x, y, 0 ); al_draw_textf( font8, al_map_rgb( 255, 255, 0 ), 10, 10, 0, "x=%3d , y=%3d", x, y ); al_flip_display(); al_rest( 0.001 ); } while( !al_key_down( & klawiatura, ALLEGRO_KEY_ESCAPE ) ); al_destroy_bitmap( kwadrat ); al_destroy_display( okno ); return 0; } |
|
DejaVu |
» 2021-02-21 11:17:50 Utwórz nowe zmienne, które będą reprezentowały pozycję kółka. Jak naciśniesz spację to ustaw: pozycja_kolka_x = x; pozycja_kolka_y = y;
Kółko rysuj natomiast poza if-em (tak samo jak rysujesz kwadrat). |
|
lewus Temat założony przez niniejszego użytkownika |
» 2021-02-21 14:47:32 Ok dzięki, ale nie do końca wyjaśniłem o co mi chodzi. Chce, żeby kółko nie znikało po wstawieniu kolejnego. Druga sprawa, jak zadeklarować pozycja_kolka_x i pozycja_kolka_y, żeby koło pojawiało się dopiero po naciśnięciu spacji? W tym momencie pojawia się już przed naciśnięciem klawisza. |
|
pekfos |
» 2021-02-21 16:28:11 Musisz jakoś pamiętać pozycję wielu obiektów do wyświetlenia, w tym zero obiektów. Użyj jakiegoś kontenera, choćby tablicy, na przechowywanie pozycji i wyświetlaj obiekty w pętli. |
|
lewus Temat założony przez niniejszego użytkownika |
» 2021-02-21 18:08:36 Czy podobny efekt, bez zapisywania do tablicy, osiągne przy pomocy al_register_event_source ? |
|
DejaVu |
» 2021-02-21 18:17:47 Użyj std::vector do przechowywania nowych obiektów. Pętlą for je renderuj. |
|
pekfos |
» 2021-02-21 18:18:30 |
|
lewus Temat założony przez niniejszego użytkownika |
» 2021-02-21 20:16:44 Ok. Użyje wektora...ale tak z czystej ciekawości znalazłem program, który działa tak jak bym chciał, ale bez użycia kontenera do zapisu położenia wstawianych kółek. Rozumiem jednak, że nie warto utrudniać sobie sprawy? #include<allegro5/allegro.h> #include <allegro5/allegro_primitives.h> int main() { int x, y; ALLEGRO_DISPLAY * display = NULL; al_init(); al_init_primitives_addon(); al_install_mouse(); ALLEGRO_EVENT_QUEUE * event_queue = NULL; display = al_create_display( 640, 480 ); al_clear_to_color( al_map_rgb( 204, 255, 103 ) ); ALLEGRO_COLOR green = al_map_rgb( 0, 255, 0 ); event_queue = al_create_event_queue(); al_register_event_source( event_queue, al_get_display_event_source( display ) ); al_register_event_source( event_queue, al_get_mouse_event_source() ); while( true ) { ALLEGRO_EVENT ev; al_wait_for_event( event_queue, & ev ); if( ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE ) break; else if( ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN ) { x = ev.mouse.x; y = ev.mouse.y; } al_draw_filled_circle( x, y, 30, green ); al_flip_display(); } al_destroy_display( display ); return 0; } |
|
« 1 » 2 |