İzometrik çarpışma tespitini nasıl ele alırım?


14

İzometrik bir run-jump tarzı platform oyunu yapmak istiyorum. Oyuncu, zeminin üzerindeki platformların üstüne atlayabilmeli, nesnelerin yanına vurabilmelidir.

Bir 2D oyun motoru kullanacağım, bu yüzden kullanmadığım boyutlar için tam 3D çarpışmayı taklit etmek istemiyorum.

Oyundaki nesnelerin aşağıdakiler kullanılarak yerleştirilmesi gerektiğini düşünüyorum: Derinlik için X, Y, genişlik, yükseklik ve Z.

Bu değerleri kullanarak, çarpışmaları nasıl tespit etmeliyim?


Bunun genel bir soru olduğunu biliyorum, ancak daha ayrıntılı cevaplar veya iyi öğrenme kaynaklarına bağlantılar istiyorum.
jdeseno

Yanıtlar:


19

2 seçenek:

  • Sabit bir ortografik kamera ile 3D oyun olarak değerlendirebilirsiniz. Daha sonra herhangi bir standart 3D oyun kaynağını / kitabını / öğreticisini / kütüphanesini kullanabilirsiniz. Spritelarla 2D olarak işlenmiş olsa bile, hareket vb. İçin matematik hala sahnenin arkasında 3D olacaktır. Bu size en doğru sonuçları verecektir.

  • Eklenen height özelliği ile yukarıdan aşağıya 2D bir oyun olarak değerlendirebilirsiniz. Örneğin, her döşemenin yükseklik değerine sahip olduğu bir 2B ızgara düşünün. Bir döşemeden diğerine geçerken, bir karakterin belirli bir döşemeye geçmesine izin verirsiniz, ancak karakterin ayakları o döşemenin yüksekliğinin üstünde veya ona eşitse, ancak zıplıyorlarsa ve yerçekimi bir döşemenin üstüne indirirse, orada kalsınlar. Biraz daha fazla çalışmayla köprülerin altından geçebilirsiniz.


4

Bunu basitleştirmenin birçok yolu vardır. Örneğin, katmanlara izin vermediyseniz (örneğin, hem üstte hem de altta yürüyebileceğiniz bir köprü, çarpışma setini yükseklik + derinliğine göre filtrelediğiniz X / Y boyutlarında tüm çarpışma algılamayı yapabilirsiniz. veya daha yüksek.


2

Oyun dikdörtgen bir ızgaraya dayanıyorsa, bu ızgara X / Y eksenlerinizi tanımlar. Ve Z yükseklik için kullanılabilir.

O zaman çarpışmalar 2B karo tabanlı oyun kadar az ya da çok kolaydır.

Sonra sadece ızgaradan render için izometrik ekran koordinatlarına dönmeniz gerekir. Bu oldukça basittir - ancak sıralama amaçları için 'derinlik' değerlerini hesaplamayı düşünmeniz gerekebilir (izometrik sahneyi arkadan öne doğru oluşturma)


Yükseklik için Z kullanmak içgüdüye aykırıdır, ancak yukarıdan aşağıya 2D oyunlarda yapılması doğru olan şeydir. yan yana ve yukarıdan aşağıya oyunlar arasında kodu yeniden kullanabilirsiniz.
Iain

2

Google'da bu demoyu buldum: http://planetskill.com/iso/

WASD hareket etmek için. Atlamak için boşluk çubuğu

Sadece yukarı / aşağı ekseniyle çarpışmayı uygular, ancak diğer çarpışmayı eklemek kolay olmalıdır:

Bir sonraki adımın yukarı / aşağı konumu maksimum değerinizden yüksekse hareket etmeyin. Bu, atlamayı kolay bir şekilde gerçekleştirmenize de izin vermelidir.

Burada örnek kod: http://gist.github.com/478997


2

Yukarıdakilerin hepsi. İzometrik sadece kesilmiş bir 2d ızgaradır, bu yüzden 2d tilemap gibi davranın ve derinliği kodlamanın bir yolunu düşünün. Bunu normal bir 2d oyunda nasıl yapardınız ('zıplarken' blokların arkasına veya önüne gidebilir misiniz? Döşeme başına bir derinlik (derinlik tamponu -> z tamponu) depolarsınız veya birden çok katman kullanırsınız veya meraklısı istiyorsanız, her tiletype (veya mapposition) için bir geri arama uygularsınız ve ne istersen yapabilir, derinliği kontrol edebilir, ekipmanı kontrol edebilir, oyuncuyu çözebilir, oyuncuyu yavaşça hareket ettirebilir, HD biçimlendirebilirsiniz.


İyi cevap Kaj - işin özü bu, kimsenin gündeme getirmediğine şaşırdım. Bu her zaman fizik açısından izometri ile ilgili yeni başlayanların kafasını karıştıran şeydir.
Mühendis

1

Seviyenizin üzerinde görünür olmayan ayrı bir çarpışma katmanı olabilir ve bunu çarpışmayı kontrol etmek için kullanabilirsiniz .. Oyuncunun hangi katmanda olduğunu bildiğiniz sürece bunu birden fazla katman için de kullanabilirsiniz;)

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.