Wrzochu Temat założony przez niniejszego użytkownika |
[Allegro, C++] Przemieszczanie » 2011-09-04 00:02:11 Witam, mam problem z funkcją odpowiedzialną za przemieszczanie "samochodu". Jeśli miałby ktoś trochę czasu i chęci i zerknął co jest nie tak z kodem byłbym bardzo wdzięczny. #include <allegro.h> #include <cstdlib> #include <ctime>
volatile long speed = 0; enum GAMESTATE { GS_NOTSTARTED, GS_MOVE, GS_LOSE, GS_ERROR, GS_EXIT }; GAMESTATE GS_GameState = GS_NOTSTARTED;
void increment_speed() { speed++; }
END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
short int map[ 120 ][ 120 ] = { };
const int max_car = 3; int x, y; short int f = 0; int mapa_x = 0, mapa_y = 0; int autoo_x = 280, autoo_y = 200, autoo2_x = 280, autoo2_y = 180, autoo3_x = 280, autoo3_y = 160; int kierunek = 0, kierunek2 = 0, kierunek3 = 0; int frame, frame2; int kolizja = 0; BITMAP * teren = NULL; BITMAP * bufor = NULL; BITMAP * autoo = NULL; BITMAP * autoo2 = NULL; BITMAP * autoo3 = NULL;
class cAuto { public: int x, y, i; BITMAP * autoo2; cAuto(); ~cAuto(); void rys_sam(); void przemiesc_sam(); bool ustaw_sam(); };
cAuto::cAuto() { autoo2 = load_bmp( "autoo2.bmp", default_palette ); srand( time( NULL ) ); x = 120; y = 80; }
cAuto::~cAuto() { autoo2 = NULL; destroy_bitmap( autoo2 ); }
void cAuto::rys_sam() { masked_blit( autoo2, bufor, 0, 0, x - mapa_x * 20, y - mapa_y * 20, 20, 20 ); textprintf_ex( bufor, font, 10, 80, makecol( 255, 255, 255 ), - 1, "X: %d", x ); textprintf_ex( bufor, font, 10, 90, makecol( 255, 255, 255 ), - 1, "Y: %d", y ); };
void cAuto::przemiesc_sam() { if((( map[( y - 1 ) / 20 ][ x / 20 ] ) == 16 ) &&(( map[( y ) / 20 ][( x ) / 20 ] ) == 16 ) ) { y = y - 1; } };
void wys_mape() { int licznik_x, licznik_y; for( licznik_x = 0; licznik_x < 120; licznik_x++ ) { for( licznik_y = 0; licznik_y < 120; licznik_y++ ) { blit( teren, bufor, ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 8 ) * 20, ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 8 ) * 20, licznik_x * 20, licznik_y * 20, 20, 20 ); } } };
int main() { allegro_init(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 40 ) ); bufor = create_bitmap( 800, 600 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } teren = load_bmp( "teren.bmp", default_palette ); autoo = load_bmp( "autoo.bmp", default_palette ); autoo2 = load_bmp( "autoo.bmp", default_palette ); autoo3 = load_bmp( "autoo.bmp", default_palette ); while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if(( key[ KEY_RIGHT ] ) &&( mapa_x < 80 ) ) { mapa_x = mapa_x + 1; } else if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) ) { mapa_x = mapa_x - 1; } else if(( key[ KEY_DOWN ] ) &&( mapa_y < 90 ) ) { mapa_y = mapa_y + 1; } else if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; } if( key[ KEY_Q ] ) { map[ 140 / 20 ][ 280 / 20 ] = 7; } speed--; frame++; frame2++; if( frame2 > 800 ) frame2 = 0; if( frame > 5 ) { frame = 2; srand( time( NULL ) ); frame = rand() % 4 + 1; } } wys_mape(); cAuto sam[ 10 ]; cAuto saam; saam.rys_sam(); saam.przemiesc_sam(); for( int i = 0; i < 10; ++i ) { sam[ i ].i = i; sam[ i ].x = 120; sam[ i ].y = 160; sam[ i ].rys_sam(); sam[ i ].przemiesc_sam(); }; masked_blit( autoo2, bufor, kierunek2 * 20, 0, autoo2_x - mapa_x * 20, autoo2_y - mapa_y * 20, 20, 20 ); masked_blit( autoo3, bufor, kierunek3 * 20, 0, autoo3_x - mapa_x * 20, autoo3_y - mapa_y * 20, 20, 20 ); masked_blit( autoo, bufor, kierunek * 20, 0, autoo_x - mapa_x * 20, autoo_y - mapa_y * 20, 20, 20 ); textprintf_ex( bufor, font, 10, 30, makecol( 255, 255, 255 ), - 1, "Licznik: %d", frame2 ); textprintf_ex( bufor, font, 10, 10, makecol( 255, 255, 255 ), - 1, "X: %d", autoo_x ); textprintf_ex( bufor, font, 10, 20, makecol( 255, 255, 255 ), - 1, "Y: %d", autoo_y ); textprintf_ex( bufor, font, 10, 40, makecol( 255, 255, 255 ), - 1, "Mapa X: %d", mapa_x ); textprintf_ex( bufor, font, 10, 50, makecol( 255, 255, 255 ), - 1, "Mapa Y: %d", mapa_y ); textprintf_ex( bufor, font, 10, 60, makecol( 255, 255, 255 ), - 1, "KOLIZJA: %d", kolizja ); blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } remove_int( increment_speed ); destroy_bitmap( teren ); destroy_bitmap( autoo ); destroy_bitmap( autoo2 ); destroy_bitmap( autoo3 ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
Wiem, że kod jest strasznie chaotyczny ale próbowałem wiele rzeczy poprawić/testować ale i tak nie wiem co jest źle... |
|
malan |
» 2011-09-04 02:21:16 O_O Zmienne globalne... tysiące zmiennych globalnych! Nie sprawdzasz, czy poprawnie wczytano bitmapy. cAuto sam[ 10 ]; cAuto saam; saam.rys_sam(); saam.przemiesc_sam();
for( int i = 0; i < 10; ++i ) { sam[ i ].i = i; sam[ i ].x = 120; sam[ i ].y = 160; sam[ i ].rys_sam(); sam[ i ].przemiesc_sam(); }; Co to robi w głównej pętli? cAuto::~cAuto() { autoo2 = NULL; destroy_bitmap( autoo2 ); } Mamy zwycięzcę! Jak się czepiać to się czepiać - klasa posiada metody, a nie funkcje. Jak poprawisz to co wymieniłem to porozmawiamy o przemieszczeniu. |
|
Wrzochu Temat założony przez niniejszego użytkownika |
» 2011-09-04 09:40:20 Zmiennych globalnych było tyle bo wcześniej program pisany był nie obiektowo, teraz już z likwidowałem te które nie są potrzebne, to fakt klasa mam metody nie funkcje moje przejęzyczenie. Teraz tez już sprawdzam ładowanie bitmap chociaż skoro były widoczne na ekranie to raczej się ładowały ;) Kod po wprowadzeniu poprawek: #include <allegro.h> #include <cstdlib> #include <ctime>
volatile long speed = 0; enum GAMESTATE { GS_NOTSTARTED, GS_MOVE, GS_LOSE, GS_ERROR, GS_EXIT }; GAMESTATE GS_GameState = GS_NOTSTARTED;
void increment_speed() { speed++; }
END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
short int map[ 120 ][ 120 ] = { };
int x, y; int mapa_x = 0, mapa_y = 0; int frame, frame2; int kolizja = 0; BITMAP * teren = NULL; BITMAP * bufor = NULL;
class cAuto { public: int x, y, i; BITMAP * autoo2; cAuto(); ~cAuto(); void rys_sam(); void przemiesc_sam(); bool ustaw_sam(); };
cAuto::cAuto() { autoo2 = load_bmp( "autoo2.bmp", default_palette ); if( !autoo2 ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę załadować bitmapy !" ); allegro_exit(); } srand( time( NULL ) ); x = 120; y = 80; }
cAuto::~cAuto() { destroy_bitmap( autoo2 ); autoo2 = NULL; }
void cAuto::rys_sam() { masked_blit( autoo2, bufor, 0, 0, x - mapa_x * 20, y - mapa_y * 20, 20, 20 ); textprintf_ex( bufor, font, 10, 10, makecol( 255, 255, 255 ), - 1, "X: %d", x ); textprintf_ex( bufor, font, 10, 20, makecol( 255, 255, 255 ), - 1, "Y: %d", y ); };
void cAuto::przemiesc_sam() { if((( map[( y - 1 ) / 20 ][ x / 20 ] ) == 16 ) &&(( map[( y ) / 20 ][( x ) / 20 ] ) == 16 ) ) { y = y - 1; } };
void wys_mape() { int licznik_x, licznik_y; for( licznik_x = 0; licznik_x < 120; licznik_x++ ) { for( licznik_y = 0; licznik_y < 120; licznik_y++ ) { blit( teren, bufor, ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 8 ) * 20, ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 8 ) * 20, licznik_x * 20, licznik_y * 20, 20, 20 ); } } };
int main() { allegro_init(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 40 ) ); bufor = create_bitmap( 800, 600 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } teren = load_bmp( "teren.bmp", default_palette ); if( !teren ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę załadować bitmapy !" ); allegro_exit(); return 0; } while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if(( key[ KEY_RIGHT ] ) &&( mapa_x < 80 ) ) { mapa_x = mapa_x + 1; } else if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) ) { mapa_x = mapa_x - 1; } else if(( key[ KEY_DOWN ] ) &&( mapa_y < 90 ) ) { mapa_y = mapa_y + 1; } else if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; } if( key[ KEY_Q ] ) { map[ 140 / 20 ][ 280 / 20 ] = 7; } speed--; frame++; frame2++; if( frame2 > 800 ) frame2 = 0; if( frame > 5 ) { frame = 2; srand( time( NULL ) ); frame = rand() % 4 + 1; } } wys_mape(); cAuto sam[ 10 ]; for( int i = 0; i < 10; ++i ) { sam[ i ].i = i; sam[ i ].x = 120; sam[ i ].y = 160; sam[ i ].rys_sam(); sam[ i ].przemiesc_sam(); }; blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } remove_int( increment_speed ); destroy_bitmap( teren ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
A to miało być w formie destruktora... Ale znając moje umiejętności coś pomieszałem. cAuto::~cAuto() { destroy_bitmap( autoo2 ); autoo2 = NULL; } |
|
Gabes |
» 2011-09-04 13:27:21 Tak poprawdzie to nie napisałeś co chcesz ośiągnąć , ale myśle że tak:
-auto znajduje się na środku ekranu
-klawiaturą przewijasz auto-mape lewo,prawo,góra,dół
-obrót auta w 4 kierunkach za pomocą rotate_sprite
-gdy przewiniesz mape do (0,0) lub (119,119) , przemieszczasz auto do krawędzi ekeanu
Pytanie za 100 litrów benzyny
Co ma robić autko?
-zabierać pieszych
-zbierać kanistry z benzyną
-rozjeżdżać pijanych rowerystów
-zatrzymywać się przed przeszkodami -dom -las -rzeka
-itd.-itp.
Prośba gdy napiszesz posta to czekaj na odpowiedź i dodatkowe pytania a nie zrywasz się z forum nikt nie udzieli ci pomocy gdy ty sam olewasz temat.
A tak swoją "drogą" dobry pomysł na mini gierke i trening w kodzeniu , lepszy nawet od kalkulatora z pierwiastkowaniem .
|
|
Wrzochu Temat założony przez niniejszego użytkownika |
» 2011-09-04 14:19:32 Gabes, źle się zrozumieliśmy. Auto ogólnie ma się poruszać po takiej mapie : I ogólnie odpowiedzialne za to są warunki: if((( map[( y - 1 ) / 20 ][ x / 20 ] ) == 16 ) &&(( map[( y ) / 20 ][( x ) / 20 ] ) == 16 ) ) { y = y - 1; }
Tylko w swoim programie mam ich wiele więcej tzn. rozpisane na każdy przypadek, a nie wklejałem ich bo myślę ze to nie ma sensu bo skoro zadziała na tym to na reszcie warunków tez będzie działać. Jeśli chodzi o kierunek problem tez rozwiązałem. Tylko, że wszystko działa pięknie i dobrze jak robię to na "sztywno" ze zmiennymi globalnymi. Natomiast jak dołączyłem klasę cAuto to wtedy się posypało. A ogólnie problem mam taki ze auto nie "jeździ" tzn nie porusza się po wyznaczonych kaflach które są drogą. Tak jak pokazałem wyżej w kodzie warunek sprawdza czy współrzędne auta są na danym kaflu w tym wypadku "16" to może jechać w duł bo "16" jest odpowiedzialny za lewy pas. I tak jak pisałem jeśli nie używałem klas to auto jeździło tak jak chciałem. //EDIT Odpowiadając na twoje pytania: - tak mapę przesuwamy za pomocą klawiatury, - Auto nie znajduje się na środku ekranu tylko pod współrzędnymi x=120, y = 80; - A co ma auto robić? Po prostu jeździć po drodze :D Jak już zacznie się poruszać samo to można kombinować dalej(zapomniałem dodać, że auto ma się samo poruszać, a nie tak jak to chyba zrozumiałeś, że będziemy nim sterować). |
|
Wrzochu Temat założony przez niniejszego użytkownika |
» 2011-09-05 09:10:10 I nikt nie jest w stanie pomóc? :( |
|
« 1 » |