Skocz do zawartości

Kolizje


Rekomendowane odpowiedzi

Witam , kolejny problem ... otóż robię taką gierkę 1d , co z tego wyjdzie , się zobaczy . I mój pierwszy problem napotkałem przy kolizjach , poszukałem trochę , użyłem wyszukiwarki ... pustka !

Teraz zwracam się do was z prośbą o pomoc :

-czy możecie podać jakiś dobry kod do kolizji z ścianą w 1d ! (Ogromnie bym się ucieszył , gdyby było z komentarzami , co kod robi ;))

Odnośnik do komentarza
Udostępnij na innych stronach

A co ci do tego czy offtopujemy? Poza tym nie offtopowaliśmy tylko poprawialiśmy twoje błędne pytanie które też jest częścią tematu :)

-15 razy ?!

 

A jak będzie próbował zrobić grę z anaglifem to się będzie pytał jak się robi kolizje 4D :D

-Jak będę chciał coś takiego zrobić , najpierw zaspamuje ci skrzynkę wiadomościami pt. "ile to 2 razy 2 " ;).

Odnośnik do komentarza
Udostępnij na innych stronach

^^ robi się zabawnie. kto chce bana na miesiąc?
Odnośnik do komentarza
Udostępnij na innych stronach

Widze że ludzi nie chcą ci pomóc, więc postanowiłem napisać dla ciebie tutorial (nie chciało mi się kręcić filmiku). Mam nadzieje że ci się przyda, możesz go sobie zapisać na dysku i gdy bedziesz chciał zrobić kolizje 2 obiektów to tylko zetkniesz na mój tutorial i gotowe.

 

Tutorial_jak_zrobic_kolizje.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

Ja na jego miejscu sprawdzał bym kolizje "Collision Line" z 4 stron (góra, dół, lewo, prawo)

 

 

STEP:

GML
if keyboard_check(vk_left) and !collision_line(x-16,y-16,x-16,y+16,obj_wall,1,0) then x-=3;

if keyboard_check(vk_right) and !collision_line(x+16,y-16,x+16,y+16,obj_wall,1,0) then x+=3;

if keyboard_check(vk_up) and !collision_line(x-16,y-16,x+16,y-16,obj_wall,1,0) then y-=3;

if keyboard_check(vk_down) and !collision_line(x-16,y+16,x-16,y+16,obj_wall,1,0) then y+=3;

 

Warunkiem działania tego kodu jest to że sprite gracza musi mieć 32x32 pixele... jeżeli nie ma to trzeba kombinować z wartościami ale zasada jest prosta... jeżeli ma 64x64 to wartości będą 32... jeżeli jednak sprite gracza nie jest kwadratem to już będzie tutaj więcej matematyki niż to co podałem, tak czy siak mój kod zapewnia "ślizganie" się po ścianach gdy się na nie wejdzie... nie tak jak w dużej ilości wrzucanych tutaj gier że się wejdzie na ścianę i zwiecha... ;p

Odnośnik do komentarza
Udostępnij na innych stronach

... nie tak jak w dużej ilości wrzucanych tutaj gier że się wejdzie na ścianę i zwiecha... ;p

 

I tu się mylisz :D . Wartość cofnięcia od ściany jest stała, a składowa prędkości prostopadła do powierzchni ściany jest zmienna. Efekt? Będzie skakał jak po schodkach :) .

 

Strzelam, że Lordis trafił w gusty pytającego.

Odnośnik do komentarza
Udostępnij na innych stronach

mój kod zapewnia "ślizganie" się po ścianach gdy się na nie wejdzie...

 

I tu się mylisz :D . Wartość cofnięcia od ściany jest stała, a składowa prędkości prostopadła do powierzchni ściany jest zmienna. Efekt? Będzie skakał jak po schodkach :) .

 

Strzelam, że Lordis trafił w gusty pytającego.

Odnośnik do komentarza
Udostępnij na innych stronach

I tu się mylisz :D . Wartość cofnięcia od ściany jest stała, a składowa prędkości prostopadła do powierzchni ściany jest zmienna. Efekt? Będzie skakał jak po schodkach :) ...

 

nie mam pojęcia co tu napisałeś ale sprawdziłem i masz racje skacze... nie testowałem tego, mój błąd... lepszym rozwiązaniem będzie użycie "place_free(x,y)"

 

GML
if keyboard_check(vk_left) and place_free(x-3,y) then x-=3;

if keyboard_check(vk_right) and place_free(x+3,y)then x+=3;

if keyboard_check(vk_up) and place_free(x,y-3) then y-=3;

if keyboard_check(vk_down) and place_free(x,y+3) then y+=3;

Odnośnik do komentarza
Udostępnij na innych stronach

nie mam pojęcia co tu napisałeś ale sprawdziłem i masz racje skacze... nie testowałem tego, mój błąd... lepszym rozwiązaniem będzie użycie "place_free(x,y)"

 

Hehe, faktycznie namieszałem :) . Miałem na myśli to, że jeżeli postać znajdzie sie kolizji ze ścianą, to nie wiesz, czy wbiła się na 3 px, czy na 5, czy na 0.5. Dlatego nie możesz twierdzić, że to będzie akurat 3. Będzie tak tylko w przypadku gdy:

- postać chodzi tylko po osiach (tzn tylko w kierunkach 0, 90, 180 i 270)

- ma wtedy ustaloną szybkość na 3.

 

Rozwiązanie niedawno gdzieś podawałem, mianowicie tu: Link

Właściwie przykład był zrobiony na postawie podesłanej gry parę postów wyżej. Program nie przesuwa obiektu względem własnej pozycji (+=), ale oblicza nową pozycję, w której nie znajdzie się kolizja (=). Dzięki temu można wbić się w ścianę ile się chce, i tak zostanie obliczona nowa pozycja ;) .

Odnośnik do komentarza
Udostępnij na innych stronach

To , żeby nie tworzyć nowego tematu :

znalazłem przykład plecaka i chciałem go przerobić , żeby hełm gdy (wpadnę z nim w kolizję lub po prostu na niego nacisnę) "był na mnie"

Zrobiłem tak :

OBIEKT : przedmioty

ma ten kod(w LEFT BUTTON PRESSED) :

GML
x=player.x

y=player.y

CHEŁM :

ma oczywiście

PARENT : przedmioty.

I problem w tym , że hełm zostaje w miejscu gdzie przed chwilą byliśmy , próbowałem trochę i za Chiny nie wymyślę !

Odnośnik do komentarza
Udostępnij na innych stronach

https://forum.gmclan.org/index.php?showtopic=9989

 

mouse pressed wykonuje sie raz gdy klikniesz myszka, a to oznacza ze

x=player.x

y=player.y

wypelni sie raz i chelm przesunie sie w miejsce player'a raz

W step kod wyoknuje sie bez przerwy, wiec

x=player.x

y=player.y

bedzie przesuwal chelm caly czas na miejsce player'a

 

a zeby pamietal czy kliknales czy nie zrob jak ediepl

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