Yanıtlar:
Eskiden (1990) eski langırt oyunları şu şekilde yapıldı:
Oyun alanı için birkaç katman vardır (oyunu oynarken gördükleriniz):
ve çarpışmalar için birkaç katman:
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 ):
Bazı oyun şirketleri kendi fizik motorlarını kullanırlar, ancak başka bir daha kolay yol ise Box2D
veya 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.
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.
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 :)
İ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.
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