Çarpışma algılamayı nasıl yapacağım, böylece hızlı nesnelerin duvarlardan geçmesine izin verilmez?


14

2d yandan kaydırmalı bir nişancı yapıyorum ve mermiler için çarpışma tespiti konusunda biraz sorun yaşıyorum. Madde işaretleri dahil her şey kendi çokgenleri / güncelleme yöntemleri olan nesnelerdir.

Sorun şu ki, mermilerin hızlı gitmesi ve saniyede 60 kare hızında (oyunun çalıştığı şey) bir mermi genellikle bir duvarın içinden atlayacaktır - çünkü güncelleme aralığında duvarın genişliğinden daha fazla hareket eder - ve çokgenler asla örtüşmeyeceği için yolda mutlu bir şekilde devam edin.

Bununla ilgili ne yapabilirim? Gelebildiğim tek şey eski pozisyondan yeni pozisyona bir çizgi çizmek ve bunun üzerine çarpışma tespiti yapmaktır, ancak çarpışma tespiti için çizgi çizimi slick2d belgeleri tarafından tavsiye edilir. Bunu Nasıl Çözebilirim?


Tam bir cevap değil, bu yüzden bir yorum. Asla grafik olarak bir çizgi çizmeyi tavsiye etmem ama matematiksel olarak bunu yapabilirsiniz, çarpışmanın meydana gelip gelmediğini görmek için sadece basit bir ışın düzlemi kesişimi. Daha sonra, çarpışmada yanıtların önerdiği şekilde sürekli olarak daha yüksek bir hızda koşmak zorunda kaldığında meydana gelen kesin anı (ve onunla birlikte gelen tüm bilgileri) elde etmek için daha küçük bir sabit adım algılama yapabilirsiniz. Daha az maliyetli bir kontrol yapın ve daha sonra ihtiyacınız olan cevabı kesinleştirmek için zaman harcayın.
James

Yanıtlar:


9

Standart yaklaşımlar (birini seçin):

  1. Sınır genişliğinizi artırın VE / VEYA merminizin maksimum hızını azaltın, böylece hiçbir zaman tek bir güncellemede duvardan atlayamaz (maksimum mesafeleri / minimum sınır genişliklerini bulmak için biraz Pisagor gerektirir);
  2. Genellikle, hareketli nesnenin önündeki doğrusal (2) veya düzlemsel (3D) yüzeylerle çarpışmayı tespit etmek için rekor kırarak sürekli çarpışma algılama (CCD) gerçekleştirin. Bu daha pahalıdır, ancak daha iyi bir çözümdür. 2D çizgilere karşı raycasting oldukça basittir, ancak bu durumda tüm sınırlarınızı düz kenarlı çokgenler olarak tanımlamanız gerekir.

Bu nedenle, mermilerinizi ışınlar olarak modelleyebilirsiniz - eğer bu, oyununuzun görünümü ve hissine uyuyorsa , left4kdead'de olduğu gibi . Bu şekilde mermileri ışın olarak yaklaştırmanıza gerek kalmaz, çünkü zaten ışınlardır. Görünüş açısından, mermi ucunda daha parlak bir nokta ile çizgi çizerseniz veya çizgiyi ışıktan (mermi ucu) karanlığa (kuyruk ucuna) bir degrade olarak çizerseniz, hareket.

Çoğu durumda, çarpışma tespiti için grafik kullanmanın biraz yanlış yönlendirildiğini kabul ediyorum, ancak piksel mükemmel çarpışma tespiti tam olarak bu ve kabul edilen bir teknik. Sanırım her şey neye ulaşmak istediğinize ve ne kadar hızlı olduğuna bağlı. Birçok vücut + aksiyon ile çok hızlı bir oyuna ihtiyacınız yoksa, bunun için gidin. Yukarıda özetlediğim yaklaşımlardan birini kullanmak daha iyidir.


Harika cevap için teşekkürler - ideal olarak birçok hareketli gövdeyle hızlı olmasını istiyorum. Mermilere fiziksel nesneler olarak davranmamın nedeni, her şey gibi yerçekiminden etkilenmeleri (merminin hızına bağlı olarak hafifçe aşağı doğru yayılması vb.). Bunu yapmak için iyi bir yol değil mi? Bu benim ilk oyunum, bu yüzden hala en iyi uygulamalar için avlanıyorum. Parabolik bir denklem de kullanabilirim, ancak merminin hız / nişan açısı ile ilgili katsayıları nasıl kuracağımdan emin değilim
Mala

3
Mermiler için çok fazla detay gibi geliyor. Gerçek hayatta, bir mermi ateşlediğinizde, sekme kuvveti, richochet açısının öngörülemezliği vb.Nedeniyle bu sümüğü bulmanız pek olası değildir. Sadece yok olur ya da seker ve kısa bir süre sonra yok olurdum. Çekirdek oyununuza odaklanın, bu küçük detaylar hakkında çok fazla endişelenmeyin. Gerçekçilik, en önemli olan şeylere odaklanır.
Mühendis

Evet, sanırım mermiler için düz çizgiler kullanabilirim ve belki de önemli görünüyorsa, biraz sonra aşağı doğru eğilmelerini sağlayacak bir yol bulabilirim.
Mala

2
Mermilerin hızı çok yüksek değilse (yani, ekran boyunca hareket ettiklerini göremeyeceğiniz kadar hızlı değilse), basit ışınlar kullanarak çarpışma algılamalarını modellerken hızlarına yerçekimi uygulayabilirsiniz. Kullanıcı, merminin artık diğer tüm nesnelerinizin de aynı şeyi nasıl yaptığını fark edeceğinden bir dizi düz çizgi olarak hareket ettiğini fark etmeyecek. Mermi parkurları için, kavisli bir parkuru (spline) hesaplamak ve çizmek zor değildir ve merminin yörüngesine düzgün bir eğrinin yanılsamasını artıracaktır.
Sean Middleditch

3

Mermilerinizin gerçekçi fiziksel nesneler gibi davranmasını istiyorsanız (örneğin, mermileriniz daha çok silah ateşinden ziyade bir mancınık okları veya taşları gibidir), o zaman fizik güncellemelerinizin sıklığını artırmayı deneyebilirsiniz.

Oyununuz saniyede 60 kare ile çalışabilirken, fizik simülasyonunuz saniyede 120 güncellemede çalışabilir (işte, döngü döngüsünden farklı hızlarda çalışabilen iyi bir fizik kurulumunu açıklayan zaman aşımı makalenizi her yerde düzeltin ).

Tabii ki, fizik motorundaki güncelleme aralığını artırmak CPU'ya daha büyük bir yük getirecek. Dolayısıyla bu yaklaşım sadece mermileriniz çok hızlı hareket etmiyorsa mantıklıdır (ki mermilerinizin ark içinde hareket ettiğini söyleyebildiğiniz için bunu varsayıyorum).


Teşekkürler! Bunu etkili bir şekilde yapıyorum (çizgi şekilli mermiler kullanmanın yanı sıra) ve oyun daha karmaşık hale geldikçe uygulanabilir kalmasını umuyorum
Mala
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.