Pinball Oyunu için 2D Çarpışma tespiti


9

Şimdiye kadar önceki oyunlarda kutularla basit 2B çarpışmayı kullandım ve daha sonra bir çarpışma için piksel düzeyinde kontrol ettim.

Neredeyse çok sayıda çerçevede bir langırt oyunu yaparsanız, top bir duvar veya başka bir yüzeyle temas edecek, bu yüzden başka bir yaklaşım var mı?

Yanıtlar:


19

Eskiden (1990) eski langırt oyunları şu şekilde yapıldı:

Oyun alanı için birkaç katman vardır (oyunu oynarken gördükleriniz):

resim açıklamasını buraya girin

ve çarpışmalar için birkaç katman:

resim açıklamasını buraya girin resim açıklamasını buraya girin

Sol gri tonlamalı resim ana oyun için bir çarpışma haritası, sağ resim özel alan için bir çarpışma haritası: langırt rampaları.

White = top için boş alan, renk endeksi 255.

Gray= top bu bölgeden "itilecek". renk indeksi = top konumuna eklenecek vektör açısı. açık gri = 0 derece. koyu gri = 360 derece.

Bazı sözde kod:

void do_ball_physics()
{
    while(1)
    {
         byte color = read_pixel_under_ball(ballx, bally); //one pixel read
         if(color == 255) //see remark below
            break;
         float vectorx = sin(color/255.0f * 2.0f * PI);
         float vectory = cos(color/255.0f * 2.0f * PI); 
         ballx += vectorx; //push ball away from one unit
         bally += vectory; //

    }
}

Bazı özel renk indeksleri de çarpışma daha başka bir şey için kullanılabilir, özel bir renk yelpazesi (mesela: 240-255) gibi özel bölgeleri tespit etmek için rezerve edilebilir spinners, triggers, bumpers, holes, ...

Gördüğünüz gibi, bu çok basit. Çerçeve başına yalnızca birkaç piksel "okunur". Bu nedenle fizik simülasyonunun gerçek bir yüksek kare hızında çalışmasını sağlayabilirsiniz, örneğin: 200 fps. Yüksek kare hızının kullanılması simülasyonu yumuşatacak ve "tünelleme" yi azaltacaktır (bu, top çok hızlı gittiğinde ve çarpışmadan elemanları geçirdiğinde gerçekleşir). Bu basitlik, günlerde pürüzsüz 386 computers(ve hatta hızlı 286) pürüzsüz langırt oyunlarını mümkün kılan şeydir ( renk döngüsü, vga kaydırma ve sprite maskeleme gibi diğer hileler arasında ...).

Bugün çoğu langırt oyunu artık böyle yapılmıyor. Bunun yerine, oyun alanı çokgenler veya sprite kullanarak 2d / 3d bir sahne ve basitleştirilmiş görsel oyun alanının şeklini temsil eden bazı basit çizgiler, bezier eğrileri veya kürelere karşı çarpışmalar yapılır.

örnek ( görsel langırttan ):

resim açıklamasını buraya girin

Bazı oyun şirketleri kendi fizik motorlarını kullanırlar, ancak başka bir daha kolay yol ise Box2Dveya gibi bir fizik motoru kullanmaktır Bullet. Gördüğüm çoğu iPhone langırt oyunu, önceden var olan bir fizik motoru + bazı 3d varlıkları kullanıyordu.


... burada javascript ve tuvalden bahsediyoruz, bu yüzden bu çerçevede mümkün olan en yavaş işlem ... pikselleri çizmek ve okumak ... özellikle en yavaş cihazlarda. Yani bu cevabın 4 / 5'i tarih / alakasız. Ancak rasyonellik resimlerle rekabet edemez.
GameAlchemist

1
Çarpışma haritaları bir dizide saklanabilir, neden bazı tuvallerde saklamak istersiniz? Dediğiniz gibi, cevabın ilk kısmı çoğunlukla tarih içindir, ancak çok düşük uçlu bir CPU'ya (örneğin: old gsm) bir langırt uygulamak gerekiyorsa, bu hala geçerlidir. Modern zamanlarda, jbox2d gibi bir fizik motoru kullanmanızı veya çizgi parçalarına veya bezier eğrilerine karşı çarpışmalarla fiziği yapmayı öneriyorum (böyle bir şey yazabileceğinizi düşünüyorsanız).
tigrou

