Hızlı, doğru 2d çarpışma


17

Ben bir 2d yukarıdan aşağıya tetikçi üzerinde çalışıyorum ve şimdi temel dikdörtgen sınırlayıcı kutu çarpışma sistemimin ötesine geçmem gerekiyor.

Hepsi farklı şekil ve boyutlarda olan birçok farklı sprite ile büyük seviyelerim var. Spritelar için dokular şeffaf arka planlı tüm kare png dosyalarıdır, bu yüzden oyuncu sadece şeffaf arka plan değil, doku renkli kısmına girdiğinde bir çarpışma yapmanın bir yoluna ihtiyacım var.

Çarpışmayı şu şekilde ele almayı planlıyorum:

  1. Oyuncunun menzilinde herhangi bir sprite olup olmadığını kontrol edin
  2. Doğrultucu sınırlama kutusu çarpışma testi yapın
  3. Doğru bir çarpışma yapın (Yardıma ihtiyacım olduğu yerde)

İleri düzey tekniklere aldırmam, çünkü bunu tüm gereksinimlerimi göz önünde bulundurarak doğru yapmak istiyorum, ancak buna nasıl yaklaşacağımdan emin değilim. Hangi teknikleri ve hatta kütüphaneleri denemek için. Muhtemelen her bir sprite eksi şeffaf arka planı doğru bir şekilde temsil eden bir şekil oluşturup saklamam gerekeceğini biliyorum.

Piksel başına yavaş olduğunu okudum, bu yüzden büyük seviyelerim ve nesne sayısı göz önüne alındığında bunun uygun olacağını düşünmüyorum. Ayrıca Box2d'ye de baktım, ancak çok fazla belge bulamadım veya SFML ile nasıl çalıştıracağınıza dair herhangi bir örnek bulamadım.

Yanıtlar:


18
  1. Birinci adım, bir ızgara oluşturun ve hareket eden her nesne için güncelleyin.
  2. Yalnızca aynı karelerdeki nesneler arasında çarpışma olup olmadığını kontrol edin.
  3. Nesnelerin sınırlayıcı kutusunun kesişip kesişmediğini kontrol edin (içerdikleri dikdörtgen).
  4. Ana hattın düşük çözünürlüklü bir sürümünü kullanarak piksel mükemmel çarpışmasını kontrol edin (bkz. Oyun Fiziği).
  5. Oyun Fiziği (Q 2) bölümünde açıklandığı gibi anahat izlemenin normal bir kontrolünü yapın

Aşama 1:

Bir ızgara 2d dizisi oluşturun. Her nesne hangi kareleri kapladığını x, y konumu, genişliği ve yüksekliği ile bilir. Bir nesne taşınırsa, kendisini eski kareden temizler ve işgal ettiği yeni kareyi günceller.

Bu, n nesne için toplamda sadece O (n) alır. Herhangi bir spesifik nesne O (1) için.

Adım 2:

Aynı karelerdeki nesneler arasındaki tüm çarpışma denetimlerini gerçekleştirin. Farklı karelerdeki nesneler arasındaki çarpışmalar için testler yapmaya gerek yoktur. Bir nesne ortalama büyüklükte ise dört kareye kadar yer kaplayabilir. Bu, çok az kontrol anlamına gelir.

Aşama 3:

Nesnelerin dikdörtgenleri arasında kesişme olup olmadığını kontrol edin. Kesişme yoksa durun.

4. Adım:

Yalnızca kavşak alanının içindeki nesnelerin ana hatları arasında mükemmel piksel çarpışmalarını kontrol edin. Yeterince hızlı olmalı. Değilse, düşük çözünürlüklü bir 2d-boolean dizisi oluşturun ve önce kontrol edin, orada çarpışmalar bulursanız, yüksek çözünürlüklü 2d dizisindeki küçük bir segmenti kontrol etmeniz gerekir, böylece size değerli bir zaman kazandırır.

Bir içine oyun dünyayı bölmek için nasıl konsepti için bu okuyunuz ızgara kareler:

Etkili bir çarpışma tespit sistemi yapmak

Piksel mükemmel çarpışmalarının nasıl algılanacağına ilişkin sezgi için lütfen bunu okuyun .

Oyun fiziği / 2D Çarpışma algılama AS3

Performansı önemli ölçüde artırabilirsiniz:

  1. İlk önce kontrol etmek için anahattın düşük çözünürlüklü (1/16) sürümünü kaydetme.

  2. Sadece iki doğrultunun kesiştiği alanı kontrol edin.

  3. anahattı kabaca segmentlere bölerek ve yalnızca önce segmentler arasındaki çarpışmaları kontrol ederek.

Lütfen yorum yapmaktan çekinmeyin ve ayrıntılı olarak anlatacağım.

kavşak alanında kontrol edin


1
Arthur'un dediği gibi, 1. ve 2. adımlarınızı bir ızgara ile değiştirin ve doğru çarpışma algılamaya gelince, görüntülerinizin düşük çözünürlüklü bir sürümünü kullanabilirsiniz.
Markus von Broady

1
Ve gerçekten ihtiyacınız varsa, buradaki cevabım için de benzer bir teknik kullanabilirsiniz: gamedev.stackexchange.com/questions/38481/…
Markus von Broady

Markus iyi bir fikre dikkat çekiyor. 2d-boolean dizisi veya 2d olarak işlenen 1d-dizisi kullanmalısınız ve işleri hızlandırmak için bu dizinin 1/2 1/4 1/8 düşük çözünürlüklü sürümlerini kaydedebilirsiniz. 2d-boolean dizilerindeki hesaplama çok hızlı olduğu için bu muhtemelen gerekli olmayacaktır. Hala sahip olmak için kullanışlı bir araçtır.
wolfdawn

Oynatıcı tamamen ızgaradaki bir karenin içinde bulunuyorsa, yalnızca o karedeki nesnelere karşı kontrol edebilirsiniz. Oynatıcı aynı anda dört bitişik karede olabilir. Demek istediğin bu mu? Dikdörtgenler arasındaki kesişmeyi kastediyorsanız, evet, yalnızca kesiştiklerinde çarpışma olup olmadığını kontrol etmeniz gerekir.
wolfdawn

1
Umarım güncelleme işleri temizlemeye yardımcı olur. Bazı kodları yazdıktan sonra kod incelemesine gönderebilir ve yorumlar için bizi bağlayabilirsiniz. codereview.stackexchange.com
wolfdawn
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.