Çarpışma tespit mantığı nereye yerleştirilmelidir?


19

Küçük bir 2D oyun motoru geliştiriyorum. Karakterler şu anda aşağıdakileri yapan bir boya yöntemine sahiptir:

  1. Karakterin hızını vb. Göre yeni konumunu hesaplayın.
  2. Çarpışma ızgara hücresini güncelleyin **
  3. Karakteri yeni konuma çizin

** Kavşak kontrolü sayısını azaltmak için bir çarpışma ızgarası oluşturdum

Şimdi çarpışmayı tespit etmek için düşündüğüm temel algoritma:

For Each Character
    Check intersection with characters in surrounding 8 cells

Bu kodu sadece boya yöntemine yerleştirebilirim. Ama beklediğim problem burada.

Çarpışma ızgarasındaki bitişik hücrelerde iki A ve B karakteri bulunduğunu varsayalım. Şimdi yukarıdaki A karakterinin yinelemesindeki algoritmaya göre B ile çarpıştığını tespit edecektir. B karakterinin yinelemesinde A ile çarpıştığını tespit edecektir.

Ancak A'nın B ile çarpıştığını tespit ettiğinde, B'yi A ile çarpıştığını bildirmesi gerektiği fikrine sahibim. 2'den fazla aktör çarpıştığında bu çok fazla karşılaştırma yapacaktır. Ama bununla nasıl başa çıkacağımdan emin değilim. Bence her karakter çarpışmasını kontrol etmek yerine, oyun döngüsü içindeki çarpışmayı kontrol etmeliyim.

Bu yaklaşım doğru olur mu? Bu tür bir problemi nasıl ele aldınız? Çarpışma ızgarasını kendim düşündüm. Çarpışma ızgarası mantığına alternatif var mı?


Nitpick için özür dilerim, ama özel bir 2D fizik kütüphanesinde. Oyun fiziği genellikle çok yakındır, bu nedenle oyunu oynanamaz hale getirmeyen herhangi bir çözüm iyidir, ancak doğru bir şekilde çözmek istiyorsanız sadece Box2D gibi özel fizik kullanın ... :-D
user712092

Yanıtlar:


14

Çarpışma tespiti için genel yaklaşım, A veya B çarpışmalarını kendi başlarına tespit etmemektir.

Bunun yerine, önce tüm nesneleri hareket ettirin, sonra tüm nesne çiftleri arasındaki çarpışmaları aramak için ayrı bir çarpışma sistemine sahip olursunuz, her nesneye çarpıştığı şeyler hakkında bilgi verirsiniz ve sonra tüm nesneleri yaratırsınız.

Özünde, "taşı, çarpışmaları kontrol et, Paint () işlevinin içine" çiz "yerine," taşı "ve" çiz "i ayrı ayrı çağırdığınız ayrı işlevlere ayırırsınız (her nesne için önce" taşı ", sonra her nesne için "çizin"). Bunlar arasında çarpışma olup olmadığını kontrol edin.

Gelişmiş not: Nesnelerinizden herhangi biri, algılanan çarpışmalara tepki olarak kendilerini hareket ettirirse, bir nesnenin çarpışma yanıtının başka bir çarpışmaya neden olması durumunda "tüm nesne çiftleri arasındaki çarpışmalara bak" adımını tekrarlamanız gerekebilir.


Bir şeyler yapmanın doğru yolu budur. Nesnelerin sorumluluklarını yerine getirmesine izin verin ve çarpışma sistemi bir engelle karşılaştıklarında ne olacağına karar vermelidir. Ayrıca, karakterlerinizin etrafında bir tür erken tetikleyici olarak bir çarpışma dikdörtgeni / silindiri (2d / 3d) olabilir.
James P.

Harika! Gelişmiş notla ilgili olarak, çarpışmalar sadece çarpışmaya tepki olarak hareket eden nesneler ve yeni pozisyonda çarpıştıkları nesneler için tekrar kontrol edilmemeli midir? Bir kontrol zinciri olacak, ancak tüm nesneler için çarpışmayı kontrol etmekten kaçınacaktır.
Kraker


1

Dediğiniz gibi oyun döngüsünde tüm karakterlerim için bir döngü çalıştırıyorum.

Yapma şeklim her karakterimin bir durumuyla, bu yüzden A ve B A çarpışmasını kontrol ederken çarpışırsa A ve B vurmak üzere ayarlanır. B'nin döngüsünün başlangıcında, zaten vurulmuş olup olmadığını kontrol eder, eğer öyleyse id döngüyü çalıştırmaz.

Etkileme kodunu döngüye koydum, böylece B'de yapılması gereken herhangi bir işlem A döngüsünde gerçekleşti, bu yüzden B'nin çarpışmanın sonucunu bozacağından kontrol etmesinin bir nedeni olmamalı, bu sizin için farklı olabilir. .


Ancak bu durumda A, B ile kavşak tespit ettiğinde, B.hit doğru olarak ayarlanır ve böylece B HERHANGİ bir kavşak olup olmadığını kontrol etmez. Fakat başka bir C karakteri B ile kesişirse, B onu algılamaz mı?
Cracker

Üzgünüm, anladım. A, C ile kesişmediği için C.hit hala yanlış olacaktır. B çarpışmaları kontrol etmez. Ancak C, B ve C arasında bir çarpışma olduğunu kontrol eder ve bilgileri B'ye iletir.
Cracker

Ama sanırım A, B ve C'nin hepsi birbiriyle kesişirse bir sorun olurdu. A, B.hit ve C.hit'i doğru yapacaktır. B ve C, A ile çarpıştıklarını bilecekler, ancak hit özellikleri doğru olduğundan çarpışmayı kontrol etmeyecekler. B ve C arasındaki çarpışma fark edilmeyecek.
Cracker

Her uygulanabilir çarpışma nesnesini bir çeşit koleksiyona koyarak benzer bir yöntemle gizlice girebilir, ardından yalnızca koleksiyondaki nesneden sonra gelen şeylerle çarpışmayı kontrol edebilirsiniz. IE: A, B, C, D'ye karşı kontrol eder; B, C, D'ye karşı kontroller; C, D'ye karşı kontrol eder. Arkadaki her birinin, arkadaki sırayla kontrol edildiğinden kontrol edilmesi gerekmez. Elemanın çarpışmasını tamamen atlamak kadar hızlı değil, yine de faydalı.
Lunin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.