Skocz do zawartości

Dziwny problem z funkcją sprite_collision_mask


Rekomendowane odpowiedzi

Ta funkcja wygląda tak:

 

sprite_collision_mask(ind,sepmasks,bboxmode,bbleft,bbright,bbtop,bbbottom,kind,t

olerance)

 

w helpie dopisek do tej funkcji brzmi tak: "Please realize that this does not work correctly when an instance with that sprite is already present in the room."

 

Niestety nie napisali co zrobić, żeby działało correctly, czyli do jakiego eventu dać itd.

Wpisałem wartości wg. opisu argumentów i nie działa. Chcę zrobić, żeby ze sprita o wymiarach np. 1000x1000 wyciąć kawałek w dowolnym miejscu i żeby miał maskę swojego rozmiaru.

 

Bardzo bym prosił o pomoc.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie działa to z instancjami już będącymi w roomie, czyli tą funkcję musisz zastosować przed instance_create.

 

Czyli obiekty muszą być stworzone w kodzie danego room'u lub przez inny obiekt ?

 

A przed instance_create znaczy co ?

 

Edit: w sumie zamiast tłumaczenia na polski helpa wolę jakiś przykład, który udowadnia, że da się. Próbowałem znaleźć rozwiązanie na gmcommunity, tam też mieli z tym niemałe problemy a nawet pisali, że jakieś bugi w tej funkcji są.

Odnośnik do komentarza
Udostępnij na innych stronach

Problem rozwiązany, w 90%. Muszę tylko coś zrobić żeby ta maska była na środku rysowanego sprita, bo teraz jest jakby środkiem w punkcie 0x0. A problem tkwił w źle oznaczonych argumentach, bbright,bbtop są w złej kolejności, ma być bbtop,bbright. Przez złe wpisanie wymiary maski zrobiły się "ujemne" i nie było jej.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Maska jest swoim środkiem sprita w środku sprita którego jest maską. Tzn. jak sprite obiektu ma x i y sprita na 10,10, to maska tej samej wielkości też powinna mieć x i y na 10,10 (mowa cały czas o sprite, nie o obiekcie).

Odnośnik do komentarza
Udostępnij na innych stronach

Jednak zrezygnowałem całkowicie z używania tej funkcji bo okazało się, że pojawiły się kolejne bugi. Mam np. playera i wchodzę w ścianę z prawej strony, kolizja jest wykrywana raz wcześniej raz później (prędkość gracza 3, ściana gładka jak...). Wchodzę w ścianę z lewej strony i przechodzę na wylot, kolizja nie wykryta, patent dobry do platformówki ale nie dla mnie :/. Po za tym ta funkcja jest nieoptymalna. Przy dwóch kolidujących obiektach z tą funkcją obciążenie procka wynosi nawet ponad 30%. Robię normalne maski.

Odnośnik do komentarza
Udostępnij na innych stronach

Ok. ale dlaczego gdy zbliżam się powoli (sprawdzanie za pomocą lengthdir_x/y(speed,direction) nie ma sensu bo speed wynosi 3 czyli tylko 3 piksele na klatkę) to nagle wykrywa mi kolizję z 50 pikseli od obiektu a czasem tuż przy nim ? Druga sprawa to to, że zupełnie inaczej zachowuje się przy kolizji z drugiej strony a ściślej - nie ma tej kolizji, wchodzę sobie w mur gruby na 300px odwracam się... O jej! wykrył kolizję, to dobre, nie ? Proponuję, żebyś sam przetestował tę/ą funkcję i zobaczysz o co chodzi. No i dochodzi sprawa optymalności.

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