Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

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.

Opublikowano
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ą.

Opublikowano

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.

  • Administratorzy
Opublikowano

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

Opublikowano

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.

  • Administratorzy
Opublikowano

Bo musisz sprawdzać czy pozycja jest wolna przed wykonaniem ruchu, a nie po. Spróbuj sprawdzać dla pozycji x+hspeed, y+vspeed, to będzie z wyprzedzeniem.

Opublikowano

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.

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