Wrzochu Temat założony przez niniejszego użytkownika |
[Allegro] Poruszanie po mapie kafelkowej » 2011-05-24 12:52:01 Tak, wiem temat mapy kafelkowej był już wałkowany z tysiąc razy ale nie znalazłem odpowiedzi na mój problem...
A Chodzi mi dokładnie o poruszanie się po mapie kafelkowej a dokładnie aby auto poruszało się wyłącznie po drodze. Zrobiłem mapę i pasy ruchu na drodze są osobnymi kafelkami i mój problem polega na tym, że nie wiem jak zrobić aby auto się poruszało po tych kafelkach po których może.
Dołączam Screena wycinka mapy oraz kod programu. Kod jest pisany na podstawie tutoriala Easykoder'a.
Mapa:
http://imageshack.us/photo/my-images/811/mapaaaaaa.png/
Kod programu:
#include <allegro.h>
volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
int mapa_x = 0, mapa_y = 0; int autoo_x = mapa_x + 130, autoo_y = mapa_y + 200; BITMAP * teren = NULL; BITMAP * bufor = NULL; BITMAP * autoo = NULL;
short int map[ 120 ][ 120 ] = { };
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 ); 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 < 80 ) ) { mapa_y = mapa_y + 1; } else if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; } if( mapa_y > 20 ) { if((( map[ mapa_y ][ mapa_x ] ) == 16 ) ) { autoo_y = autoo_y - 1; } speed--; } clear_to_color( bufor, makecol( 150, 150, 150 ) ); wys_mape(); textprintf_ex( bufor, font, 10, 10, makecol( 255, 255, 255 ), - 1, "X: %d", mapa_x ); textprintf_ex( bufor, font, 10, 20, makecol( 255, 255, 255 ), - 1, "Y: %d", mapa_y ); masked_blit( autoo, bufor, 0, 0, autoo_x - 10, autoo_y - 20, autoo->w, autoo->h ); blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } remove_int( increment_speed ); destroy_bitmap( teren ); destroy_bitmap( autoo ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
Zapomniałem dodać, że jak przesuwam mapę to auto mi się porusza wraz z przesuwającą mapa. A chce aby auto na "stałe" było na mapie i poruszało się tylko po drodze.
Z góry dzięki za wszelką pomoc. |
|
DejaVu |
» 2011-05-24 13:18:50 Warunek:
if( nastepne_pole_samochodu( jest_droga ) ) przesun_samochod_na_pole();
Jeżeli chodzi Ci o dokładne dopasowanie to sprawa nie jest prosta - poczytaj o algorytmach kolizji. |
|
Wrzochu Temat założony przez niniejszego użytkownika |
» 2011-05-24 13:26:19 No, ok ale chodzi o to, że mi nie wykrywa na jakim polu aktualnie się znajduje tylko auto przesuwa się wraz z widokiem mapy tzn jak steruje strzałkami aby poruszać się po mapie to to auto przesuwa się wraz z widokiem a nie pozostaje na drodze. Załączam screena: http://imageshack.us/photo/my-images/714/mapa2fu.png/ scren zrobiony po przesunięciu mapy. |
|
SeaMonster131 |
» 2011-05-24 14:32:10 to auto przesuwa się wraz z widokiem a nie pozostaje na drodze |
if( mapa[ fura.y ][ fura.x + 1 ] == droga && klawisz_prawo ) przesun_mape_w_prawo();
if( mapa[ fura.y ][ fura.x - 1 ] == droga && klawisz_lewo ) przesun_mape_w_lewo(); o coś takiego chodzi? Czy takiego: if( klawisz_prawo ) { if( mapa[ fura.y ][ fura.x + 1 ] == droga ) przesun_fure_w_prawo(); przesun_mape_w_prawo(); } |
|
Wrzochu Temat założony przez niniejszego użytkownika |
» 2011-05-24 15:55:34 Chodzi o to aby widok mapy się przesuwał, a auto zostało na mapie. Może nie jasno wyjaśniłem ale chce zrobić tak jak to jest w grach samochodowych, że jest mapa po której "same" jeżdżą samochody po drogach, a ty sterujesz jednym i widok mapy podąża za twoim autem, natomiast pozostałe niezależnie jeżdżą po drogach. A mój problem polega na tym, że nie mogę zrobić aby te auta się poruszały po mapie niezależnie od ruchu "widoku". Mam nadzieje, że teraz jasno wyjaśniłem o co mi chodzi, i jeszcze raz dziękuje za pomoc. |
|
DejaVu |
» 2011-05-24 16:03:02 Renderujesz cały świat, gdzie każdy obiekt ma swoje położenie globalne. Potem ustawiasz kamerę na właściwe miejsce. W allegro się po prostu rysuje obiekty na innym położeniu np.
for( int i = 0; i < ileSamochodow; i++ ) { rysujNaEkran( samochod[ i ].bitmapa, samochod[ i ].x - kamera.x, samochod[ i ].y - kamera.y ); }
|
|
SeaMonster131 |
» 2011-05-24 16:03:02 # Kurcze, ciachnęło mi całą wiad :P
Ale napisałem tak jak Pan DejaVu, że musisz to mniej więcej tak rysować:
masked_blit( autoo, bufor, 0, 0, autoo_x - mapa_x, autoo_y - mapa_y, autoo->w, autoo->h );
/edit (by DejaVu):
Przywróciłem wiadomość:
Hmm...to możesz zrobić tak:
rysuj_fure( fura.x - mapa_x, fura.y - mapa_y );
masked_blit( autoo, bufor, 0, 0, autoo_x - mapa_x, autoo_y - mapa_y, autoo->w, autoo->h );
Aczkolwiek nie wiem czy to zadziała, możesz spróbować ^^ :)
|
|
|
Wrzochu Temat założony przez niniejszego użytkownika |
» 2011-05-24 17:24:13 Zgadza się tak jak pisaliście trzeba było od położenia auta odjąć położenie kamery (autoo_x - mapa_x ) tylko jeszcze trza było przemnożyć przez wielkość obrazka czyli u mnie 20 bo tyle ma pikseli. masked_blit( autoo, bufor, 0,0, autoo_x-mapa_x*20, autoo_y-mapa_y*20, autoo->w, autoo->h);
Ale dalej mi nie odczytuje poprawnie kafla pod którym się znajduje, bo jak widać auto w tym momencie znajduje sie na kaflu nr.16(jest to kafel z lewym pasem drogi) : http://yfrog.com/z/e479911081p Może dodam, że mapa składa się z bit mapy która jest podzielona 8x8 po 20 pikseli. tak jak było pokazane w tutorialu Easykoder'a. Wiec myślałem, że wystarczy warunek: if((( map[mapa_y][mapa_x] ) == 16 ) ) { autoo_y = autoo_y - 1; }
i będzie działało, ale tak nie jest... Już sobie poradziłem wystarczyło lekko zmodyfikować : if((( map[autoo_y/20][autoo_x/20] ) == 16 ) ) { autoo_y = autoo_y - 1; }
Dziękuje za szybkie odpowiedzi. |
|
« 1 » |