aaadam Temat założony przez niniejszego użytkownika |
Allegro 5 budowa gier » 2013-04-05 08:21:03 Witam napisałem już drugą grę w allegro, teraz chciałem zrobić coś w stylu arkanoida lub galazy z pegazusa. Chciałem się dowiedzieć jak najlepiej zaprogramować te gry, nie chce żebyście mi tłumaczyli całą grę. Np jak mam kilkadziesiąt klocków do rozwalenia to czy wszystkie współrzędne trzeba trzymać w jakiejś tablicy i potem sprawdzać w pętli kolizję z piłką czy lepiej użyć listy itp. Dzięki za pomoc . |
|
RazzorFlame |
» 2013-04-05 08:45:28 Przeczytaj kurs "Wytwarzanie Gier 2D" który znajduje się na tej stronie. Teraz stwórz sobie klase przeciwnika to np tak: class Przeciwnik { public: Przeciwnik(); Przeciwnik( int _maxhp, int _hp, int _x, int _y ); int maxhp, hp; int x, y; void Logika(); };
Teraz za pomocą vectora stl'owego (#include <vector>) tworzysz sobie tablice tych przeciwników: vector < Przeciwnik > vPrzeciwnicy;
Przeczytaj (jeśli tego nie przeczytaleś jeszcze) kurs na tej stronie "Kurs STL" o vectorze (o innych kontenerach też by się przydało) i tym sposobem masz sobie tablice danych przeciwników. W logice możesz też umieścić kolizje itp. Tak samo zrób z pociskami (w Galaxy) tyle że w klasie umieść dane dot. np prędkości, obrażeń itp. |
|
aaadam Temat założony przez niniejszego użytkownika |
» 2013-04-06 13:40:00 witam poczytałem trochę i nawet coś mi wyszło ale mam pewien problem jak strzelam. Gdy współrzędna pocisku dojdzie do wartości y=0 uruchamiam funkcje pop.back() usuwającą ostatni element z wektora i waśnie w tym momencie zacina się gra.Drugi problem to kolizja dałem ją w komentarzu ponieważ od razu się wyłącza debugowanie, jeżeli mam jeszcze jakieś rażące błędy tez proszę powiedzieć jakie a o to kod: #include <allegro5\allegro5.h> #include <allegro5\allegro_native_dialog.h> #include <allegro5\allegro_image.h> #include <allegro5\allegro_font.h> #include <allegro5\allegro_ttf.h> #include <allegro5\allegro_acodec.h> #include <allegro5\allegro_audio.h> #include <allegro5\allegro_primitives.h> #include <iostream> #include <vector> using namespace std; #define ScreenWidth 800 #define ScreenHeight 600 #define FPS 60
bool kolizja( int x1, int y1, int x2, int y2 ) { if( x2 <= x1 + 30 && x2 > x1 && y2 >= y1 && y2 <= y1 + 30 ) return true; else if( x2 <= x1 + 30 && x2 > x1 && y2 + 20 >= y1 && y2 + 30 <= y1 + 30 ) return true; else if( x2 + 30 <= x1 + 30 && x2 + 30 > x1 && y2 >= y1 && y2 <= y1 + 30 ) return true; else if( x2 + 30 <= x1 + 30 && x2 + 30 > x1 && y2 + 30 >= y1 && y2 + 30 <= y1 + 30 ) return true; else return false; };
class Player { private: int x, y; public: Player( int x, int y ); Player( void ); int getX() { return x; } int getY() { return y; } void addX( int xx ) { x += xx; } void linia( int xx ) { x = xx; } }; Player::Player( int xx, int yy ) : x( xx ) , y( yy ) { } class Pocisk { public: int x, y; Pocisk( int x, int y ); Pocisk( void ); int getX() { return x; } int getY() { return y; } void addX( int xx ) { x += xx; } void addY( int yy ) { y += yy; } void strzal() { y++; } }; Pocisk::Pocisk( int xx, int yy ) : x( xx ) , y( yy ) { } class Robak { public: int x, y; Robak( int x, int y ); Robak( void ); int getX() { return x; } int getY() { return y; } void addX( int xx ) { x += xx; } void addY( int yy ) { y += yy; } }; Robak::Robak( int xx, int yy ) : x( xx ) , y( yy ) { } vector < Robak > Robaki; vector < Robak >::iterator itR; vector < Pocisk > Pociski; vector < Pocisk >::iterator itP;
int main() { int ilosc_robakow = 64; int x = 0; int punkty = 0; for( int i = 0, j = 10, k = 0; i < ilosc_robakow; i++, k++ ) { if( i % 16 == 0 ) { j += 30; k = 0; } Robaki.push_back( Robak( j, k * 35 ) ); } bool done = false, strzal = true; Player player( 20, 550 ); ALLEGRO_DISPLAY * display; if( !al_init() ) { al_show_native_message_box( NULL, NULL, NULL, "blad", NULL, NULL ); } display = al_create_display( ScreenWidth, ScreenHeight ); al_set_window_position( display, 150, 50 ); if( !display ) { al_show_native_message_box( NULL, NULL, NULL, "blad", NULL, NULL ); } al_init_primitives_addon(); al_install_keyboard(); al_init_font_addon(); al_init_ttf_addon(); al_init_image_addon(); al_install_audio(); al_init_acodec_addon(); ALLEGRO_BITMAP * player1 = al_load_bitmap( "sprite/playerImage1.png" ); ALLEGRO_BITMAP * pociskbmp = al_load_bitmap( "sprite/pocisk.png" ); ALLEGRO_BITMAP * robak1 = al_load_bitmap( "sprite/robak.png" ); ALLEGRO_BITMAP * background = al_load_bitmap( "sprite/background.png" ); al_convert_mask_to_alpha( robak1, al_map_rgb( 255, 255, 255 ) ); al_convert_mask_to_alpha( player1, al_map_rgb( 255, 255, 255 ) ); al_convert_mask_to_alpha( pociskbmp, al_map_rgb( 255, 255, 255 ) ); ALLEGRO_SAMPLE * pociskSample = al_load_sample( "sprite/pocisk.wav" ); ALLEGRO_FONT * font = al_load_font( "sprite/Orbitron.ttf", 36, NULL ); ALLEGRO_TIMER * timer = al_create_timer( 1.0 / FPS / 2 ); ALLEGRO_KEYBOARD_STATE keyState; ALLEGRO_EVENT_QUEUE * event_queue = al_create_event_queue(); al_reserve_samples( 1 ); al_register_event_source( event_queue, al_get_timer_event_source( timer ) ); al_register_event_source( event_queue, al_get_display_event_source( display ) ); al_register_event_source( event_queue, al_get_keyboard_event_source() ); al_start_timer( timer ); int t = 0; while( !done ) { ALLEGRO_EVENT events; al_wait_for_event( event_queue, & events ); al_get_keyboard_state( & keyState ); if( events.type == ALLEGRO_EVENT_DISPLAY_CLOSE ) { done = true; } else if( events.type == ALLEGRO_EVENT_TIMER ) { if( events.timer.source == timer ) { if( al_key_down( & keyState, ALLEGRO_KEY_RIGHT ) ) { player.addX( 4 ); } if( al_key_down( & keyState, ALLEGRO_KEY_LEFT ) ) { player.addX( - 4 ); } if( al_key_down( & keyState, ALLEGRO_KEY_Z ) ) { if( strzal == true ) { al_play_sample( pociskSample, 1.0, 0.0f, 1.0, ALLEGRO_PLAYMODE_ONCE, 0 ); Pociski.push_back( Pocisk( player.getX(), 550 ) ); strzal = false; } } } } if( player.getX() >= 555 ) player.linia( 555 ); if( player.getX() <=- 10 ) player.linia( - 10 ); al_draw_bitmap( background, 0, 0, NULL ); al_draw_line( 575, 600, 575, 0, al_map_rgb( 100, 100, 100 ), 5 ); for( itR = Robaki.begin(); itR != Robaki.end(); itR++ ) { al_draw_bitmap( robak1, itR->x, itR->y, NULL ); } al_draw_bitmap( player1, player.getX(), player.getY(), NULL ); for( itP = Pociski.begin(); itP != Pociski.end(); itP++ ) { al_draw_bitmap( pociskbmp, x + 7, itP->y, NULL ); itP->y -= 1; cout << itP->y << endl; if( itP->y <= 0 ) { Pociski.pop_back(); } } al_flip_display(); al_clear_to_color( al_map_rgb( 0, 0, 0 ) ); } al_destroy_bitmap( pociskbmp ); al_destroy_bitmap( background ); al_destroy_bitmap( player1 ); al_destroy_bitmap( robak1 ); al_destroy_font( font ); al_destroy_sample( pociskSample ); al_destroy_timer( timer ); return 0; }
|
|
hincu |
» 2013-04-06 15:04:08 przejedz debugerem, jak dla mnie blad lezy przy usuwaniu pociskow, dlaczego usuwasz ostatni obiekt, zamiast ten, ktory jest sprawdzany? to sie robi jakos tak obj.pop_back( iterator );
chodzi o to ze usuwasz ostatni obiekt sprawdzajac np 3 z 10 elementowego kontenera gdy petla dochodzi do ostatniego to jest wyciek i appcrash bo nie ma tego elementu w kontenerze fail |
|
pekfos |
» 2013-04-06 15:15:38 obj.pop_back( iterator );
|
|
|
hincu |
» 2013-04-06 18:33:55 dzieki za poprawe, wlasnie jak przysiadlem do swojego projektu to przypomnial mi sie ten temat xD |
|
aaadam Temat założony przez niniejszego użytkownika |
» 2013-04-06 18:36:46 tylko że mi coś i tak nie działa for( itP = Pociski.begin(); itP != Pociski.end(); itP++ ) { al_draw_bitmap( pociskbmp,( Pociski.begin() )->getX(), itP->y, NULL ); itP->y -= 5; cout << itP->y << endl; if(( itP->y <= 0 ) &&( Pociski.size() != 0 ) ) { Pociski.erase( itP ); } } |
|
pekfos |
» 2013-04-06 18:45:58 tylko że mi coś i tak nie działa |
A konkretnie? |
|
« 1 » 2 3 4 5 |