Skocz do zawartości
Ice Cube

Zmiana maski kolizji sprajta

Rekomendowane odpowiedzi

Cześć

w moim obiekcie pocisk muszę zmienać maske kolizji w zależności od kierunku w którym stoi gracz.

pocisk to długa linia

 

jest sprite_pocisk,który ma 360 klatek i to będzie służyć jako maska kolizji

Draw pocisku nie będzie się zmieniał bo to mała kulka,ale ze względu,ze pocisk ma lecieć szybko i kosić wszystko po drodze jego speed musi być równe 30 dlatego linia długości 30 pix.

 

 

obj_pocisk/create:

tutaj muszę nadać numer maski 0-360 w zależności od direction playera

sprite_collision_mask(spr_pocisk ... i co dalej

maska musi być precyzyjna

 

dodam,ze gra 3d

Help :) 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

360 klatek?

 

Moim zdaniem, wystarczy jedna. Jeśli obiekt nie ma innej maski niż sprite, to za pomocą image_angle możesz obracać zarówno sprite jak i maskę.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

dobra mała zmiana koncepcji

a gdybym pominął spritea i dał zwykły pixel jako maske i draw

speed pocisku np. 20

 i zrobił to na collision line to jak napisać aby pocisk kosił wszystko w promieniu 20pixeli niezależnie od obrotu playera

bo narazie kosi tylko wszystko co 20 pixeli a reszte omija.

 

pocisk /step

 collision_line(x,y,x+20 ??,y+20??,1,1)  - to nie działa,ale dałem poglądowo

 

 

chodzi o to by pocisk był cienki na pixel,a długi na 20 pixeli

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

to nie może być tak, ze jest długi na 20 pikseli, gdyż pocisk ma też swój "speed", który jeśli jest większy niż 20px, to wtedy "przeskoczy" niektóre obiekty. Wybierzmy więc to, co akurat jest większe:


 

var _list = ds_list_create();

var _num = collision_line_list(x, y, x + lengthdir_x( max(20, speed), direction), y + lengthdir_y( max(20, speed), direction), all, false, true, _list, false);

if (_num > 0) {
    for (var i = 0; i < _num; i++;) {
        instance_destroy(_list[| i]);
    }
}

ds_list_destroy(_list);

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
1 godzinę temu, gnysek napisał:

to nie może być tak, ze jest długi na 20 pikseli, gdyż pocisk ma też swój "speed", który jeśli jest większy niż 20px, to wtedy "przeskoczy" niektóre obiekty. Wybierzmy więc to, co akurat jest większe:


 


var _list = ds_list_create();

var _num = collision_line_list(x, y, x + lengthdir_x( max(20, speed), direction), y + lengthdir_y( max(20, speed), direction), all, false, true, _list, false);

if (_num > 0) {
    for (var i = 0; i < _num; i++;) {
        instance_destroy(_list[| i]);
    }
}

ds_list_destroy(_list);

 

to jak to jest z tym speed ?,

myślałem, że jeżeli speed=1 to obiekt co takt przesuwa się o jeden pixel..

dlatego zwiększając speed,zwiekszałem maskę kolizji aby łącznie na drodze pocisku tworzyła sie jedna linia,która kolidowała by z kazdym obiektem bez "przeskakiwania"

to pierwszy sposób w jaki chciałem to rozwiązać.

 

Drugi sposób to sprite pocisku ma 1 pixel łącznie z maską,ale kolizje wyłapywała by funkcja collision line

z tym, że jak napisałem wyżej nie wiem jak obliczyć wektor x2,y2 w tej funkcji,aby wydłużyć kolizje do 20 lub więcej pixeli w zależności ile pixeli musiała by wyłapywać funkcja przy speed=20

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ok, jeśli zwiększyłeś jedno i drugie równo, to problemu nie będzie i wtedy collision line nie jest potrzebne, o ile korzystasz z image_angle, zeby obrócić i grafikę i maskę. Wtedy wystarczy zwykły event kolizji, z jakimś obiektem-rodzicem wszystkich przeciwników.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Teraz, gnysek napisał:

Ok, jeśli zwiększyłeś jedno i drugie równo, to problemu nie będzie i wtedy collision line nie jest potrzebne, o ile korzystasz z image_angle, zeby obrócić i grafikę i maskę. Wtedy wystarczy zwykły event kolizji, z jakimś obiektem-rodzicem wszystkich przeciwników.

 

a jak obliczyć te x2,y2 w funkcji collision_line by działała analogicznie do pierwszego przykładu?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

To zależy gdzie będzie origin. Jeśli po lewej w środku, to tak jak wyżej (ew. zrezygnuj z max(a,b) i wstaw liczbę). Jeśli nie, no to trzeba dwa razy lenghtdir dać, w przeciwne strony.

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

×