[Allegro] strzał w strony myszy
Ostatnio zmodyfikowano 2009-06-01 22:20
DejaVu |
» 2009-06-01 00:15:03 To nie mój program - ja go tylko poprawiałem, żeby pocisk latał pod kątem ze stałą prędkością i w dowolnym kierunku. Nie chce mi się tłumaczyć programu, który działa. Możesz go sam przeanalizować. Nie ma tam niczego skomplikowanego poza wzorami trygonometrycznymi, które wynikają z matematyki, a nie z programowania. |
|
Camper Temat założony przez niniejszego użytkownika |
» 2009-06-01 14:45:26 Poradziłem sobie z tym kodem i strzelanie faktycznie działa, jednak że pomyślałem że to świetny code i moge go wykorzystać do poruszania ludzikiem(komputerowym graczem) w róźne miejsca (Sztuczna inteligencja). Przekształciłem kod jednak nie wiedzieć czemu nie działa... Po wylosowaniu pierwszych współrzędnych ludzik zachowuje się jak strzał (tj. leci do końca ekranu) a mnie zależy aby losował następne współrzędne i zmierzał do nich. Kod wygląda tak : if( chodzenie == false ) { a = random( 0, 800 ); b = random( 0, 600 ); }
if( chodzenie == false ) { if(( a + b ) > 0 ) { ib2x = bot_x; ib2y = bot_y; celb2x = a; celb2y = b; deltab2X = ib2x - celb2x; deltab2Y = ib2y - celb2y; chodzenie = true; } }
if(( deltab2Y ) == 0 ) { katb2 = 0; } else { katb2 = atan(( deltab2X ) /( deltab2Y ) ); }
if( deltab2Y >= 0 ) { katb2 += M_PI; }
if( chodzenie == true ) { if( ib2x != celb2x ) { ib2x += sin( katb2 ) * predkosc2; } if( ib2x == celb2x ) { if( ib2y != celb2y ) { ib2y += cos( katb2 ) * predkosc2; } if( ib2y == celb2y ) { chodzenie = false; } } }
bot_x = ib2x; bot_y = ib2y;
draw_sprite( bufor, bot, bot_x, bot_y );
|
|
DejaVu |
» 2009-06-01 17:36:10 To jest bardzo proste. Napisałem w tamtym poście żeby autor programu poprawił sobie, żeby obiekt się zatrzymywał jak doleci do celu. Obecnie nie zatrzymuje się dlatego, że nie trafia dokładnie w punkt (pomimo, iż przez niego przelatuje). wyobraź sobie: masz obiekt początkowo w punkcie (0,0). Obiekt ten chcesz aby przemiścił się do punktu (1,1). Obiekt porusza się z prędkością 1. Oczywiste jest, że przekątna wynosi 1*sqrt(2). Tak więc w ruchu drugim przeleci przez punkt. Powinien być warunek, że jeśli odległość do celu jest mniejsza niż prędkość, to następuje przypisanie: pozycja_celu = pozycja_punktu; W tym wypadku warunek zadziała: if( pozycja_celu == pozycja_punktu ) { }
|
|
Camper Temat założony przez niniejszego użytkownika |
» 2009-06-01 20:52:09 Ok, zatrzymywanie i zmierzanie do następnego punktu działa... jednak są też problemy ;p Otóż, postać dziwnie się teleportuje czasami do jakich współrzędnych nie wiedomo skąd. Po drugie Random co włączenie programu losuje te same liczby (tj. e kolejności np. 400, później 753, i tak samo po ponownym uruchomieniu programu.) Znam to już Pascala i chyba Delphi, ale czy nie da się czegoś z tym zrobić ? Kod : if( chodzenie == false ) { a = random( 0, 800 ); b = random( 0, 600 ); }
if( chodzenie == false ) { if(( a + b ) > 0 ) { ib2x = bot_x; ib2y = bot_y; celb2x = a; celb2y = b; deltab2X = ib2x - celb2x; deltab2Y = ib2y - celb2y; chodzenie = true; } }
if(( deltab2Y ) == 0 ) { katb2 = 0; } else { katb2 = atan(( deltab2X ) /( deltab2Y ) ); }
if( deltab2Y >= 0 ) { katb2 += M_PI; }
if( chodzenie == true ) { if( ib2x != celb2x ) { ib2x += sin( katb2 ) * predkosc2; } if(( celb2x - ib2x ) < predkosc2 ) { ib2x = celb2x; } if( ib2x == celb2x ) { if( ib2y != celb2y ) { ib2y += cos( katb2 ) * predkosc2; } } if(( celb2y - ib2y ) < predkosc2 ) { ib2y = celb2y; } if( ib2y == celb2y ) { chodzenie = false; } }
bot_x = ib2x; bot_y = ib2y;
draw_sprite( bufor, bot, bot_x, bot_y );
|
|
DejaVu |
» 2009-06-01 22:20:08 Załóż nowy temat. rand() to inna bajka i nie nawiązuje już do tematu. |
|
1 « 2 » |