C 2B Oyun Programlama Eğitimi: Yılan

Bu öğreticinin amacı 2D oyun programlama ve C dilini örneklerle öğretmektir. Yazar 1980'lerin ortalarında oyun programladı ve 90'lı yıllarda bir yıl MicroProse'de oyun tasarımcısıydı. Bunların çoğu günümüzün büyük 3D oyunlarının programlanmasıyla ilgili olmasa da, küçük gündelik oyunlar için yararlı bir tanıtım görevi görecektir.

Yılan Uygulamak

Nesnelerin 2B bir alan üzerinde hareket ettiği yılan gibi oyunlar, oyun nesnelerini 2B ızgarada veya tek boyutlu bir nesne dizisi olarak temsil edebilir. "Nesne" burada nesne yönelimli programlamada kullanılan bir nesne değil, herhangi bir oyun nesnesi anlamına gelir.

Oyun Kontrolleri

Tuşlar W = yukarı, A = sol, S = aşağı, D = sağ ile hareket eder. Oyundan çıkmak için Esc tuşuna basın, kare hızını değiştirmek için (bu, ekranla senkronize edilmez, böylece hızlı olabilir), hata ayıklama bilgilerini değiştirmek için sekme tuşuna ve duraklatmak için p tuşuna basın. Duraklatıldığında resim yazısı değişir ve yılan yanıp söner,

Yılanda ana oyun nesneleri

instagram viewer
  • Yılan
  • Tuzaklar ve meyve

Oynanış amacıyla, bir dizi ints her oyun nesnesini (veya yılanın bir kısmını) tutacaktır. Bu, nesneleri ekran arabelleğine dönüştürürken de yardımcı olabilir. Oyunun grafiklerini şu şekilde tasarladım:

  • Yatay Yılan Gövdesi - 0
  • Dikey Yılan Gövdesi - 1
  • 4 x 90 derecelik dönüşlerde kafa 2-5
  • 4 x 90 derecelik dönüşlerde kuyruk 6-9
  • Yön Değişikliği Eğrileri. 10-13
  • Elma - 14
  • Çilek - 15
  • Muz - 16
  • Tuzak - 17
  • Yılan grafik dosyasını görüntüle snake.gif

Bu nedenle, bu değerleri blok [GENİŞLİK * YÜKSEKLİK] olarak tanımlanan bir ızgara türünde kullanmak mantıklıdır. Izgarada yalnızca 256 konum olduğundan, tek bir boyut dizisinde saklamayı seçtim. 16 x16 ızgarasındaki her bir koordinat 0-255 arasında bir tamsayıdır. Izgarayı daha büyük yapabilmeniz için ints kullandık. Her şey # 16 ile WIDTH ve HEIGHT olan tanımlarla tanımlanır. Yılan grafikleri 48 x 48 piksel (GRWIDTH ve GRHEIGHT #defines) olduğundan, pencere başlangıçta ızgaradan biraz daha büyük olacak şekilde 17 x GRWIDTH ve 17 x GRHEIGHT olarak tanımlanır.

İki indeks kullanmak her zaman birden yavaş olduğu için oyun hızında faydalar vardır, ancak dikey hareket etmek için yılanın Y koordinatlarına 1 eklemek veya çıkarmak yerine WIDTH değerini çıkarırsınız. Sağa gitmek için 1 ekleyin. Sinsi olmakla birlikte, derleme zamanında x ve y koordinatlarını dönüştüren bir l (x, y) makrosu tanımladık.

Makro Nedir?

 #define l (X, Y) (Y * GENİŞLİK) + X

İlk satır 0-15 dizini, 2. 16-31 vb. Yılan ilk sütundaysa ve sola hareket ediyorsa, sola hareket etmeden önce duvara çarpma kontrolü% WIDTH == 0 ve sağ duvar koordinatı% WIDTH == WIDTH-1 olup olmadığını kontrol etmelidir. %, C modül operatörüdür (saat aritmetiği gibi) ve bölünmeden sonra kalanı döndürür. 31 div 16, 15 kaldı.

