Skocz do zawartości

"Przeskakiwanie" obiektów


Exigo

Rekomendowane odpowiedzi

Załóżmy że jest obiekt. On zaś się bardzo szybko porusza... (ma np. zmienną speed = 100) Przed nim jest inny obiekt, i ma się przy nim zatrzymać. Oczywiście "przeskakuje" przez niego ze względu na tą prędkość (pomijając room_speed).

Już wiecie w czym problem. Jak temu zaradzić? :]

Odnośnik do komentarza
Udostępnij na innych stronach

collision_line() uzyj :)

Odnośnik do komentarza
Udostępnij na innych stronach

Kuba, myślałem, że "lepszy" jesteś :P

 

Najprostszym rozwiązaniem jest nadanie obiektowi maski o długości równej jego prędkości.

A z wykorzystaniem collision_line():

GML
if(collision_line(xprevious, yprevious, x, y, obj, <jakieś inne argumenty - bodajże precision i notme - nie pamiętam dokładnie :P>)){ //koliduje }

 

Edit: A najlepszym i na dłuższą metę najprostszym rozwiązaniem jest napisanie własnej grawitacji/vspeed/hspeed/direction/speed - takiego, co automatycznie się w pętli zatrzyma na pozycji przed solidem... :)

Odnośnik do komentarza
Udostępnij na innych stronach

zawsze możesz zmniejszyć speed strzały do 2, ale zwiększyć room speed

 

BTW. dlaczego uważasz, że lengthdir ma tu być nie wydajny?

GML
[CreaTe]:

xp = x

yp = y //sztuczne xyprevious

 

[Step]:

if ( speed > 0 )

if ( collision_line( xp , yp , x , y , obj_enemy , 1 , 0 ))

{

for ( i = 0; i <= speed; i += 1 )

{

if ( place_meeting( xp + lengthdir_x( i , direction ) , yp + lengthdir_y( i , direction ) , obj_enemy ))

{

speed = 0

x = xp + lengthdir_x( i , direction )

y = yp + lengthdir_y( i , direction )

break

}

}

}

 

xp = x

yp = y

Jedyne 10 powtórzeń wykonywanych wyłącznie przy pierwszej kolizji ;)
Odnośnik do komentarza
Udostępnij na innych stronach

Hehe, ze nie pomysleliscie o metodzie stosowanej w octtree czy quadtree :P

 

Skrypt: "check_node"

GML
// argument0 - distance

// argument1 - source x

// argument2 - source y

// argument3 - vector x

// argument4 - vector y

// argument5 - object index

// return - distance between objects, free of collision

if(argument0>=1)

{

if( !collision_line(argument1, argument2, argument1+argument3*argument0/2, argument2+argument4*argument0/2, argument5,1,0) )

{

if( !collision_line(argument1+argument3*argument0/2, argument2+argument4*argument0/2, argument1+argument3*argument0, argument2+argument4*argument0, argument5,1,0) )

return(argument0)

else

return(check_node(round(argument0/2), argument1+argument3*argument0/2, argument2+argument4*argument0/2, argument3, argument4, argument5))

}

else

return(check_node(round(argument0/2), argument1, argument2, argument3, argument4, argument5))

}

else

return(argument0)

 

GML (create)
xp=x

yp=y

 

GML (step)
if(speed>0)

if(collision_line(xp,yp,x,y,obj_enemy,1,0))

{

vx=lengthdir_x(1,direction)

vy=lengthdir_y(1,direction)

dis=check_node(round(point_distance(xp,yp,x,y)),xp,yp,vx,vy,obj_enemy)

x=xp+vx*dis

y=yp+vy*dis

}

xp=x

yp=y

 

Oczywiscie nie testowalem tego w GM, ale 90% tego co pisze z glowy dziala :) (pech jak trafie na te 10% xD)

 

EDIT:

Zauwazylem ze ten kod w step jest jakis dziwny, powiedzmy ze elementy raczej ze soba malo maja wspolnego, tak wiec poprawiona wersja:

GML (step)
pdir=point_direction(xp,yp,x,y)

pdis=point_distance(xp,yp,x,y)

if(pdis>0)

if(collision_line(xp,yp,x,y,obj_enemy,1,0))

{

vx=lengthdir_x(1,pdir)

vy=lengthdir_y(1,pdir)

dis=check_node(round(pdis),xp,yp,vx,vy,obj_enemy)

x=xp+vx*dis

y=yp+vy*dis

}

xp=x

yp=y

Odnośnik do komentarza
Udostępnij na innych stronach

odchudzona wersja:

GML
if ( speed > 0 )

{

ID = collision_line( xp , yp , x , y , obj_enemy , 1 , 0 )

if ( ID > 0 ) //jeśli z czymś tam kolisuje

{

len = distance_to_object( ID )

 

speed = 0

x = xp + lengthdir_x( len , direction )

y = yp + lengthdir_y( len , direction )

}

}

 

xp = x

yp = y

;)

 

 

EDIT: wczoraj zrobiłem taki przykład: https://gmclan.org/up1558_11_Kuba_luk_przes...e_przebija.html i nie widzę aby coś było za wolne :P

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