zax090 Temat założony przez niniejszego użytkownika |
[allegro] ograniczony obszar » 2008-05-04 16:45:18 Kombinuje jak koń pod górkę z marnym skutkiem :D 1.Jak można zrobić żeby moja postać nie przechodziła poza obszar buferu chodzi o kolizje ?(np. mam bufer jako bitmapa 800x600 i gdzy moja postać idzie do góry to zanika mi poza monitorem i znika)Jak to można zrobić 2.czy da się gdy mamy dużą mapę, zrobić tak( w przypadku widoku z góry) że ta mapa przesuwa się razem z postacią (chyba wiadomo może słabo sprecyzowane) oto kod thx :P #include <allegro.h>
int main() { allegro_init(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT, 800, 600, 0, 0 ); clear_to_color( screen, makecol( 128, 128, 128 ) ); BITMAP * bufor = NULL; BITMAP * ludek = NULL; bufor = create_bitmap( 640, 480 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "Nie mogę utworzyć bufora !" ); allegro_exit(); return 0; } ludek = load_bmp( "ludek.bmp", default_palette ); if( !ludek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka Ludek !" ); allegro_exit(); return 0; } int ludek_x = 100, ludek_y = 100; while( !key[ KEY_ESC ] ) { if( key[ KEY_LEFT ] ) ludek_x--; if( key[ KEY_RIGHT ] ) ludek_x++; if( key[ KEY_UP ] ) ludek_y--; if( key[ KEY_DOWN ] ) ludek_y++; clear_to_color( bufor, makecol( 128, 128, 128 ) ); rest( 8 ); masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h ); blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } destroy_bitmap( ludek ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
|
|
dudek |
» 2008-05-04 17:48:22 Rozwiązanie pierwszego problemu jest bardzo proste:) dla bufora 640 x 480 zamień linijki, wktorych sprawdzasz jaki zostal wcisnięty przycisk na te: if(( key[ KEY_LEFT ] ) &&( ludek_x > 0 ) ) ludek_x--;
if(( key[ KEY_RIGHT ] ) &&( ludek_x < 600 ) ) ludek_x++;
if(( key[ KEY_UP ] ) &&( ludek_y > 0 ) ) ludek_y--;
if(( key[ KEY_DOWN ] ) &&( ludek_y < 440 ) ) ludek_y++;
Pewnie Cie dziwi dlaczego 600 a nie 640 i 440 a nie 480. Otoz Wspolrzędne ludzika sa ustawione na jego lewym górnym rogu więc gdy styka sie z prawą i dolną ściana przeniknie ja az jego lewy górny róg zetknie sie z krawędzia. Dlatego trzeba odjąc wysokość i szerekość obrazka od 640 i 480 i gotowe:) Obrazek o ile pamietam byl 40 na 40 więc tu już masz gotowca. Jeśli chodzi o drugą sprawe to tak da się. To jest scrolling ekranu ale żeby cos wiecęj się dowiedzieć musisz wejść na strone easykodera do działu MAPA tam jest troche to opisane. A jak to jest za mało to zostaje Ci tylko help allegro:) ja sie jeszcze tym nie zajmowałem więc Ci nie pomoge przynamniej narazie:) narazie bo w planach miałem RTS w 2d ale czasu narazie brak:[ |
|
zax090 Temat założony przez niniejszego użytkownika |
» 2008-05-04 19:20:04 czy tą samą technikę można zastosować gdy mamy zrobioną 2 przeszkodą a chcemy by z każdej strony nie mógł na nią wejść. po prostu gdy mam 2 postać to ta 1 gdy nią poruszam nakłada się na tą 2 postać, a chce żeby była z każdej strony "ogrodzona" |
|
DejaVu |
» 2008-05-04 19:58:19 Przykład zastosowania kolizji razem z kodem znajdziesz w tym temacie: http://ddt.pl/forum/?Tid=126&p=3. /edit: Ta funkcja wykrywa czy obiekty się zderzyły (obiekty są prostokątami): x - współrzędna x y - współrzędna y s - szerokość w - wysokość bool kolizja( float x1, float y1, float s1, float w1, float x2, float y2, float s2, float w2 ) { if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return( true ); return( false ); };
|
|
zax090 Temat założony przez niniejszego użytkownika |
» 2008-05-04 21:24:40 to jak to tu ma wyglądać bo jak cały czas robie to mi błędy wyskakują ;/ ? thx :D #include <allegro.h>
int main() { allegro_init(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT, 800, 600, 0, 0 ); clear_to_color( screen, makecol( 128, 128, 128 ) ); BITMAP * bufor = NULL; BITMAP * ludek = NULL; BITMAP * ludek1 = NULL; 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; } ludek = load_bmp( "ludek.bmp", default_palette ); if( !ludek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka Ludek !" ); allegro_exit(); return 0; } int ludek_x = 100, ludek_y = 100; ludek1 = load_bmp( "ludek1.bmp", default_palette ); if( !ludek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka Ludek !" ); allegro_exit(); return 0; } int ludek1_x = 200, ludek1_y = 200; while( !key[ KEY_ESC ] ) { if(( key[ KEY_LEFT ] ) &&( ludek_x > 0 ) ) ludek_x--; if(( key[ KEY_RIGHT ] ) &&( ludek_x < 680 ) ) ludek_x++; if(( key[ KEY_UP ] ) &&( ludek_y > 0 ) ) ludek_y--; if(( key[ KEY_DOWN ] ) &&( ludek_y < 480 ) ) ludek_y++; clear_to_color( bufor, makecol( 128, 128, 128 ) ); rest( 3 ); masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h ); masked_blit( ludek1, bufor, 0, 0, ludek1_x, ludek1_y, ludek1->w, ludek1->h ); blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } destroy_bitmap( ludek ); destroy_bitmap( ludek1 ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
|
|
DejaVu |
» 2008-05-05 12:03:59 Wklej log kompilacji... :) |
|
zax090 Temat założony przez niniejszego użytkownika |
» 2008-05-06 11:19:56 używając takiego czegoś mój ludek przeskakuje po narożnikach, zamiazt płynnie chodzić po obwodzie....czy ktoś mógłby mi pomóc i mnie poprawić bo w tych klockach akurat kuleje :/ bool kolizja( int x1, int y1, int s1, int w1, int x2, int y2, int s2, int w2 ) { if( x2 <= x1 + s1 && x2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else if( x2 <= x1 + s1 && x2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else return false; };
if( kolizja( ludek1.x, ludek1.y, ludek1.s, ludek1.w, ludek2.x, ludek2.y, ludek2.s, ludek2.w ) == true ) { if(( ludek1.x < ludek2.x ) ) { ludek1.x = ludek2.x - ludek2.s; } if(( ludek1.x > ludek2.x ) ) { ludek1.x = ludek2.x + ludek2.s; } if(( ludek1.y > ludek2.y ) ) { ludek1.y = ludek2.y + ludek2.w; } if(( ludek1.y < ludek2.y ) ) { ludek1.y = ludek2.y - ludek2.w; } }
|
|
DejaVu |
» 2008-05-08 20:04:13 Co chcesz uzyskać: a) ludek, który się porusza po ekranie strzałkami i nie może wyjechać poza obszar b) ludek, który się porusza po obwodzie drugiego ludka i nie może się od niego odrywać (nie może być osobno) c) ludek, który nie może przenikać przez drugiego ludka - zatrzymuje się jeśli nie można iść w danym kierunku bo drugi ludek stoi na drodze d) inne... jakie? |
|
« 1 » 2 |