Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Allegro5] wstawianie grafiki w wybranym miejscu

Ostatnio zmodyfikowano 2021-02-21 20:38
Autor Wiadomość
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:

C/C++
#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;
}
P-178116
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:
C/C++
pozycja_kolka_x = x;
pozycja_kolka_y = y;
Kółko rysuj natomiast poza if-em (tak samo jak rysujesz kwadrat).
P-178117
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.
   
P-178118
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.
P-178119
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 ?
P-178124
DejaVu
» 2021-02-21 18:17:47
Użyj std::vector do przechowywania nowych obiektów. Pętlą for je renderuj.
P-178126
pekfos
» 2021-02-21 18:18:30
Czy podobny efekt, bez zapisywania do tablicy, osiągne przy pomocy al_register_event_source ?
Skąd taki pomysł..? Po prostu użyj tablicy, albo wektora
» Kurs C++» Poziom 5Kontener std::vector<> lekcja
Najlepiej tablicę/wektor struktur.
» Inne materiały» Wytwarzanie Gier 2D, C++Wprawianie obiektów gry w ruch lekcja
P-178127
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?
C/C++
#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(); //installing mouse
   
ALLEGRO_EVENT_QUEUE * event_queue = NULL; //definig queue of events
   
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(); //creating the 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 ) { //mouse button pressed
           
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;
}
P-178131
« 1 » 2
  Strona 1 z 2 Następna strona