MrNyna77 Temat założony przez niniejszego użytkownika |
[ALLEGRO 5] Deklaracja i definicja ALLEGRO_EVENT i ALLEGRO_EVENT_QUEUE w klasie » 2012-08-28 18:43:57 Witam. Mam taką klasę nagłówek: #ifndef LUDZIK_H #define LUDZIK_H #include <allegro5/allegro.h>
class ludzik { public: ludzik(); void chodzenie(); void strzal( int x, int y ); private: bool bron; bool zyje; int x; int y; enum ruch { UP, DOWN, LEFT, RIGHT }; bool ruch[ 4 ]; ALLEGRO_EVENT_QUEUE * akcje; ALLEGRO_EVENT ak; };
#endif
konstruktor: ludzik::ludzik() { zyje = true; bron = true; x = 320; y = 240; bool ruch[ 4 ] = { false, false, false, false }; ALLEGRO_EVENT_QUEUE * akcje = NULL; akcje = al_create_event_queue(); al_register_event_source( akcje, al_get_keyboard_event_source() ); al_clear_to_color( al_map_rgb( 0, 0, 0 ) ); }
Później jak funkcją składową wywołuje al_wait_for_event(akcje, &ak) wyrzuca mi taki błąd "~/allegro-5.0.7/src/misc/vector.c:86: _al_vector_ref:ASSertion 'idx < vec->_size' failed." Ma ktoś pomysł co robię źle? Z góry dzięki. Pozdrawiam. PS. Jak oznaczyć kod? |
|
SeaMonster131 |
» 2012-08-28 19:17:06 W klasie masz: ALLEGRO_EVENT_QUEUE * akcje;
A w konstruktorze jeszcze raz to samo: ALLEGRO_EVENT_QUEUE * akcje = NULL
Nie wiem tylko czy o to chodzi. [cpp] kod [/cpp] |
|
MrNyna77 Temat założony przez niniejszego użytkownika |
» 2012-08-28 20:06:38 Po usunięciu tej linijki z konstruktora ALLEGRO_EVENT_QUEUE * akcje = NULL; Działa. Dzięki za pomoc teraz nie wiem czemu funkcja nie "widzi" tej tablicy bool ruch[ 4 ] = { false, false, false, false };
treść funkcji: void ludzik::chodzenie() { al_wait_for_event( akcje, & ak ); if( ak.type == ALLEGRO_EVENT_KEY_DOWN ) { switch( ak.keyboard.keycode ) { case ALLEGRO_KEY_UP: ruch[ UP ] = true; break; case ALLEGRO_KEY_DOWN: ruch[ DOWN ] = true; break; case ALLEGRO_KEY_LEFT: ruch[ LEFT ] = true; break; case ALLEGRO_KEY_RIGHT: ruch[ RIGHT ] = true; break; } } else if( ak.type == ALLEGRO_EVENT_KEY_UP ) { switch( ak.keyboard.keycode ) { case ALLEGRO_KEY_UP: ruch[ UP ] = false; break; case ALLEGRO_KEY_DOWN: ruch[ DOWN ] = false; break; case ALLEGRO_KEY_LEFT: ruch[ LEFT ] = false; break; case ALLEGRO_KEY_RIGHT: ruch[ RIGHT ] = false; break; } } y -= ruch[ UP ] * 10; y += ruch[ DOWN ] * 10; x -= ruch[ LEFT ] * 10; x += ruch[ RIGHT ] * 10; al_clear_to_color( al_map_rgb( 0, 0, 0 ) ); al_draw_filled_circle( x, y, 20, al_map_rgb( 200, 200, 40 ) ); al_flip_display(); }
Jak umieszczę deklarację w funkcji to działa, ale wtedy funkcja nie spełnia swojej roli... |
|
SeaMonster131 |
» 2012-08-28 20:08:40 To masz w klasie: A to masz w konstruktorze: bool ruch[ 4 ] = { false, false, false, false };
|
|
MrNyna77 Temat założony przez niniejszego użytkownika |
» 2012-08-28 20:15:32 Jak mam to zrobić żeby działało? Wyjście jakie ja widzę, to wysłanie w argumencie tej tablicy zdefiniowanej w main do funkcji. Może jest sposób, żeby zrobić to przy pomocy tylko klasy?
EDIT: Czemu jeżeli w konstruktorze określam x i y to funkcja wie jakie one mają wartości? |
|
Maxius |
» 2012-08-29 15:21:20 Ostatnio robiłem coś podobnego. Powinieneś w metodzie umieścić blok switch( ev.keyboard.keycode ) a metoda powinna wyglądać tak: ludzik::chodzenie( allegro_event ev ) . Wtedy w funkcji main umieszczasz if( ev.type == allegro_event_key_down ) ludzik.chodzenie( ev ); |
|
MrNyna77 Temat założony przez niniejszego użytkownika |
» 2012-08-29 21:00:59 Co do tablicy ruch, to wystarczyło dla każdego elementu określić wartość... (że też wcześniej na to nie wpadłem...)
Do Maxius- twoja uwaga była przydatna, ale nie można było "przesuwać się" przez przytrzymanie przycisku, trzeba było cały czas naciskać, ale sobie z tym poradziłem. Dzięki!
Jeszcze nie wiem jak zrobić to, że jak trzymamy np. "lewo"i"góra", żeby przesuwać się po skosie, a jak się puści w lewo żeby przesuwać się tylko do góry... Jeżeli ktoś zna rozwiązanie będę wdzięczny ;)
Dzięki za pomoc. Pozdrawiam. |
|
Maxius |
» 2012-08-30 08:31:24 W timerze powinieneś dodać taki warunek: if( key[ LEFT ] && key[ UP ] ) { ludzik.poruszaj_do_gory(); ludzik.poruszaj_w_lewo(); }
Wydaję mi się, że lepiej by było gdybyś zrobił 4 metody odpowiedzialne za ruch w góre, w dół, w lewo i w prawo, a potem nimi odpowiednio manipulować. A ten kod if( ev.type == ALLEGRO_EVENT_KEY_DOWN ) umieścił w funkcji void w main'ie. |
|
« 1 » |