Skocz do zawartości

Trafianie do ruchomego celu


TO_mek

Rekomendowane odpowiedzi

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

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

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

...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

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

Mam jeszcze pytanko jak z tego uzyskać skorygowane współrzędne docelowe pocisku
script 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

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ę
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...