Skocz do zawartości
  • 0
Penguin

Problem z "wchodzeniem pod górkę"

Pytanie

     Witam, tak jak w tytule tematu mam problem z ukośnymi platformami. Mam 4 objekty, -oPlayer (gracz) -oBlock (rodzic dalszych objektów)-oBlock1 (trójkąt prostopadły, który ma kąt prosty przy wierzchołku, który jest po prawej stronie na dole sprite'a, który ma pole 32x32, a dwa kąty najbliższe tego wierzchołka są równej długości(trochę to długie)),- oBlock2 ( to samo, tylko że po lewej stronie na dole). Gracz nie ma problemu z przesuwaniem się po oBlock1, i przesuwa się, tak jak powinien, lecz z oBlock2 gdy oPlayer próbuje po nim przejść, objekt się blokuje i nie potrafi zrobić byle jakiego ruchu w byle jakim kierunku. Jak to naprawić?

 

Kody oPlayer:

Create:

v=1
max_y=5

Step:

if place_free(x,y+1)
vspeed+=1;

Kolizja z oBlock:

move_contact_solid (270,4)
    vspeed = 0

Keyboard <Left>:

yy=0;
ok=0;
while (yy<=max_y&&ok=0)
{
    if (place_free(x-v,y-yy))
    {
        x-=v;
        if (!place_free(x,y+1)&&vspeed=0)
        y-=yy;
        ok=1;
    }
}

if(!place_free(x,y+max_y)&&vspeed=0)
move_contact_solid(270,max_y);

Keyboard <Right>:

yy=0;
ok=0;
while(yy<=max_y&&ok=0)
{
   if(place_free(x+v,y-yy))
   {
      x+=v;
      if(!place_free(x,y+1)&&vspeed=0)
      y-=yy;
      ok=1;
   }
   yy+=1;
}

if(!place_free(x,y+max_y)&&vspeed=0)
move_contact_solid(270,max_y);yy=0;

Press <Up>

if(!place_free(x,y+1))
vspeed=-15; 

Kody w oBlock:

Kolizja z oPlayer:

with(oPlayer)
{
if (vspeed>0&&!place_free(x,y+vspeed))
move_contact_solid(270,vspeed);
vspeed=0;
}

W sprite oBlock1 i oBlock2 mam zaznaczone:

-Precise collision checking

-Separate collision mask

oBlock nie ma sprite.

Dziękuję i pozdrawiam

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

8 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Widzisz, są dwa sposoby na kolizje:

 

1. Wszystko sie rusza jak chce, a jesli wykryje ze cos w cos wlazlo, to wypycha jedna z rzeczy zeby sie juz nie stykaly.

2. Wszystko sprawdza czy moze sie ruszyc bez kolidowania z innymi obiektami. Jezeli nie ma kolizji, ruch jest dozwolony.

 

Ty korzystasz z metody 1szej, która jest...słaba, żeby się nie wyrażać, a w każdym razie ja nie jestem jej fanem.

Proponuję Ci zrobić ruszanie się i kolizje na nowo, używając metody #2, a ruszanie się po skosach wyjdzie Ci automagicznie samo z siebie po dodaniu drobnych poprawek. do kodu poruszania się.

 

Przykładowo, ruch w prawo może wyglądać na jeden z dwóch poniższych sposobów:

if place_free(x+5,y) x+=5; //Metoda 1sza, dziala na wszystkie obiekty SOLID
if !place_meeting(x+5,y,Parent_Obiektow_Solidnych) x+=5; //Metoda 2ga, dziala na obiekt Parent_Obiektow_Solidnych i ich wszystkie dzieci

 

Dla płynnego poruszania się możemy użyć pętli for:

for(var i=0;i<5;i++){
 if !place_meeting(x+1,y,Parent_Obiektow_Solidnych) x+=1;
}

 

Nastepnym krokiem jest dodanie "co jeśli jednak jest kolizja" czyli:

for(var i=0;i<5;i++){
 if !place_meeting(x+1,y,Parent_Obiektow_Solidnych) x+=1;
 else{
  //Co jeśli jest kolizja na x+1
 }
}

 

Ten kod musimy wypełnić sprawdzeniem czy jeżeli podniesiemy się o Y pikseli do góry czy nie będzie kolizji. W ten sposób powstaje ruch po skosie!

for(var i=0;i<5;i++){
if !place_meeting(x+1,y,Parent_Obiektow_Solidnych) x+=1;
else{
var _max = 4; //Maksymalny skos to 4 piksele do gory i 1 piksel w bok. Zamien na dowolna liczbe ktora Ci pasuje.
 for(var j=0;j<_max;j++){ 
  if !place_meeting(x+1,y-j-1,Parent_Obiektow_Solidnych) //Jezeli znalazlo wolna przestrzen
  {
   x+=1;
   y+=j-1;
   break; //Przerwij te petle bo juz znalezlismy skos.
  } 
 }
}
}

 

Takie ostrzezenie, pisze to 100% z głowy więc może nie działać, w najgorszym wypadku po małych poprawkach powinno działać.

Edit: Ciagle zapominam ze nie ma juz tagu gml.

Edit2: Poprawiono kod na dzialajacy i poprawiono czytelnosc kodu dla potomnych i inncyh zagubionych duszyczek szukajacych rozwiazania.

 

  • Super (+1) 2

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Nie działa, bo dałem y+j+1 zamiast y-j-1. W edicie wrzuce dzialajacy przyklad.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×