Bir 2D platformda ezilen oyuncuyu nasıl tespit edebilirim?


19

# 1'de gösterildiği gibi bir platform karakteri için çarpışmayı kontrol ediyorum. Kırmızı noktalar kontrol edilen piksellerdir ve gri çizgiler ilgili eksenleri belirtir. Çarpışmayı bu şekilde kontrol etmekten elde ettiğim sonuçları beğendim (örneğin, sınırlayıcı kutuya karşı). Tek bir sorun dışında her şey tam istediğim gibi çalışır: ezilme tespiti.

Aşağıdaki görüntülerde, açık mavi kutu zemini, turuncu kutu bir nesneyi ve oklar hareket yönünü göstermektedir.

Oyuncunun ezildiğini tespit etmenin basit çözümü, karşı taraflardaki çarpışma noktalarının her ikisinin de tetikleyip tetiklemediğini görmektir. Eğer öyleyse, oyuncu eziliyor. # 2'de, normal bir ezilme senaryosu görebilirsiniz. Oyuncu topraklanır ve üstteki çarpışma noktaları düşen cisimle kesişir. Bu bir ezmeyi tetikler.

# 3, 4 ve 5 sorunlu senaryolar sunar. # 3'te, oyuncu yukarı hareket eden nesneye doğru hareket eder. Sağ taraftaki bir çarpışma noktası nesneyi vuruyor, bir çarpışmaya neden oluyor ve oyuncuyu durduruyor.

