RazzorFlame Temat założony przez niniejszego użytkownika |
[Allegro] Mapa kafelkowa - kolizje » 2011-11-20 18:10:48 Mam pytanie. Powiedzmy ze mamy ludka i kafelki. Czy w platformowce zeby sprawdzić kolizje z wszystkimi kafelkami z mapy trzeba robic kilka/kilkanascie roznych bitmap? Np chciałbym aby ludek nie spadał z ziemi. To wtedy mi sprawdza kolizje tylko z 1 kafelkiem. Niechce zadnego kodu tylko przykład jak mozna to zrobic POMOCY! |
|
SeaMonster131 |
» 2011-11-20 18:12:17 Tzn? Jeżeli masz mapę kafelkową to dajesz np: if( mapa[ ludek.y / dlugosc_kafelka ][ ludek.x / szerokosc_kafelka ] != ziemia ) ludek.y++;
|
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2011-11-20 18:16:43 Np masz mape: short int map[ 10 ][ 10 ] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
Np 1 to ziemia. I tych kafelkow jest tu 5. To trzeba 5 bitmap robic? |
|
pekfos |
» 2011-11-20 18:21:25 nie. wystarczy jedna. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2011-11-20 18:26:44 Pefkos. Mam taki kod: main.cpp #include <allegro.h> #include "decl.h"
int main() { allegro_init(); install_mouse(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); set_palette( default_palette ); set_window_title( "Collision" ); clear_to_color( screen, 48 ); BITMAP * bufor = NULL; bufor = create_bitmap( 800, 600 ); OBJECT back; OBJECT ludek; back.x = 200; back.y = 400; back.w = 50; back.h = 50; back.bmp = load_bmp( "back1.bmp", default_palette ); ludek.w = 18; ludek.h = 48; ludek.x = 200; ludek.y = 200; ludek.bmp = load_bmp( "image.bmp", default_palette ); show_mouse( screen ); while( !key[ KEY_ESC ] ) { back.x = 0; unscare_mouse(); if( key[ KEY_RIGHT ] ) ludek.x++; if( key[ KEY_LEFT ] ) ludek.x--; if( collide_up( ludek, back ) == true ) ludek.y = back.y - ludek.h - 1; if( collide_down( ludek, back ) == true ) ludek.y = back.y + back.h + 1; if( collide_up( ludek, back ) == false ) ludek.y += 3; while( back.x != 800 ) { masked_blit( back.bmp, bufor, 0, 0, back.x, back.y, back.w, back.h ); back.x += 50; } masked_blit( ludek.bmp, bufor, 0, 0, ludek.x, ludek.y, ludek.w, ludek.h ); blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); clear_to_color( bufor, makecol( 255, 255, 255 ) ); } return 0; } END_OF_MAIN();
decl.h class OBJECT { public: int x; int y; int w; int h; int b; int c; BITMAP * bmp; };
bool collide_up( OBJECT A, OBJECT B ) { if( A.y >= B.y - A.h - 1 && A.y < B.y + B.h / 2 && A.x + A.w >= B.x && A.x <= B.x + B.w ) return true; else return false; }
bool collide_down( OBJECT A, OBJECT B ) { if( A.y <= B.y + B.h && A.y > B.y && A.x + A.w >= B.x && A.x <= B.x + B.w ) return true; else return false; } Nie działa mi kolizja z wszystkimi. |
|
pekfos |
» 2011-11-20 18:55:49 |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2011-11-20 18:56:49 Ma sens tam jest definicja. Pozatem wtedy nieda sie przejsc przez bitmape. |
|
pekfos |
» 2011-11-20 19:00:43 jak ma sens? jeśli dobrze rozumiem to pseudokodem można to tak zapisać jeżeli gracz koliduje dolną krawędzią z czymś to przenieś gracza za dolną krawędź tego czegoś // i zmień nazwę tematu |
|
« 1 » 2 |