Skocz do zawartości

Problem z kolizją


Cruel_boy

Rekomendowane odpowiedzi

Otóż, problem wydaje się bardzo prosty, jednak walczyłem z nim bardzo długo, a efektów nie było żadnych. Oraz - nie umiem szukać a na pewno podobny temat istniał.

 

Problem polega na tym: http://screenshooter.net/9608235/gimcien

 

Chodzi o to, że postać w kolizji ze ścianą która jest po prawej jest nieodpowiednia.(widać na załączonym obrazku)

 

Zaś w kolizji z lewą jest poprawnie.

 

I ze ścianą po prawej i po lewej działało dobrze dopóki nie dodałem temu prostokątowi nóg i animacji. Origin jest wycentrowany.

 

EDIT: podobnie jest gdy nad bohaterem jest ściana. nie uderza jej do końca z tą samą odległością.

Odnośnik do komentarza
Udostępnij na innych stronach

Błagam, opisz swój problem. Z chęcią bym ci pomógł, ale na tym screenie widzę jakieś dwa bloczki i dwie nóżki.

Chodzi o to, że postać w kolizji ze ścianą która jest po prawej jest nieodpowiednia.(widać na załączonym obrazku)

Postać jest nieodpowiednia, aha.

 

 

Edit:

EDIT: podobnie jest gdy nad bohaterem jest ściana. nie uderza jej do końca z tą samą odległością.

O widzisz, to już daje jakąś wskazówkę. Chodzi ci o to, że jeśli trzymam np. prawy klawisz, to postać ma iść do końca w prawo i ma nie zostawać żaden piksel odległości, tak? Wówczas move_toward_solid się kłania. Ewentualnie pętelka while.

Odnośnik do komentarza
Udostępnij na innych stronach

postać W KOLIZJI ze ścianą jest nieodpowiednia.

 

na screenie po lewej widać postać, a po prawej jest ściana. między nimi jest mały odstęp, przez który nie można przejść (blokuje się)

 

lecz gdy postać będzie w kolizji z LEWĄ ścianą, nie będzie tego odstępu: http://screenshooter.net/9608235/ldonavm

Odnośnik do komentarza
Udostępnij na innych stronach

Wytłumaczę ci twój problem.

GML
if ( keyboard_check( vk_right ) )

{

if ( place_free( x + 6, y ) )

x += 6;

}

Zapewne mniej-więcej tak wygląda twój kod. Postać się blokuje, ponieważ odległość między nią a ścianą jest mniejsza niż 6, ale jednak jest. Wystarczy dać taki kod:

GML
if ( keyboard_check( vk_right ) )

{

if ( place_free( x + 6, y ) )

x += 6;

else

while( place_free( x + 1, y ) )

x += 6;

}

Ewentualnie:

GML
if ( keyboard_check( vk_right ) )

{

if ( place_free( x + 6, y ) )

x += 6;

else

move_toward_solid( 0, 0 );

}

Gdzie 6 to prędkość bohatera.

Odnośnik do komentarza
Udostępnij na innych stronach

Zastosowałem twój kod, lecz musiałem go naprawić: move_CONTACT_solid, nie toward.

 

Lecz teraz jest zupelnie na odwrot - w kolizji z lewą ścianą tworzy się odstęp. Gdy dodałem część twojego kodu także do lewego klawisza, postać zaczęła teleportować się w prawo do najbliższej ściany.

Odnośnik do komentarza
Udostępnij na innych stronach

Zastosowałem twój kod, lecz musiałem go naprawić: move_CONTACT_solid, nie toward.

 

Lecz teraz jest zupelnie na odwrot - w kolizji z lewą ścianą tworzy się odstęp. Gdy dodałem część twojego kodu także do lewego klawisza, postać zaczęła teleportować się w prawo do najbliższej ściany.

Fakt, contact. Z GMem od dawna nie mam do czynienia. Pisanie, że musiałeś go naprawić jest co najmniej absurdalne, o czym przekonasz się za chwilę :) .

 

"Teleportuje się" w prawo, ponieważ nie zmieniłeś kodu. Zero zamień na 270 w przypadku pójścia w lewo. Oczywiście, jeśli jeszcze na to nie wpadłeś, w funkcji move_contact_solid.

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