wojownik266 Temat założony przez niniejszego użytkownika |
[Allegro] Jak to zrobić? » 2009-07-26 12:36:34 Witam. Jak zrobić coś takiego jak w kodzie poniżej z tą różnicą ze obrazek ma się pokazywać w określonym polu ekranu dopiero po wykryciu kolizji z obrazkiem i bez użycia funkcji rand? Mogę prosić o kawałek kodu ilustrującego to zagadnienie? Z góry dzieki!! int licznik = 0; licznik = rand() % 500; if( licznik == 40 ) { cel1.x = 120; cel1.y = 260; } if( licznik == 0 ) { cel1.x = 40; cel1.y = 40; } if( licznik == 5 ) { cel1.x = 60; cel1.y = 40; } if( licznik == 10 ) { cel1.x = 80; cel1.y = 100; } if( licznik == 15 ) { cel1.x = 360; cel1.y = 260; } if( licznik == 20 ) { cel1.x = 400; cel1.y = 40; } if( licznik == 25 ) { cel1.x = 540; cel1.y = 60; } if( licznik == 29 ) { cel1.x = 100; cel1.y = 65; } if( licznik == 32 ) { cel1.x = 60; cel1.y = 40; }
|
|
DejaVu |
» 2009-07-26 12:49:22 Nic nie rozumiem ;p zapewne nie tylko mnie to dotyczyć będzie ;p |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2009-07-26 13:34:48 W dużym uproszczeniu chodzi o wyświetlenie bitmapy na ściśle określonym polu ekranu ale dopiero po wystąpieniu kolizji. Przykład:następuje kolizja obiektu a z obiektem b, obiekt a wyswietlam na polu ekranu o współrzędnych: x=10,y=20.... Po kolejnej kolizji tych obiektów obiekt a wyświetlam na innej pozycji. W kodzie który przedstawiłem nieco wyzej (bez kolizji) obiekt a jest wyświetlany "pseudo losowo" na zadanych pozycjach... prościej już się chyba nie da. proszę o wskazówki może być "pseudokod". |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2009-07-26 13:43:40 #include <allegro.h>
BITMAP * bufor = NULL; BITMAP * smok = NULL; BITMAP * ludek = NULL; volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed ); LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
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 ); }; class Cpostac { public: short int x, y; short int s, w; }; Cpostac cel1, kursor1; int main() { allegro_init(); install_keyboard(); set_color_depth( 16 ); set_palette( default_palette ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) ); bufor = create_bitmap( 640, 480 ); smok = load_bmp( "smok.bmp", default_palette ); ludek = load_bmp( "ludek.bmp", default_palette ); int poz_x = 0, poz_y = 0, licznik = 0, punkty = 0; int ludek_x, ludek_y; cel1.x = 39; cel1.y = 39; cel1.s = 39; cel1.w = 39; kursor1.x = 40; kursor1.y = 40; kursor1.s = 40; kursor1.w = 40; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if( key[ KEY_LEFT ] ) { kursor1.x--; } if( key[ KEY_RIGHT ] ) { kursor1.x++; } if( key[ KEY_UP ] ) { kursor1.y--; } if( key[ KEY_DOWN ] ) { kursor1.y++; } licznik = rand() % 500; if( licznik == 0 ) { cel1.x = 10; cel1.y = 10; } if( licznik == 5 ) { cel1.x = 60; cel1.y = 40; } if( licznik == 10 ) { cel1.x = 80; cel1.y = 100; } if( licznik == 15 ) { cel1.x = 360; cel1.y = 240; } if( licznik == 20 ) { cel1.x = 600; cel1.y = 40; } speed--; } if( kolizja( cel1.x, cel1.y, cel1.s, cel1.w, kursor1.x, kursor1.y, kursor1.s, kursor1.w ) == true ) { punkty++; } clear_to_color( bufor, makecol( 0, 0, 0 ) ); int czas = clock() / 1000; textprintf_ex( bufor, font, 20, 20, makecol( 255, 255, 255 ), - 1, "ZDOBYTE PUNKTY = %d", punkty / 360, 0, 0 ); textprintf_ex( bufor, font, 20, 40, makecol( 200, 200, 200 ), - 1, "CZAS GRY = %d", czas, 0, 0 ); masked_blit( ludek, bufor, 0, 0, kursor1.x, kursor1.y, kursor1.s, kursor1.w ); masked_blit( smok, bufor, 0, 0, cel1.x, cel1.y, cel1.s, cel1.w ); blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } destroy_bitmap( bufor ); destroy_bitmap( smok ); destroy_bitmap( ludek ); remove_int( increment_speed ); allegro_exit(); return 0; } END_OF_MAIN();
|
|
DejaVu |
» 2009-07-26 13:44:55 Jeśli chodzi o kolizje to wszystkim z uporem maniaka daję linka http://archiwum.ddt.pl/?TextId=1660. Sprawa kolizji była wielokrotnie poruszana na forum. Jak sama funkcja do wykrywania kolizji to dla Ciebie za mało to możesz sobie też poczytać trochę innych tematów z forum [google] site:forum.ddt.pl kolizja. /edit: Hm... widzę trochę kodu wkleiłeś i masz w nim już tą funkcję ;p /edit2: Z tego co zrozumiałem to chcesz zrobić 'punkt' na planszy, który się zbiera (np. tak jak w grze wąż). Punkt jest tylko jeden i póki go nie zbierzesz to nie zmienia on swojej pozycji. Czyli... 1) masz pozycję obrazka, np. ox, oy. 2) domyślnie ustawiasz jakąś pozycję ox = 123, oy = 234; 3) sprawdzasz czy zachodzi kolizja obrazka z tym obiektem zbierającym. 4) jeśli kolizja zaszła - losujesz nową pozycję ox, oy tak długo dopóki nie będzie zachodziła kolizja z żadnym obiektem. |
|
wojownik266 Temat założony przez niniejszego użytkownika |
» 2009-07-26 14:22:48 Dzięki za wskazówki. Rozwiązanie mojego problemu ma się tak: if( kolizja( cel1.x, cel1.y, cel1.s, cel1.w, kursor1.x, kursor1.y, kursor1.s, kursor1.w ) == true ) cel1.x == 10; cel1.y == 10; if( kolizja( cel1.x, cel1.y, cel1.s, cel1.w, kursor1.x, kursor1.y, kursor1.s, kursor1.w ) == true ) cel1.x = 200; cel1.y = 100; if( kolizja( cel1.x, cel1.y, cel1.s, cel1.w, kursor1.x, kursor1.y, kursor1.s, kursor1.w ) == true ) cel1.x = 540; cel1.y = 124;
|
|
« 1 » |