Skocz do zawartości

Kolizja pocisku


Rekomendowane odpowiedzi

Witam w większości moich produkcji przewija się ten sam problem związany z kolizją pocisku , postanowiłem w końcu się za to zabrać , a że skoro nie wychodziło to sięgam rady specjalistów . Postaram się teraz opisać nieco jaśniej mój "kłopot" - mianowicie jeśli wdaje się w strzelaninę i odejdę na odpowiedni dystans pocisk przelatuje tuż obok mnie . Wygląda to tak jakby pocisk zamiast lecieć jednym, prostym ciągiem , robił to " w częściach " . Dla jasności wrzucę obrazek z zaistniałą sytuacją :

bladnaprawa.png

Do screena już ręcznie dorobiłem te " urywki " , bo nie mogłem ich uchwycić na obrazku .

PS Próbowałem kombinować z maskami , ale efekt niestety nie był zadowalający ...

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Jeśli prędkość pocisku jest większa niż jego długość, to w każdym kolejnym kroku (a jest ich tyle co wynosi room_speed, czyli defaultowo 30) na kilku pikselach kolizji nie ma, jednak jeśli prędkość pocisku < szerokości jego i postaci, to powinno być ok.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli prędkość pocisku jest większa niż jego długość, to w każdym kolejnym kroku (a jest ich tyle co wynosi room_speed, czyli defaultowo 30) na kilku pikselach kolizji nie ma, jednak jeśli prędkość pocisku < szerokości jego i postaci, to powinno być ok.

No faktycznie , ale spójrzmy na to z innej strony . Muszę teraz przykładowo zmieniać speed pocisku z 20 na 4 , a to jest diametralna zmiana . Czy jest jeszcze jakaś inna możliwość ?

Odnośnik do komentarza
Udostępnij na innych stronach

GML
if collsion_line(x,y,xprevious,yprevious,wrog,0,0){

var xx,yy,kolizja;

xx=xprevious

yy=yprevious

kolizja=collision_point(xx,yy,wrog,0,0)

while(kolizja<=0){

xx+=hspeed/10

yy+=vspeed/10

kolizja=collision_point(xx,yy,worg,0,0)

}

with(kolizja){

odjecie hp

}

}

 

optymalniej bedzie wysukiwaniem binarnym, platyna pisal

Odnośnik do komentarza
Udostępnij na innych stronach

karolo320, słyszałeś o do...while? :)

 

Po za tym nie wiem co Ty w ogóle liczysz. Wystarczy sprawdzić kolizję po linii i wywołać domyślne zdarzenie kolizji, które już ma.

GML
collision = collision_line( xprevious, yprevious, x, y, wrog, true, true );

if( collision != noone ) {

event_perform( ev_collision, collision.object_index );

 

with( collision ) {

event_perform( ev_collision, other.object_index );

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

1. collision_line nie collsion_line.

2. hspeed i vspeed równe jest 0 jeśli manipuluje się bezpośrednio na x i y.

3. Wystarczy wykorzystać domyślne zdarzenie kolizji do odjęcia HP, on już tam ma cały kod do tego.

4. Jeśli już tak dokładny jesteś:

GML
object = collision_line( xprevious, yprevious, x, y, wrog, true, true );

if( object ) {

sx = xprevious;

sy = yprevious;

ex = x;

ey = y;

while( point_distance( sx, sy, ex, ey ) > 5 ) {

cx = ( sx + ex ) / 2;

cy = ( sy + ey ) / 2;

collision = collision_line( sx, sy, cx, cy, wrog, true, true );

if( collision != noone ) {

ex = cx;

ey = cy;

object = collision;

}

else {

sx = cx;

sy = cy;

}

}

 

event_perform( ev_collision, object.object_index );

 

with( object ) {

event_perform( ev_collision, other.object_index );

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

  • 11 miesięcy temu...

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