title: Wiadomości kolizji w Defoldzie
Kiedy dwa obiekty kolizji kolidują ze sobą, silnik wysyła wiadomości do wszystkich komponentów w obu tych obiektach:
Odpowiedź na kolizję "collision_response" to wiadomość wysyłana do wszystkich obiektów w przypadku ich kolizji. Zawiera ona następujące pola:
other_id
: identyfikator innej instancji, z którą obiekt kolizji kolidował (typ hash).
other_position
: pozycja innej instancji w przestrzeni świata gry (world position), z którą obiekt kolizji kolidował (typ vector3).
other_group
: grupa kolizyjna innego obiektu kolizji, z którą obiekt kolizji kolidował (typ hash).
Wiadomość "collision_response" jest odpowiednia do rozwiązywania kolizji, gdzie nie potrzebujesz szczegółów dotyczących rzeczywistego przecięcia (intersection) obiektów, na przykład, jeśli chcesz wykryć tylko czy pocisk trafia wroga. W ciągu jednej klatki jest wysyłana tylko jedna z tych wiadomości dla każdej pary obiektów kolidujących ze sobą.
function on_message(self, message_id, message, sender)
-- check for the message
if message_id == hash("collision_response") then
-- take action
print("I collided with", message.other_id)
end
end
Odpowiedź punktu kontaktu "contact_point_response" to wiadomość wysyłana, gdy jeden z kolidujących obiektów jest dynamiczny lub kinematyczny. Zawiera ona następujące pola:
position
: pozycja punktu kontaktu/styku w przestrzeni świata gry (world position) (typ vector3)
normal
: wektor normalny w przestrzeni świata do punktu kontaktu/styku, który wskazuje od innego obiektu kolizji w kierunku bieżącego obiektu, czyli tego, który otrzymał tę wiadomość (typ vector3).
relative_velocity
: prędkość względna obiektu kolizji obserwowana z punktu widzenia innego obiektu kolizji, z którym obiekt, który otrzymał tę wiadomość kolidował (typ vector3).
distance
: odległość penetracji między obiektami kolizji - nieujemna (typ number).
applied_impulse
: impuls, czyli siła która wynikała z kontaktu (typ number).
life_time
: (obecnie nieużywane!) czas trwania kontaktu (typ number).
mass
: masa bieżącego obiektu kolizji w kilogramach (typ number).
other_mass
: masa innego obiektu kolizji, z którym kolidował obiekt, który otrzymał tę wiadomość, w kilogramach (typ number).
other_id
: identyfikator instancji, z którą obiekt kolizji znajduje się w kontakcie (typ hash).
other_position
: pozycja w przestrzeni świata gry (world position) innego obiektu kolizji, z którym kolidował obiekt, który otrzymał tę wiadomość (typ vector3).
group
: grupa kolizyjna innego obiektu kolizji, z którym kolidował obiekt, który otrzymał tę wiadomość (typ hash).
Dla gry lub aplikacji, w których potrzebujesz idealnie rozdzielać obiekty, wiadomość "contact_point_response" dostarcza wszystkie informacje, których potrzebujesz. Należy jednak zauważyć, że w przypadku danej pary kolizji, w zależności od charakteru kolizji, można otrzymać wiele wiadomości "contact_point_response" w jednej klatce. Zobacz szczegóły w instrukcji do rozwiązywania kolizji.
function on_message(self, message_id, message, sender)
-- check for the message
if message_id == hash("contact_point_response") then
-- take action
if message.other_mass > 10 then
print("I collided with something weighing more than 10 kilos!")
end
end
end
Odpowiedź na wyzwalacz "trigger_response" to wiadomość wysyłana, gdy obiekt kolidujący ma typ "trigger" (wyzwalacz).
W kolizji typu "trigger" są wysyłane wiadomości "collision_response". Dodatkowo, wyzwalacze wysyłają również specjalną wiadomość "trigger_response" na początku i na końcu kolizji. Wiadomość ta zawiera następujące pola:
other_id
: identyfikator instancji, z którą obiekt kolizji kolidował (typ hash).
enter
: wejście - true jeśli interakcja była wejściem do wyzwalacza, false, jeśli była wyjściem (typ boolean).
function on_message(self, message_id, message, sender)
-- check for the message
if message_id == hash("trigger_response") then
if message.enter then
-- take action for entry
print("I am now inside", message.other_id)
else
-- take action for exit
print("I am now outside", message.other_id)
end
end
end