Skocz do zawartości

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 :) 

 

 

Odnośnik do komentarza
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

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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);

 

Odnośnik do komentarza
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

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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.

Odnośnik do komentarza
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?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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.

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