Potrzebuję wiedzy w tytulowym temacie:
Jak wydajnie wykrywac kolizje obiektow?
Znalazlem w sieci pare tekstow ale okazaly sie one srednio przydatne w kontekscie Atari.
Pytam pod kątem pisania gry na "Tomka", ale nie zakladam z gory, ze bedzie to robil koprocesor.
Sprawa nie jest trywialna jesli na ekranie ma byc kilkanascie duzych obiektow o nieregularnych ksztaltach. A uwzgledniajac np pociski moze ich byc kilkadziesiat!
Generalnie sa dwie metody:
1. Bitowa (czyli jakies operacje bitowe i wykrywanie ktore pixele sie pokrywaja - podobnie jak w PMG sprzetowym na Atari)
2. Obliczeniowa bazujaca na odleglosciach.
Pierwsza jest dokladniejsza, ale np XXL sugerowal mi niejednokrotnie ze odrzuca ja zazwyczaj bo jest "za dokladna" czyli ze denerwujaca jest smierc bohatera jesli zawadzi o cos jednym pixelem. Wiec stosuje metode obliczeniowo-odleglosciową.
Ale są sytuacje w ktorych precyzja jest bardzo wazna: np kiedy w platformowce jesli bohater staje przed opadajacymi smiercionosnymi obiektami (np. Henry's House).
Druga metoda wydaje sie latwiejsza, ale jest tak jesli obiekty maja w miare "ogrągly", zwarty ksztalt ;) czyli np okragle pociski trafiajace w niewielekie przeszkadzajki o wymiarach 10x10 pixeli. Tu przyblizenie oparte na odleglosci miedzy srdodkami obiektow jest wystarczajace zeby dobrze sie gralo. Ale co jesli obiekt bedzie duzy o bardzo nieregularnym ksztalcie? Kiedy trzeba sie zmierzyc z czyms takim jak to:
http://www.youtube.com/watch?v=MQvEUX5I … age#t=273s
Do tej pory wykombinowalem, ze moznaby zrobic wykrywanie kolizji troche inaczej: zrobic przyblizenie ksztaltu kazdego obiektu w nizszej rozdzielczosci, np na znakach (czyli na siatce 40x24) i wykrywac kolizje jesli pokrywaja sie "znaki" zajmowane przez dwa obiekty. To powinno dac zadowalajacy rezultat np w strzelankach.
Ale skutkuje to koniecznoscia dublowania animacji na tej "znakowej siatce kolizji".
Chcialbym wiec prosic praktykow o pare slow na temat metod jakie wykorzystywali w swoich grach. Szukam inspiracji i rozwiazan, ktore moglbym zaimplementowac :)