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.