polkom21 Temat założony przez niniejszego użytkownika |
[C++][Allegro] Postać spada mimo kolizji. » 2012-12-21 22:55:40 Wcześniej pisałem, że mam problem z kolizjami. Jest to moja pierwsza gra i to dla tego nie wiem jeszcze tylu rzeczy. Teraz mam taki problem, że postać mi spada z obiektu mimo kolizji. podejrzewam, że nie przeszkadzało by to zbytnio bo nie zamierzam, żeby na mapie było coś takiego ale na zaś lepiej żeby było wszystko ok. Jest jeszcze taki mały problem, że można bardzo łatwo zawiesić się na ścianie mapy i nie wiem jak to wyeliminować. Gra do sprawdzenia jak to działa: http://rapidgator.net/file/64660088/platformówka.zip.html main.cpp #include <allegro.h> #include "global.h" #include "graphic.h"
#define gravitation 2
volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
int main() { allegro_init(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); install_keyboard(); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 200 ) ); BITMAP * buffor = NULL; buffor = create_bitmap( 800, 600 ); DATAFILE * date = NULL; date = load_datafile( "graphic.dat" ); if( !date ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Blad ladowania grafik." ); allegro_exit(); return 0; } BITMAP * person = NULL; person = create_bitmap( 40, 40 ); clear_to_color( person, makecol( 0, 0, 0 ) ); int person_x = 100, person_y = 100; int rozmiar_x = 0, rozmiar_y = 0; const char * filemap = "map.txt"; int map[ 100 ][ 100 ]; LoadMap( filemap, map, rozmiar_x, rozmiar_y ); cout << "map X: " << rozmiar_x << " map Y: " << rozmiar_y << endl; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { int posX = person_x / 40, posY = person_y / 40; if( map[ posX ][ posY + 1 ] == 0 ) { person_y = person_y + gravitation; } if( key[ KEY_RIGHT ] && map[ posX + 1 ][ posY ] == 0 ) person_x++; if( key[ KEY_LEFT ] && map[ posX-- ][ posY ] == 0 ) person_x--; speed--; } show_position( person_x, person_y ); clear_to_color( buffor, makecol( 255, 255, 255 ) ); DrawMap( map, rozmiar_x, rozmiar_y, buffor, date ); masked_blit(( BITMAP * ) date[ 3 ].dat, buffor, 0, 0, person_x, person_y, person->w, person->h ); blit( buffor, screen, 0, 0, 0, 0, 800, 600 ); } remove_int( increment_speed ); unload_datafile( date ); destroy_bitmap( person ); destroy_bitmap( buffor ); allegro_exit(); return 0; } END_OF_MAIN();
Wiem wiem jest tu kilka zbędnych rzeczy takich jak bitmapa person ale to nie przeszkadza w obecnej chwili a usunę to zaraz. Jest jeszcze takie pytanie. Czy da się zrobić tak, żeby postać miała mniejszą szerokość i kolizja działała jak postać będzie się stykać z obiektem obok a nie tak jak teraz? |
|
DejaVu |
» 2012-12-21 22:58:05 Eh... temat kolizji to temat rzeka. Dokładnych kolizji nie zrobisz małym nakładem pracy (chyba, że użyjesz gotowej biblioteki typu Box2D). Pisanie prostych kolizji było wielokrotnie omawiane na forum, ostatnio nawet bardziej rozbudowane wątki się pojawiały, więc może warto je poczytać...? /edit: Google mówi tym samym, że ponad 400 stron na naszym forum zostało poświęconych temu problemowi... |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2012-12-21 23:14:38 No dobra pogrzebał bym z box2D ale to chyba raczej na SFML bym musiał przejść. Też ciężko jest cokolwiek znaleźć po polsku na temat box2D co z czym się je żeby to działało tak jak się chce. |
|
DejaVu |
» 2012-12-22 00:17:51 Box2D jest biblioteką niezależną więc nie ma znaczenia czy to będzie SFML czy Allegro. Po prostu integrujesz z jedną z nich. Co do kursu - weź oficjalnego tutoriala w języku angielskim.
PS. Wiedz, że będziesz musiał poświęcić sporo czasu na czytanie i na eksperymenty zanim uda Ci się zrobić pierwszą działającą scenę zgodnie z Twoimi oczekiwaniami. |
|
« 1 » |