TO_mek Opublikowano 27 Lipca 2013 Udostępnij Opublikowano 27 Lipca 2013 Witam! Mam taki oto skrypcik na celowanie pociskami do ruchomego celu. Niestety coś mi tu niedokładnie liczy i sporo pocisków nie trafia. Na ten tydzień limit poszukiwań czeskich błędów jest już mocno przekroczony więc proszę o pomoc tutaj. GML zasieg_x:=100; //zasieg wiezyczki p_speed:=1.2; //predkosc pocisku sila:=irandom(2)+1; //moc razenia pocisku gracz:=0; //nr gracza _wrog:=instance_nearest(x,y,oddzial_obj); //cel _wrog.speed=0.5 //predkosc wroga tez jest stala //***************************** CELOWANIE ********************************************************************** var _pocisk, _klatki_trafienie, _dystans, _droga_wroga; _pocisk:=instance_create(x+lengthdir_x(8,direction), y+lengthdir_y(8,direction), pocisk_obj); //wystrzel pocisk _pocisk.gracz:=gracz;//oznacz czyj to jest pocisk _pocisk.sila:=sila;//moc pocisku (ile 1 pocisk zabija przeciwnikow) _pocisk.speed:=p_speed;//1.2 _pocisk.alarm[0]:=zasieg_x/p_speed; //_pocisk.speed;//Zniszcz pocisk po wykroczeniu zasiegu strzalu wiezyczki with (_pocisk) { _dystans = point_distance(x,y,_wrog.x,_wrog.y) // jaka odleglosc dzieli pocisk od obcego _klatki_trafienie = _dystans/speed; // po ilu klatkach pocisk doleci do obcego z predkoscia jaka ma nadany pocisk _droga_wroga:=_wrog.speed*_klatki_trafienie; //odleglosc jaka pokona obcy w czasie w jakim poleci pocisk direction = point_direction(x,y,_wrog.x+lengthdir_x(_droga_wroga,_wrog.direction),_wrog.y+lengthdir_y(_droga_wroga,_wrog.direction)) //korekta kierunku uwzgledniajaca przesuniecie obcego x_docelowe_pocisku:=_wrog.x+lengthdir_x(_droga_wroga,_wrog.direction); //wspolrzedne docelowe w ktorym bedzie obcy gdy pocisk doleci do celu y_docelowe_pocisku:=_wrog.y+lengthdir_y(_droga_wroga,_wrog.direction); na_jaki_zasieg:=point_distance(xstart, ystart, x_docelowe_pocisku, y_docelowe_pocisku);// } naladowane:=false; alarm[1]:=fire_spd; //zalezne od szybkostrzelnosci dziala od 1 per 4 sek do 5 per 1 sek</span></span> Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 27 Lipca 2013 Udostępnij Opublikowano 27 Lipca 2013 ktos juz to zaprogramoval, to nie krepoj sie i uzyj ten script: GML /* ** Usage: ** intercept_course(origin,target,speed) ** ** Given: ** origin instance with position (x,y) ** target instance with position (x,y) and (speed) ** speed speed of the projectile ** ** Returns: ** course direction required to intercept ** a moving target at a given speed, ** or (-1) if no solution found ** ** GMLscripts.com */ { var origin,target,pspeed,dir,alpha,phi,beta; origin = argument0; target = argument1; pspeed = argument2; dir = point_direction(origin.x,origin.y,target.x,target.y); alpha = target.speed / pspeed; phi = degtorad(target.direction - dir); beta = alpha * sin(phi); if (abs(beta) >= 1) { return (-1); } dir += radtodeg(arcsin(beta)); return dir; } poprav GML direction = point_direction(x,y,_wrog.x+lengthdir_x(_droga_wroga,_wrog.direction),_wrog.y+lengthdir_y(_droga_wroga,_wrog.direction)) //korekta kierunku uwzgledniajaca przesuniecie obcego</span></span></span> na GML direction= intercept_course(id_strzelajocej_wiezy,_wrog,p_speed);i jak mas detekcje wroga v porzodku, to bedzie swietne robic swoje :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TO_mek Opublikowano 28 Lipca 2013 Autor Udostępnij Opublikowano 28 Lipca 2013 ktos juz to zaprogramoval, to nie krepoj sie i uzyj ten script i jak mas detekcje wroga v porzodku, to bedzie swietne robic swoje :) Jest perfekcyjnie :) PS.Mam nadzieje, że wiesz co to jest "czeski błąd" :) To taki wkurzający drobny błąd (np. zamias x dasz gdzies y) którego znajdowanie trwa bardzo długo a zwykle jest banalny. Ciekawe jak się u Was mówi na takie błędy. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 28 Lipca 2013 Udostępnij Opublikowano 28 Lipca 2013 ...PS.Mam nadzieje, że wiesz co to jest "czeski błąd" :) To taki wkurzający drobny błąd (np. zamias x dasz gdzies y) którego znajdowanie trwa bardzo długo a zwykle jest banalny. Ciekawe jak się u Was mówi na takie błędy.zyje z nim dzien co dzien :) ale ze mowicie "czeski" to jest dla mnie nowosc :D. u nas chyba blad to blad. ja czasami movie "chybka se vloudila"=drobnutki bledzik sie wkradl... tak nie poetyczne Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TO_mek Opublikowano 2 Sierpnia 2013 Autor Udostępnij Opublikowano 2 Sierpnia 2013 GML direction= intercept_course(id_strzelajocej_wiezy,_wrog,p_speed);i jak mas detekcje wroga v porzodku, to bedzie swietne robic swoje :) Mam jeszcze pytanko jak z tego uzyskać skorygowane współrzędne docelowe pocisku. Nawiązując do pytania Dawidssa w komentarzach z tego wątku o obliczaniu przyszłej pozycji gracza. "1. Chcemy obliczyć [odległość wieza - przyszła pozycja wojska], potrzebujemy do tego ofc: -pozycji wiezy (mamy) -przyszła pozycja wojska (nie mamy, liczymy) 2. Do obliczenia [przyszła pozycja gracza] potrzebujemy: -kierunku wojska (mamy) -jego prędkości (mamy) -czasu, jaki zajmie pociskowi dotarcie do tej [przyszłej pozycji gracza] - (nie mamy, liczymy) 3. Do obliczenia [czasu jaki zajmie pociskowi dotarcie do tej [przyszłej pozycji]] potrzebujemy: -prędkości pocisku (mamy) -dystansu jaki musi przebyć pocisk, czyli właśnie [odległość wieza - przyszła pozycja wojska] - no jak nieciężko zauważyć, zapętliliśmy się." Akurat przy zwykłym strzelaniu skrypt intercept_course nadaje kierunek pociskom i sparawa zalatwiona ale jak z tego wyliczyc punkt zderzenia pocisku i wojska? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 3 Sierpnia 2013 Udostępnij Opublikowano 3 Sierpnia 2013 Mam jeszcze pytanko jak z tego uzyskać skorygowane współrzędne docelowe pociskuscript intercept_course(id_strzelajocej_wiezy,_wrog,p_speed) zwraca direction dla wiezy strzelajocej do wroga pociskami o p_speed. script sam sobie sprawdzi pozicje obj i wykalkuluje dla speed przyslom pozycje wroga. z tej pozycji nastepnie sprawdzi direction a zwroci jako resultat :) co do x, y sproboj aplikovac lenghdirx (odleglosc_calkulovana_z_speed, direction) najlepiej Twierdzenie cosinusów dowod2 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się