Skocz do zawartości
Poo-ding

Kolizja z ukośną linią, która nie jest obiektem

Rekomendowane odpowiedzi

Witam :) Mam mały problem mam jednak nadzieję, że udzielicie mi pomocy :)

object0 ma zmienne xx1 = -30 ; yy1=50 ; xx2=40 ; yy2=- 15 . Zmienne te mają tworzyć linię, która powiedzmy jest narysowana przez object_draw za pomocą

GML
with object0 {draw_line(xx1,yy1,xx2,yy2) }
. W grze bierze udział także object1. Chciałbym, żeby w momencie gdy object1 "zetknie" się z linią której współrzędne wyznaczają zmienne obiektu object0 (xx1,yy1,xx2,yy2) wydarzyło się coś np. object1 ulegnie zniszczeniu.

Największy problem mam z ustaleniem momentu "zetknięcia" objectu1 z linią wyznaczoną przez object0. Początkowo myślałem, że funkcja collision_line będzie tu pomocna, ale okazało się, że służy ona do zupełnie czegoś innego. Mając w pamięci lekcje matematyki z liceum, postanowiłem posłużyć się właściwościami funkcji liniowej i zrobiłem następującą rzecz:

 

Dla objectu0 (ściślej : dla linii którą tworzy) wyznaczyłem współczynnik kierunkowy

GML
m=(yy2-yy1)/(xx2-xx1)
a dla objectu1

 

GML
if x>object0.xx1

if x<object0.xx2

if y>object0.yy2

if y<object0.yy1

if (y-(object0).yy1)/(x-(object0).xx1)=object0.m

instance destroy()

 

 

Podany sposób niby działa, ale jest bardzo niedokładny, jest to związane tym, że współczynnik kierunkowy zmienia się dość w szalony sposób . Może znacie jakiś bardziej elegancki sposób na to by zapisac w kodzie interakcje z linią która nie jest osobnym obiektem, której współrzędne są zmiennymi jakiegoś obiektu, i która jest linią nie pionową ani nie poziomą lecz ukośną ? Zgaduję, że to bardziej problem matematyczny, mam nadzieje jednak, że ktoś będzie potrafił mi pomóc :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Chyba wiem o co chodzi - linia ma grubość 1px, a obiekt np. prędkość 4px. To znaczy, że pomiędzy klatkami tak naprawdę "przeskoczy" linkę (stoi 1px przed linką, +4px daje nam 2px za linką). Jednakże, jeśli maska tego obiektu ma większą szerokość i wysokosć niż jego prędkość, kod:

 

GML
var _id;

_id = collision_line(x1,y1,x2,y2,object1,false,false);

if (_id > 0) {

with (_id) instance_destroy();

}

 

Ten kod niszczy tylko object1 który dotyka linii, jeśli na planszy są dwa.

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

×