Bir mermi ve düşmanı ya da oyuncu ve zemini düşünün. Bu nesneler etkileşime girerse, etkileşim kodunu ne taşır?
Bir mermi ve düşmanı ya da oyuncu ve zemini düşünün. Bu nesneler etkileşime girerse, etkileşim kodunu ne taşır?
Yanıtlar:
TL; DR:
Oyun nesneleriniz birbirinizi tanımıyor, başka nesnelere karşı da kontroller yapmıyor. Oyun nesnelerinizi kontrol eden ve oyun fiziğini taklit etmek için uygun eylemleri gerçekleştiren bir çarpışma algılama ve çarpışma çözümleme modeli yaratıyorsunuz.
İyi şeyler
Çarpışma algılama yazma ve bu kitabı okuma girişimlerinden önce , çarpışma algılama ve çarpışma çözümü için iki aşama vardır. İlk aşama (çarpışma tespiti), iki nesnenin potansiyel bir çarpışmaya sahip olup olmadığını belirleyeceğiniz bir erken geçiştir. Herhangi iki nesnenin potansiyel bir çarpışma oluşturması durumunda, nesnelere karşı daha hassas bir kontrol yapmak ve çarpışmayı çözmeye çalışmak için bu nesneleri ikinci aşamaya (çarpışma çözünürlüğü) geçirirsiniz.
Motorunuzda / oyununuzda bir yerlerde, dünyanızdaki tüm nesnelerin bir dizisine sahip olacaksınız. Her karede, diziye rağmen döngü uygular ve her nesneyi basit bir sınırlayıcı kutu / küre çarpışma algılamasıyla diğer nesnelere karşı kontrol ederdiniz.
pseudocode:
dectectCollisions(objects)
{
for(objectA in objects)
{
for(objectB in objects)
{
if(objectA != objectB) //ignore self
{
if(BoundingSpheresIntersect(objectA, objectB))
{
collisionResolver.addObjects(objectA, objectB);
}
}
}
}
}
Bu tür bir döngü oldukça verimsizdir, ancak çarpışamayacak kadar uzakta olmaları garantili olan nesneler için bir erken çıkış olarak mekansal bölümlemenin kullanımı yoluyla iyileştirme için yer bırakmaktadır.
Potansiyel bir çarpışma için iki nesneyi kontrol ettikten sonra (yani her iki nesne de çarpışmaya yetecek kadar yakın), nesneler daha kesin bir çarpışma algılama yordamı gerçekleştirmek üzere geçirilir.
Potansiyel olarak kesişebilecek kadar yakın ancak geometrileri nedeniyle olmayan iki rastgele şekil ve boyut poligonuna sahip olduğunuzu hayal edin:
Sınırlayıcı küreler kullanarak, bu iki nesne potansiyel bir çarpışma için yanlış bir pozitif yaratacaktır. İki nesnenin gerçekten kesişip kesişmediğini belirlemek için daha ayrıntılı bir geçiş gerçekleştireceğiniz yer burasıdır.
Gerçek bir çarpışma bulduktan sonra, çarpışma çözümleme adımınız, oyun fiziğinizin ayrıntı derecesine ve ihtiyaçlarına bağlı olarak kuvvetleri veya momentleri uygulayarak nesneleri çözmek için uygun eylemi gerçekleştirir.
Bunu akılda tutarak, çarpışma algılama ve çözme sürecinin tamamını soyutlayabilirsiniz; böylece nesneleriniz birbirleri hakkında hiçbir şey bilmez, ayrıca çarpışmaları belirlemek ve çözmek için de gerekli işlemler. Bunu sizin için halleden iki sınıf / yönetici, çarpışmalar için hızlı ve kirli bir kontrol yapmak için her nesnenin temel özelliklerini bilmeli ve daha sonra gerekli olması halinde daha ayrıntılı bir kontrol yapılmalıdır.
Tek yönlü Unreal Engine 3 bunu gerçekleştirir:
Mermi, bir şeye çarptığını söyleyen bir çarpışma mesajı alır ve neye çarptığını söyleyen bir tartışma çıkar. Daha sonra objectHit.takeDamage (self) öğesini çağırabilir. Hedef daha sonra, TakeDamage mesajını, onu vuran şeyi gösteren bir işaretçiyle alır ve uygun işlemi yapar.
Ben şahsen bu yaklaşımı seviyorum çünkü bu, merminin özel eylemler yapabileceği (isabet eden şeyin türüne bağlı olarak bir çeşit patlama efekti yapmak gibi) ve hedef, merminin türüne bağlı olarak özel eylemler gerçekleştirebileceği anlamına geliyor.
Ayrıca, merminin hedeflere ne yaptığını bilmesi ve objectHit.freeze (self) gibi işlevini çağırabilir. O zaman hedef, onu dondurucu bir şeye çarptığını ve bunun nasıl bir nesne olduğunu bilir.
EDIT: Bu cevap, nasıl UE3 ile çalışmadığınızdan nasıl çalıştığının genel bir resmi olarak verilmiştir. :)
Hırsız, Kaynakları ve Reseptronlu Dark Engine'de bunu çok iyi yaptı. Bir nesne farklı özelliklere sahip bu özelliklerin her ikisine de sahip olabilir. Örneğin, bir Su okunun temasta WaterStim için bir Kaynağı olacaktır. Bir patlama bir AoE FireStim olacaktır.
Bir Water Arrow bir nesneye çarptığında, hedef nesne, Receptron'larını uygun yoğunluk değerlerine sahip bir WaterStim arayan herhangi bir şey için arar. Daha sonra, ne ile ilişkili olursa olsun komutunu uygular (bu durumda yanan bir torcu kapalı bir torcaya çevirmek ve bir duman kabarcığı yaymak).
SystemShock2'de aynı motor kullanıldığından, tüm farklı hasar tipleri nasıl kullanılır, farklı mermiler farklı Stims ayarlarına sahiptir ve farklı canavarlar daha sonra farklı Stim tipleri için Receptronlara sahiptir ve 1 *, 2 *, 1 / 2 cephane tipinin "süper etkili" olup olmamasına bağlı olarak yoğunluğu.
Seviye editöründeki nesnelere kaynaklar ve alıcılar ekleyebildiğiniz için çok esnek bir sistem gibi gözüküyordu (ateşe çarptığında açılan tek seferlik bir kapı açmak için, örneğin). "nesnenin kendisiyle ilişkilendirilmiş özel komut dosyaları varsa"
Yapmak istemediğiniz tüm olası nesnelerle çarpışan tüm olası nesnelerin nXn etkileşim matrisini kodlamak zorundasınız! Standart mesajlar aracılığıyla etkileşimleri genelleyerek, işlemi basitleştirirsiniz.