malpka321 Temat założony przez niniejszego użytkownika |
» 2009-06-30 20:28:30 wiem wiem, tylko gdybym umiał rozwiązać ten problem to bym nie pisał na forum i nie zawracał wam głowy, ale i tak dzięki-może mi coś zaświta w głowie i rozwiąże problem |
|
DejaVu |
» 2009-06-30 21:35:40 1. ustal położenie obiektu po wciśnięciu klawisza (lub po uwzględnieniu grawitacji) 2. ustal zbiór klocków, które zajmuje ludek 3. dla każdego klocka zajmowanego wykonuj: 3.1. jeśli klocek jest kolizją - porównaj algorytmem wykrywania kolizji czy ludek najeżdża na klocek - jeśli tak -> kolizja na danym klocku.
Algorytm kolizji powinien być w tym przypadku ten, który podałem wcześniej, tj. wykrywanie zderzeń prostokątów. Używanie wykrycia kolizji w Twojej postaci nie zda egzaminu. Ty obecnie sprawdzasz tylko czy ludek zajmuje klocek i dlatego masz problemy.
/edit: Po głębszym zastanowieniu Twój algorytm wykrywania kolizji zadziała, jeśli wyznaczysz prawidłowo zbiór klocków, które zajmuje ludek :)
/edit2: Innymi słowy musisz wyznaczyć te klocki, które są zaznaczone na różowo :) |
|
malpka321 Temat założony przez niniejszego użytkownika |
» 2009-07-02 21:32:01 próbowałem napisać kod tym sposobem co napisałeś, ale kurcze za nic mi nie wychodzi. Stworzyłem również 4 nowe zmienne- pozycje ludka w każdym kierunku +/- 1.tzn. np. (ludek.x-1)/40, (ludek.y+1)/40 itd.- niestety kolizja nie działa. |
|
DejaVu |
» 2009-07-02 23:14:39 #include <allegro.h> #include "postac.h" #include "game.h"
int main() { uruchom_allegro(); BITMAP * bufor = create_bitmap( 640, 480 ); BITMAP * ludekb1 = NULL; BITMAP * ludekb2 = NULL; BITMAP * tlo = NULL; BITMAP * teren = NULL; teren = load_bmp( "teren.bmp", default_palette ); ludekb1 = load_bmp( "ludek.bmp", default_palette ); tlo = load_bmp( "tlo.bmp", default_palette ); ludekb2 = load_bmp( "ludekb2.bmp", default_palette ); bohater ludek, ludek2; ludek.x = 440; ludek.y = 40; ludek.s = 40; ludek.w = 40; ludek2.x = 300; ludek2.y = 300; ludek2.s = 40; ludek2.w = 40; ludek.dodaj_wartosci(); bool help = false; bool kolizja = false; bool grawitacja; bool mp = true; bool ml; double predkoscLotu = 0; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { grawitacja = true; mp = true; ml = true; ludek.update(); for( int x = ludek.x; x <= ludek.x + 40; x += 39 ) for( int y = ludek.y; y <= ludek.y + 40; y += 39 ) if( x <= 600 && y <= 440 ) { if(( map[( y +( int ) predkoscLotu ) / 40 ][ x / 40 ] ) == 15 ) grawitacja = false; if(( map[ y / 40 ][( x - 1 ) / 40 ] ) == 15 ) ml = false; if(( map[ y / 40 ][( x + 1 ) / 40 ] ) == 15 ) mp = false; } if( ml == true ) { if( key[ KEY_LEFT ] ) ludek.x--; } if( mp == true ) { if( key[ KEY_RIGHT ] ) ludek.x++; } if( grawitacja == false ) predkoscLotu = 1; if( key[ KEY_UP ] && grawitacja == false ) predkoscLotu =- 4; if( grawitacja == true ) { ludek.y += predkoscLotu; predkoscLotu += 0.1; } if( key[ KEY_A ] ) ludek.expup( 100 ); if( key[ KEY_S ] ) ludek.hpup( 100 ); if( key[ KEY_D ] ) ludek.hpdown( 100 ); if( key[ KEY_P ] ) help = true; if( key[ KEY_O ] ) help = false; if( ludek.y < 0 ) ludek.y = 0; if( ludek.x < 0 ) ludek.x = 0; if( ludek.y > 440 ) ludek.y = 440; if( ludek.x > 600 ) ludek.x = 600; speed--; } clear_to_color( bufor, makecol( 150, 150, 150 ) ); if( ludek.exp > ludek.max_exp ) { ludek.lvlup(); } wys_mape( bufor, teren ); masked_blit( ludekb1, bufor, 0, 0, ludek.x, ludek.y, ludek.s, ludek.w ); masked_blit( ludekb2, bufor, 0, 0, ludek2.x, ludek2.y, ludek2.s, ludek2.w ); masked_blit( tlo, bufor, 0, 0, 5, 5, 200, 100 ); ludek.wyswietl( bufor ); blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } destroy_bitmap( bufor ); destroy_bitmap( ludekb1 ); destroy_bitmap( ludekb2 ); destroy_bitmap( tlo ); destroy_bitmap( teren ); allegro_exit(); return 0; } END_OF_MAIN();
|
|
malpka321 Temat założony przez niniejszego użytkownika |
» 2009-07-03 13:17:17 WIELKIE DZIĘKI. Teraz przeanalizuje kod i zobaczę jak to zrobiłeś mistrzu xD Problem rozwiązany !!!
|
|
1 « 2 » |