Bir video oyununda mermileri nasıl temsil ederim?


14

Yaptığım bir sunumun parçası olarak "Galaga" ya benzer basit bir sabit nişancı oyunu yapıyorum. Uzay gemisinden ateşlenen lazerler gibi insanların mermileri izlemek için hangi stratejileri ve veri yapılarını kullanacağını merak ediyorum. Daha önce kullandığım süper basit bir uygulama, her mermiyi bir nokta olarak temsil etmek ve sahnedeki tüm nesnelerle çarpışmaları kontrol etmektir.

Bununla birlikte, bu, birçok merminin olduğu geniş sahnelerde maliyetli görünmektedir; Bu tür bir kullanım durumu için başka hangi tür stratejilerin veya uygulamaların kullanıldığını merak ediyorum. FPS gibi oyunlar mermileri izlemek için ne kullanır (mermiler, tank mermileri, vb.)?


5
Birçok FPS oyunu, mermilerin anında olduğunu varsayar, ancak yörüngeleri ve seyahat süresini hesaplayanlar vardır.
John McDonald

2
+1 bu harika bir soru ve ben de bunu mutlaka 3B ile sınırlamam.
ashes999

Yanıtlar:


8

İçin çok hızlı (örneğin lazer veya mermiler gibi) mermiler, sen bir kullanabiliriz Ray .

Bir ışının bir başlangıç ​​noktası ve bir bitiş noktası vardır. Bir ışın için (çok minimal) bir veri yapısı:

struct Ray
{
  Vector3f start, end ;
} ;

Buna benzer:

resim açıklamasını buraya girin

(Yön vektörünü ve uzunluğunu da önbelleğe alabilirsiniz, ancak yukarıda çok basit bir defn kullandım).

Işın, ışık hızında ilerleyen bir lazer ışınıysa, ışını birkaç kare için (tabanca nozulundan başlayıp bir yerde bir duvarda biten gibi) devam ettirirsiniz. Işınla kesişen her şey her kareye zarar verir.

Işın daha yavaş bir mermiyse (örneğin bir mermi gibi), merminin bir zaman aşımı boyunca kat ettiği mesafe ışın tarafından modellenir. Başlangıç ​​noktası ışının çerçevenin başında olduğu yerdir ve son nokta ışının çerçeve yapıldıktan sonra olacağı yerdir. Merminin rayındaki her şey mermiden zarar görür.

Işınlar küreler, aabbs, dışbükey gövdeler vb. İle verimli bir şekilde çarpıştırılabilir. Gerçek bir çalışan program için Hullinator projeme göz atın (CTRL + Click to fire)


1
Bir ışın birçok mermi için iyi çalışmaz. Örneğin, tank mermileri gibi hareket edebilen herhangi bir mermi. Ancak ışınlar düz atış mermileri için mükemmeldir.
MichaelHouse

Kabuk son derece yavaş hareket ediyorsa (bir mermi veya lazere kıyasla), o zaman evet normal bir vücut olarak modelleyeceğim (tıpkı oyuncu gibi)
bobobobo

7
Teknik olarak, bir ışın bir başlangıç ​​noktası ve bir yöntür. Bu bir başlangıç ​​noktası ve başka bir nokta İLE belirlenebilir, ancak bu tanımının bir parçası değildir. Tanımı gereği, ışınlar sonsuzdur ve bitiş noktası yoktur.
Casey Kuball

1
Haklısın, tarif ettiğim şey aslında bir çizgi segmenti , ancak çoğu insan çarpışma tespiti hakkında konuşurken onlara ışın diyor.
bobobobo

3

Bir ışın kullanmak, mermiler gibi anında hareket eden mermiler için iyi çalışır. Uzay oyununuz için kullanacağınız tür gibi daha yavaş hıza sahip mermiler için, oyun dünyasındaki konumlarını diğer herhangi bir varlık gibi izlemeniz mantıklıdır. Sık sık yaptığım şey, varlık, rotasyon, çarpışma kutusu vb. Gibi kalıcı bir oyun nesnesinin özelliklerini içeren Entity adlı bir temel sınıfa sahip olmak. süper sınıf Varlık, her bir varlık türü değil.

Performansı artırmak için, sık sık oluşturacağınız ve yok edeceğiniz nesneler için bir havuz bulundurmak çok yaygındır. Bu havuzdan çekeceğiniz yeni bir mermiye ihtiyacınız olduğunda, yeni mermiyi gerektiği gibi değiştirin ve süresi dolduğunda havuza geri gönderin.


2

Çarpışma tespiti için optimize etmek istediğinizde, tüm oyun nesnelerini iki veya üç boyutlu bir ağaçta saklayabilirsiniz . Bu veri yapısı, belirli bir alandaki tüm nesneleri almayı çok verimli hale getirir.

Bununla birlikte, ikili ağaçlar, nesneler eklendiğinde, çıkarıldığında ve konumlarını değiştirdiklerinde kolayca dejenere olmaları dezavantajına sahiptir, bu nedenle otomatik olarak dengelemeniz gerekecektir .

Uygulanması daha kolay ama etkili olamayacak bir uzlaşma, yığın tabanlı bir yaklaşım kullanmak olacaktır. Oyun alanını küplere ayırın ve her bir nesneye hangi nesnelerin temas ettiğini takip edin. Bir nesneyle çarpışmaları kontrol ettiğinizde, onu yalnızca dokunduğu küplerin nesne listelerine göre kontrol etmeniz gerekir (2d-oyun için "küpü" dikdörtgen "ile değiştirin).

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.