Görüntülerdeki pikselleri okumak modern tarayıcılarda da çok hızlıdır. İlk "omg JS, C'den daha hızlıdır" demolarının tümü, görüntü işleme çekirdekleridir.
Sean Middleditch

Tigro çarpışma haritaları hakkında nasıl bilgi edindiniz?
Bemmu

1
Bu langırt hayalleri nedeniyle yeniden: pouet.net/prod.php?which=24499 (benim tarafımdan değil). Kaynaklara bak, bahsettiğim çarpışma haritası orada.
tigrou

1

Langırtlar çok zengin fizik setlerine sahiptir, sadece delikler veya duvarlar değil, aynı zamanda topun yavaşladığı ve daha sonra hızını geri aldığı tepki veren elemanlar (geri vurma) veya pürüzlü yüzey.

İyi bir langırt oluşturmak istiyorsanız, gidilecek yol ya bir 3D çarpışma algılaması ya da her bir harcanabilir nesnenin mesafe ve hız parametrelerine sahip bir yönteme sahip olan ve değişen hızları döndüren kendinden uyarlanmış bir sistem kullanmaktır.


Neden 3D çarpışma tespiti, bunun 2D üzerinde ne işe yaradığını söylüyorsunuz?
John

@John Rampaları vs. olan bir 3D oyun olarak iyi bir langırt hayal ediyorum. Bu rampaları 2D olarak programlayabilir ve rampanın üzerinden geçtiğinde topu yukarı ölçeklendirebilir ve kendinize düştüğünde topu hala 3D yapabilirsiniz. oyun, sadece kendiniz Z boyutu ekleyin.
Markus von Broady

1

Bir süre önce bir langırt oyunu yaptım; piksel bazındaydı. Sadece çarpışma verilerini içeren bir çarpışma haritası vardı. Yaklaşık bir çarpışma normalini bulmak kolaydı:

Çarpışma haritası alanını üst üste bindirin, merkezi bulun, o noktadan top merkezine vektörü oluşturun, sonra normalleştirin.

Umarım size bazı fikirler verir :)


1

İlk önce bir langırt oyunu yaparsanız, büyük olasılıkla sınırlayıcı KUTU'dan daha sınırlayıcı-CIRCLE çarpışma tespitine ihtiyacınız olacak :-)
Tam teşekküllü bir langırtta yer alan fiziğin karmaşıklığı göz önüne alındığında, mevcut 2D fizik motoru. Box2D javascript oldukça üne sahiptir, başkaları olabilir ama ben iyi (ve ücretsiz) bir karşılaşmadım.
Rq1: Kesinlikle (benim yaptığım gibi) oyununuzdaki güncelleme ve çizim arasındaki klasik bölünmeyi kullanıyorsunuz. Güncellemeyi çağırmak, ardından düzenli bir şekilde çizmek için bir zamanlayıcı (setInterval / setTimeout) ve / veya RequestAnimationFrame kullanırsınız. Bir langırt, bir zamanlayıcı sürüş güncellemesi ve başka bir berabere sürüş yapmak istediğiniz oyun türü olabilir, böylece çok çeşitli cihazlarda çalışmak için her birinin hızını bağımsız olarak ayarlayabilirsiniz. Cihaz çok yavaşsa düşemeyeceğiniz (güncelleyip çizemeyeceğiniz) için: iki güncelleme (dt) arasındaki süre çok uzarsa, fizik motoru bir çarpışmayı kaçırabilir.


0

2d vs 3d konu için görsel langırt vs gelecek langırt bir göz atabilirsiniz. Görsel langırt oynarsanız (Her şey 2d'de yapılır) o zaman gelecekteki langırt veya Zen Pinball gibi bir şey oynadıklarında farkı hissedersiniz. Şahsen 3d'yi tercih ederim, ancak projeniz 2d'ye daha uygun olabilir, Sadece buna karar verebilirsiniz

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.