Yılanı Yönetmek

Oyunda kullanılan üç blok (int dizileri) vardır.

  • yılan [], bir halka tamponu
  • şekil [] - Yılan grafik dizinlerini tutar
  • dir [] - Yılandaki baş ve kuyruk dahil her bölümün yönünü tutar.

Oyun başlangıcında, yılan bir baş ve bir kuyruk ile iki segment uzunluğundadır. Her ikisi de 4 yöne bakabilir. Kuzey için kafa indeks 3, kuyruk 7, doğu kafa 4, kuyruk 8, güney kafa 5 ve kuyruk 9 ve batı için kafa 6 ve kuyruk 10. Yılan iki bölüm uzunluğunda iken, baş ve kuyruk her zaman 180 derece aralıklıdır, ancak yılan büyüdükten sonra 90 veya 270 derece olabilir.

Oyun, kafa 120. konumda kuzeye, kuyruk ise kabaca ortada 136. güne bakacak şekilde başlar. 1.600 baytlık küçük bir depolama maliyetiyle, yılanın konumlarını yukarıda belirtilen yılan [] halka tamponunda tutarak oyunda fark edilebilir bir hız artışı elde edebiliriz.

Halka Tamponu Nedir?

Halka arabelleği, sabit boyutlu ve tüm verileri tutacak kadar büyük olması gereken bir kuyruğun depolanması için kullanılan bir bellek bloğudur. Bu durumda, sadece yılan için. Veriler kuyruğun önüne itilir ve arkadan alınır. Sıranın önü bloğun sonuna çarparsa, etrafı sarar. Blok yeterince büyük olduğu sürece, sıranın önü asla arkaya yetişmeyecektir.

Yılanın kuyruktan başa (yani geriye doğru) her konumu (yani, tek int koordinatı) halka tamponunda saklanır. Bu, hız avantajları sağlar çünkü yılan ne kadar uzun sürerse sürsün, sadece kafa, kuyruk ve kafadan sonraki ilk segmentin (varsa) hareket ettikçe değiştirilmesi gerekir.

Geriye doğru saklamak da yararlıdır çünkü yılan yiyecek aldığında, yılan bir sonraki taşındığında büyür. Bu, kafa halka tamponundaki bir yeri hareket ettirerek ve eski kafa konumunu bir segment olacak şekilde değiştirerek yapılır. Yılan, bir kafa, 0-n segmentler) ve daha sonra bir kuyruktan oluşur.

Yılan yemek yediğinde, atefood değişkeni 1 olarak ayarlanır ve DoSnakeMove () işlevinde kontrol edilir.

Yılanı Hareket Ettirmek

Halka arabelleğindeki baş ve kuyruk konumlarını göstermek için headindex ve tailindex olmak üzere iki dizin değişkeni kullanıyoruz. Bunlar 1 (headindex) ve 0'dan başlar. Halka tampondaki konum 1, yılanın tahtadaki konumunu (0-255) tutar. Konum 0 kuyruk konumunu tutar. Yılan bir konumu ileri hareket ettirdiğinde, hem tailindex hem de headindex bir artırılır ve 256'ya ulaştığında 0'a yuvarlanır. Şimdi başın olduğu yer kuyruğun olduğu yer.

200 segmentte sarılıp kıvrılmış çok uzun bir yılanla bile. her hareket ettiğinde yalnızca headindex, başın yanındaki segment ve tailindex değişir.

Not çünkü yol SDL çalışır, her kareyi tüm yılanı çizmeliyiz. Her öğe çerçeve arabelleğine çizilir ve sonra döndürülür, böylece görüntülenir. Bunun bir avantajı var, çünkü yılanı tüm ızgara pozisyonunu değil, birkaç pikseli düzgün bir şekilde hareket ettirebiliyorduk.

instagram story viewer