Skocz do zawartości

Fizyka deski


kt1117

Rekomendowane odpowiedzi

Witam, podchodzę do tego problemu już któryś raz, ale nie mogę go rozwiązać. Więc jest problem, ponieważ mam obiekt A, ma on robić za element terenu. Pod tym obiektem znajduje się zawsze inny element terenu B, ale zniszczalny. I teraz gdy element B zostanie zniszczony, element A ma spaść. Tylko, że może na swojej drodze spotkać element C, czyli obiekt, który jest głównym terenem. Niezniszczalny, nieprzesuwalny. I w tym problem, że element A musi być solid, bo bohater musi po nim chodzić. Wiadomo też, że nie powinno się dawać solid obiektowi w ruchu. Dodatkowo obiekt A powinien obrócić się w lewo, gdy jest podparty tylko z prawej strony i odwrotnie. mój kod jest taki:

GML (step)
n=0

while (n<129)

{

if !place_empty(x+lengthdir_x(n,image_angle) ,y+lengthdir_y(n,image_angle)+1)

{

ok=1

}

n+=1

}

 

if ok=0

image_angle+=1

 

while (n<256)

{

if !place_empty(x+lengthdir_x(n,image_angle) ,y+lengthdir_y(n,image_angle)+1)

{

ok=1

}

n+=1

}

 

 

if ok=0

image_angle-=1

GML (Begin step)
a=0

GML (End step)
if a=0

y+=2

GML (kolizja z C z B taka sama)
move_contact_solid(270,vspeed)

 

vspeed=0

a=1

 

Obiekt A niestety nie obraca się, i dopóki na początku gry nie spadnie, gra zamula. Prosiłbym o pomoc w zrozumieniu problemu.

Odnośnik do komentarza
Udostępnij na innych stronach

1. Odznacz solid obiektowi A, daj mu parenta i niech gracz sprawdza i obiekty solid i tego parenta równocześnie gdy spada/idzie.

2. Obracanie zrób prostym warunkiem, że jak A dotyka z lewej strony solida lub co tam chcesz i równocześnie nie dotyka z drugiej to się obraca np. prawo, jeśli jest na odwrót to w lewo. Zrobiłem tak w mojej platformówce z fizyką i działa dobrze w 90%.

3. Muli Ci bo masz dużą maskę obiektu A. zmniejsz ją do możliwie najmniejszych rozmiarów (np kreskę zrób ).

Odnośnik do komentarza
Udostępnij na innych stronach

Parent ma mieć solid?

 

Nie. Dorabiasz obiekt 'parent_A' i bohater będzie sprawdzał tak

 

GML
place_free(x,y+10+vspeed) && ! place_meeting(x,y+10+vspeed,parent_A)

{

gravity=0.1

}

else

{

gravity=0

}

 

Edit: oczywiście obiektowi A ustawiasz parent jako parent_A.

Odnośnik do komentarza
Udostępnij na innych stronach

Mogę udostępnić. Ale nie działa to w stu procentach.

GML (Step)
if image_angle!=0

{

ky=y+lengthdir_y(256,image_angle)

kx=x+lengthdir_x(256,image_angle)

sry=y+lengthdir_y(128,image_angle)

srx=x+lengthdir_x(128,image_angle)

}

 

if x>kx

roz=10

else

roz=-10

 

if collision_line(x+roz,y+33,srx-roz,sry+33,all,1,0)

image_angle-=1

 

if collision_line(srx+roz,sry+33,kx-roz,ky+33,all,1,0)

image_angle+=1

GML (Draw)
draw_sprite_ext(sprite11,0,x,y,1,1,image_angle,image_blend,1)

//ten kod w celu debugu

draw_set_color(c_blue)

draw_line(x+roz,y+32,srx-roz,sry+32)

draw_set_color(c_green)

draw_line(srx+roz,sry+32,kx-roz,ky+32)

Te wszystkie 32 zamień na wysokość sprita. Reszta eventów z poprzedniego kodu. Wartość roz też zmień sobie. pod deską pojawią się kolorowe kreski, jak jedną "przerwiesz" to obiekt się przekręci. Później wywal ten kod z drawa "ten do debugu". Następnie w kodzie bohatera do każdego if place_free dopisz && !place_meeting, tylko z odwróconym znakiem. I jak przed place_free masz wykrzyknik to && zmień na or.

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