Şimdi, nesne yukarı hareket etmeye devam ederse ve oyuncu sağa doğru hareket etmeye devam ederse (# 4'te gösterildiği gibi), nesne oyuncuların sağ taraftaki çarpışma noktasını temizler ve oyuncu sağa hareket eder. Ama şimdi, bunu yaptıktan sonra, nesne bir dikey çarpışmaya neden olan bir üst çarpışma noktasını kesişiyor.

Benzer bir senaryo # 5'te gösterilmiştir. Alttaki çarpışma noktalarının temizlenmesi için iki nesne birbirinden yeterince uzaktır, oyuncunun düşmesine izin verir, ancak yan çarpışma noktalarının temizlenmesine izin vermeyecek ve istenmeyen bir yatay ezmeye neden olmayacak.

Beynimi bir çözüme tuttum, ama ortaya koyduğum hiçbir şey özellikle iyi çalışmadı, bu yüzden dışarıdaki birinin bu sorunları nasıl çözeceğine dair bir fikri veya fikri olup olmadığını merak ediyorum.

resim açıklamasını buraya girin

Biraz karışıklığı gidermek için kırmızı çarpışma noktaları hareketli grafiğin içinde olacaktır ve gri çizgiler yalnızca her çarpışma noktası için ilgili ekseni belirtmek için kullanılmıştır. Örneğin, karakterin hareketli grafiği basit bir yeşil kare olsaydı, toplama noktaları şöyle görünürdi:

resim açıklamasını buraya girin

Yanıtlar:


34

Bence kutunun hareketini hesaba katmanız gerekecek . Yani, sadece kutu oyuncuya doğru hareket ediyorsa ezin.

Bu, hareketin önemli olduğu platformculardaki diğer sorunlara benzer. Örneğin, aşağıdan yukarıya ve aşağıya atlayabileceğiniz platformlar için, oyuncunun yukarı doğru hareket edip etmediğini kontrol etmeyin.

Böylece bir blok, oyuncuyu ancak blok aşağı doğru hareket ediyorsa yukarıdan ezebilir; aşağıdan ancak blok yukarı hareket ediyorsa; sadece blok sağa doğru hareket ediyorsa vb.


13
+1 Bloğun oyuncu olarak değil burada hareket ettiğini göz önünde bulundurun. Kutunun oyuncuyu ezip ezmediğini kontrol etmek yerine kutunun oyuncuyu ezip ezmediğini kontrol ederseniz, sorunun çözülmesi daha kolay olmalıdır
Niels

Bloklar hareket etmediğinde ne olacak? Şimdi # 5'teki bloklara oklar koyduğumu fark ettim, ama bu iki sabit blok anlamına geliyordu.
IanLarson

Sabit blokların ezilmemesi gerektiğine karar verirseniz, oyuncunun takılmadığından ve yoldan çekilebildiğinden emin olun.
congusbongus

Argh, aslında birbirinden uzaklaşan iki nesne tarafından ezilmekten nefret ediyorum , çünkü sadece piksel ve çerçeve mükemmel hale getirdim ve geliştirici tembeldi.
gergedan

9

"Ezilme testi" puan olması mı içeride orada piksel birinde isabet tespit yalnızca oyuncuyu öldürmek yani - Resim # 1'de gösterilen gri kutu.


1
Şunu mu demek istediniz: çarpışma noktalarının sınırları içinde "ezilme" kontrol noktaları? Bununla ilgili gördüğüm sorun, çarpışma çözünürlüğünün, nesnenin iç ezilme kontrol noktalarına ulaşma şansı bile olmadan, çarpışma noktalarından biri "tetiklendiğinde" her eksende gerçekleşeceğidir.
IanLarson

6

80'lerin platformcularıyla büyüyen biri olarak, ilk yorumum, temas noktalarının dışında hiçbir yerde değil sprite üzerinde olması gerektiğidir. Bir silah / kırıcı / düşman karakterinizden açıkça birkaç piksel uzaktayken ölmekten daha sinir bozucu birkaç deneyim vardı - ve bu tür bir deneyim insanların oynamayı durduran şeydir.

Bunu akılda tutarak, yatay ve dikey çarpışma için ayrı noktalara sahip olma fikri uçmuyor. Yani 3. ve 5. davalarınız mevcut değil.

Çarpışma tespitine gelince, daha önce söylendiği gibi, hareket yönünü düşünmeniz gerekir ve dikkate almanız gereken iki hareket ekseniniz vardır. Bir kırıcı aşağıdaysa, oyuncu ileriye yürüyemez - duvar gibi davranmalıdır. Dolayısıyla, aynı yerdeki yatay ve dikey algılama noktaları ile karışıma hareket yönü eklemeden önce durum 4'ü alamazsınız.

Yukarı hareket eden kırıcı ekstra karmaşıklık katar. Eğer oyuncunun kaçma şansı o kadar hızlıysa, o zaman Tamam. Ancak daha yavaşsa, oyuncu yükselen platformun üzerinden geçip diğer taraftan atlayabilmeyi bekler. Oyuncu sprite kırıcıda yukarı doğru yükselir ve tavanda ezilme tespiti gerçekleşir .


3
Küçük nokta - spriteının neye benzediğini bilmiyorsunuz. Herkes için bunun yukarıdaki resimlerde gösterildiği gibi olabileceğini biliyoruz, bu nedenle 3. ve 5. vakalar tamamen geçerli olabilir.
Alex

1
Alex haklı. Açıklığa kavuşturmak için bir düzenleme yaptım. Tutarsız çarpışma kutularından daha kötü bir şey olmadığını kabul ediyorum. Sanırım farklı eksenler için ayrı noktalar kullanmama konusundaki fikrinizi anlıyorum. Bunu yaparsam, yukarıdaki örnekte sekiz köşeden dört köşeye, her köşede bir tane olmak doğru olur. Aslında bunu göz önünde bulundurarak bazı testler yaptım (istenen sonuçlardan daha azıyla), ancak köşeleri "ayırmak" için aradığım davranışı neredeyse mükemmel bir şekilde gerçekleştirdiğinden bunu yapmakta tereddüt ediyorum. Bunlar gerçekten karşılaştığım tek sorun senaryosu.
IanLarson

0

Nesneyi yerden daha sert hale getirebilirsiniz, yani çarpışmayı varsayarsak, oyuncunun hareketli nesneye "itilmesinin" yerine "yere" itilmesi gerekir.

Bu, oyuncunun kendilerini nesnelerin veya zeminin içine "itemediğini" varsayar.


0

Nesnelerin üst üste gelmesini beklemek zorunda kalmadan çakışmalarını tespit edebiliyorsanız, basit bir yaklaşım, oynatıcı ve diğer nesnelerin hareketini bağımsız olarak, her seferinde bir piksel ve daha sonra ayrı çarpışma kontrolleri ile işlemektir. Oyuncu serbestçe hareket ediyorsa ve bu tür bir hareketin sonucu olarak nesnesiyle çarpışırsa, geri çekin. Nesnenin hareketi sonucunda bir nesne ile çarpışma olursa, oynatıcının bu nesne ile aynı yönde hareket edip edemeyeceğini kontrol edin. Öyleyse, oynatıcıyı hareket ettirin. Değilse, "ezilme" durumunu uygun şekilde ele alın (müzikçalara hasar vermek veya öldürmek ve / veya temasa bağlı olarak çarpışan nesneyi geriye doğru hareket ettirmek).

BTW, sadece sınırlı sayıda şekil kombinasyonu çarpışabiliyorsa, "çarpışma algılama" bitmaplerini önceden hesaplamak yararlı olabilir, böylece eğer ilk pikselde ofset (x1, y1) ve ikincisinde bir piksel ayarlanırsa saniyenin ofsetinde (x2, y2), ofsetteki piksel (x1-x2, y1-y2) çarpışma haritasında ayarlanır. Böyle bir önceden hesaplanmış çarpışma haritası, çarpışma haritasında tek bir pikselin durumunu kontrol ederek iki sprite arasındaki çarpışmaları tespit etmeyi mümkün kılacaktır.


0

Bir oyuncuyu ezmek için iki nesne gerekir. Ezilme algılamanız oyuncunun iki nesne arasında olup olmadığını, aralarındaki boşluk oyuncunun boyutuna eşit olduğunu ve mesafenin azaldığını kontrol etmelidir.


0

Şimdiye kadar çalışacak bir sonraki buluyorum. Kırıcılar hareketi hakkında "harici" bilgi gerektirmez ve yanlış pozitif problemi çözer. Yanlış bir pozitif tespit edildiğinde, çarpışma olarak ele alınır (ve gerçekte olan budur):

Fikir şu: karakterin hareket edip etmediğini umursadığımızda neden kırıcının hareket edip etmediğini kontrol etmek. Her ikisi de, ezmenin karakterin kendi hareketinden kaynaklanan yanlış pozitif veya kırıcı nesne hareketinden kaynaklanan gerçek ezme olup olmadığını cevaplayabilir.

Karakter hareket ediyor ve eziliyorsa (gelen çerçeve için karşı taraftaki çarpışmalar), son çerçeve / yineleme koordinatlarında ezilme olup olmadığını tekrar kontrol edin:

  1. Tekrar teyit edilmezse, karakterin kendi hareketinden kaynaklanır ve karakter bir çarpışma gibi son kareye / yineleme koordinatlarına döndürülmelidir

  2. Ezilme ikinci kez onaylanırsa, ezilme ile devam edin.

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.