Exigo Opublikowano 14 Stycznia 2009 Udostępnij Opublikowano 14 Stycznia 2009 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 Więcej opcji udostępniania...
PsichiX Opublikowano 14 Stycznia 2009 Udostępnij Opublikowano 14 Stycznia 2009 collision_line() uzyj :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Exigo Opublikowano 14 Stycznia 2009 Autor Udostępnij Opublikowano 14 Stycznia 2009 Przykładowo? :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 14 Stycznia 2009 Udostępnij Opublikowano 14 Stycznia 2009 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 Więcej opcji udostępniania...
Marek.S Opublikowano 14 Stycznia 2009 Udostępnij Opublikowano 14 Stycznia 2009 GML if ( collision_line( x , y , xprevious , xprevious, obj , 1 , 0 )) //akcja E: zule :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Egzekutor Opublikowano 14 Stycznia 2009 Udostępnij Opublikowano 14 Stycznia 2009 STEP: if(collision_line(x,y,x,y,object,true,false)) { instance_destroy() } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Marek.S Opublikowano 14 Stycznia 2009 Udostępnij Opublikowano 14 Stycznia 2009 STEP: if(collision_line(x,y,x,y,object,true,false)) { instance_destroy() } ale żeś wystrzelił.. od sprawdzania kolizji w punkcie jest collision point... :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Exigo Opublikowano 14 Stycznia 2009 Autor Udostępnij Opublikowano 14 Stycznia 2009 Dobra... wszystko ładnie ale coś czuje niesmak... Da się jakoś "dopchnąć" go do obiektu? Ps: ...y , xprevious , xprevious, obj... - ekhm. :P Ps2: Dlaczego od razu "słabszy"? Po prostu nie znałem czegoś takiego jak "collision_line" i nie wiedziałem jak tego użyć. :< Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Marek.S Opublikowano 14 Stycznia 2009 Udostępnij Opublikowano 14 Stycznia 2009 x = other.x - iles y = other.y Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Exigo Opublikowano 14 Stycznia 2009 Autor Udostępnij Opublikowano 14 Stycznia 2009 Trzeba było użyć lengthdirów.... Sęk w tym że zbyt wolne. :/ Istnieje jakiś "szybszy" sposób? ^^ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Marek.S Opublikowano 14 Stycznia 2009 Udostępnij Opublikowano 14 Stycznia 2009 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 Więcej opcji udostępniania...
Exigo Opublikowano 15 Stycznia 2009 Autor Udostępnij Opublikowano 15 Stycznia 2009 Napisałem coś w podobie ale na innej zasadzie działania... Sęk w tym że i tak wolne... :/ (speed rooma nie mam zamiaru zwiększać) Może zna ktoś jakiś szybszy sposób? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 15 Stycznia 2009 Udostępnij Opublikowano 15 Stycznia 2009 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 Więcej opcji udostępniania...
Marek.S Opublikowano 15 Stycznia 2009 Udostępnij Opublikowano 15 Stycznia 2009 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 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ę