Son zamanlarda hızlı tempolu bir 2d atıcı üzerinde çalışıyorum ve güçlü bir sorunla karşılaştım. Çarpışma algılama. Tabii, çalışıyor, ama çok yavaş. Amacım: Ekranda çok fazla düşman bulundurun ve birbirlerine dokunmamalarını sağlayın. Tüm düşmanlar oyuncu varlıklarını kovalar. Birçoğu aynı hızda er ya da geç, oyuncuları kovalarken aynı alanı kaplarlar. Bu gerçekten eğlenceli faktörü düşürüyor çünkü oyuncu için sadece bir düşman tarafından kovalanıyormuşsunuz gibi görünüyor. Aynı alanı almasını önlemek için çarpışma algılama (çok basit bir 2D algılama, bildiğim tek yöntem) ekledim.
Enemy class update method
Loop through all enemies (continue; if the loop points at this object)
If enemy object intersects with this object
Push enemy object away from this enemy object
Bu iyi çalışıyor. Sadece 200'den az düşman varlığım olduğu sürece. 300-350 düşman varlığına yaklaştığımda kare hızım çok düşmeye başlıyor. Önce kötü render olduğunu düşündüm, bu yüzden çekilişini kaldırdım. Bu hiç yardımcı olmadı, bu yüzden güncelleme yöntemi olduğunu fark ettim. Güncelleme yöntemlerindeki tek ağır parça, her düşman-her-düşman-döngü-kısmıdır. 300 düşmana yaklaştığımda oyun 90000 (300x300) adım yineleme yapıyor. Benim ~
Eminim bu çarpışma tespitine yaklaşmanın başka bir yolu olmalı. Buna rağmen hiçbir fikrim yok. Bulduğum sayfalar, iki nesne arasındaki çarpışmanın gerçekte nasıl yapılacağı veya bir nesne ile bir karo arasındaki çarpışmanın nasıl kontrol edileceği ile ilgilidir. Bu iki şeyi zaten biliyorum.
tl; dr? Varlıkların LOTSları arasındaki çarpışma tespitine nasıl yaklaşırım?
Hızlı düzenleme: Herhangi bir yardıma ihtiyacınız varsa, C # XNA kullanıyorum.