İlk olarak instructables.com‘da yayınlandı.
GameGo Microsoft Makecode uyumlu bir retro oyun taşınabilir konsoludur ve TinkerGen STEM eğitimi tarafından geliştirilmektedir. 20 Mayıs 2020’de piyasaya sürülmesi planlanmaktadır. STM32F401RET6 ARM Cortex M4 çipi üzerine inşa edilmiştir ve STEM eğitmenleri veya retro video oyunları yaratmaktan hoşlanan kişiler için tasarlanmıştır. Bu eğitimi takip edebilir ve oyunu Makecode Arcade simülatöründe deneyebilir ve satın alınabilir hale geldiğinde GameGo’da çalıştırabilirsiniz (bültenimize abone olun online satışların başlangıcı hakkında bildirim almak için).
Bu makalede, 1985 yılında Namco tarafından Nintendo Entertainment System (NES) için üretilen ve yayınlanan klasik Battle City tank nişancı oyununu yeniden yaratmayı deneyeceğiz. Orijinal oyunda oyuncu bir tankı kontrol eder ve düşman tanklarını yok etmek için mermiler atar. Düşman tankları, oyuncunun üssünü ve oyuncunun tankını yok etmeye çalışır. Oyun oynanışında bazı değişiklikler yapacağız, böylece GameGo ile blok programlama uygulamalarına daha iyi uyum sağlayabiliriz, ancak yeniden yapımımız hala orijinal oyuna birçok benzerlik taşıyacak. Hadi başlayalım!
Adım 1: Alter-ego’muz – Sarı Tank
Makecode Arcade’yi https://arcade.makecode.com/ adresinde açın ve yeni bir projeye tıklayın. Alter-ego’muz olan sarı tankı yapmaya başlayacağız. Set mySprite to sprite of kind player bloğunu seçin ve yukarıya bakan bir sarı tank çizin, bu başlangıç sprite’ımız olacak, bu bloğu on start bloğunun içine yerleştirin. Ardından move mySprite with buttons bloğunu ekleyin. Artık simülasyonda butonlarla hareket ettirebileceğimiz bir tankımız var! Harika, ama her zaman aynı yöne bakıyor, aşağı veya yanlara hareket ettiğimizde bile…

Bunu düzeltmek için, her yön butonu için dört tane daha blok ekleyelim. Yeni bir değişken oluşturun, adını direction olarak belirleyin – tankımızın hareket yönünü burada saklayacağız, 100 aşağıyı, -100 yukarıyı, 200 sağa ve -200 sola karşılık gelecek. Neden bu sayılar? Daha sonra, tankımızın ateş edeceği mermileri eklediğimizde göreceksiniz. Bu dört bloğun içindeki mantık oldukça basit – yeni yönün (buton basışından) önceki yönle aynı olup olmadığını kontrol ediyoruz. Eğer aynıysa, temelde hiçbir değişiklik yapmıyoruz. Eğer değilse, tankın sprite’ını değiştiriyoruz ve aşağı ve sola yönlerde durumunda sprite’ın görüntüsünü çeviriyoruz, böylece ek sprite’lar çizmiyoruz. Son olarak, yönün başlangıç değerini -100 (tank yukarıda) olarak atayalım, çünkü tankımız oyuna böyle başlıyor. Şimdi sarı tankı hareket ettirmeyi deneyin, sprite artık hareket yönüne göre değişecektir! Harika, şimdi mermileri ekleyelim.
Mermileri set projectile to projectile (draw small silver square for that sprite) from mySprite with vx vy velocities ile ateşleyeceğiz. İçinde on button A pressed bloğunda, sarı tankın yukarı/aşağı veya sola/sağa bakıp bakmadığını görmek için yönün mutlak değerini kontrol etmemiz gerekiyor. Ardından, yön değişkeninin hızıyla mermiyi ateşlemeye devam ediyoruz – bu yüzden yön değerleri için -100/100/-200/200 kullandık.

Artık mermi ateşleyebilen ve hareket edebilen bir sarı tankımız var. Eğer sarı simüle edilmiş tankların hisleri olsaydı, düşmanlar ve yapacak şeyler olmadan bu boş boşlukta kesinlikle yalnız hissederdi. Bu yüzden, bir sonraki adımda onun zamanını geçirmesi için düşmanlar ekleyelim.
Adım 2: Düşmanları Ortaya Çıkar
Bu adımı, bir dizi yeni değişken oluşturarak başlatacağız: iki dizi (bir düşman sprite’larını tutmak için ve diğeri düşman yönlerini tutmak için), spawn time değişkeni, doğumlar arasındaki süreyi saklamak için ve düşman sayısı maksimum düşman sayısını saklamak için. Ayrıca, başlangıç bloğunda iki mermi (düşman mermisi ve mermi) ekleyeceğiz – bu, daha sonra bir hata ile karşılaşmamızı önleyecektir.
Sonra on game update every … ms bloğunu oluşturuyoruz, oraya spawn_time değişkenini ekliyoruz. Bloğun içindeki mantık basit – eğer savaş alanındaki toplam düşman sayısı maksimum izin verilen düşman sayısından azsa, düşman_sprite_list’e bir düşman ekleyin ve o düşman için 200 (sağa giden) yönü ekleyin.
Sonra, on created sprite of kind Enemy bloğunda bazı grafik efektleri ekliyoruz, onu rastgele boş bir karoya yerleştiriyoruz ve bu sprite için pick_direction fonksiyonunu çağırıyoruz. on sprite of kind Enemy hits wall bloğunda da aynı fonksiyonu çağırıyoruz, pick_direction.

O fonksiyonda ne var? İşte burada işler biraz karmaşıklaşmaya başlıyor, bu yüzden dikkatli olun. Düşman tankının yukarı gitme olasılığı %50 ve aşağı gitme olasılığı %50 – sprite’ı buna göre değiştiriyoruz. Buradaki tek numara, o belirli düşman tankına karşılık gelen değeri enemy_directions_list değiştirmemiz gerektiğidir, böylece mermileri doğru yönde ateşleyebiliriz. Bunun için düşman sprite’ının enemy_sprite_list içindeki indeksini buluyoruz ve o öğenin değerini enemy_directions listesinde değiştiriyoruz.

Son olarak, ateş eden mermileri ekleyelim. Başka bir on game update every 500 ms bloğu ekliyoruz ve enemy_sprite_list içinde bir for item koyuyoruz. %30 olasılıkla bir düşman sprite’ı, hareket yönünde düşman mermisi ateşleyecek.
Şimdi oyunu simülasyonda başlattığımızda, sarı tankımızı ve düşman tanklarını aynı noktada görüp boşluğa doğru hareket ettiklerini görebiliriz. Biz ateş edebiliriz ve onlar da sarı tankımıza ateş edebilir, ama hiçbir şey olmayacaktır. Hala çok anlamdan yoksun hissediyor Son adımda dekorasyonları ve oyun mekaniklerini ekleyelim.
Adım 3: Oyunun 42’si
Bu adımı, Bilgi sekmesinden yaşam ve puan ekleyerek başlatacağız ve yaşamı 10, puanı sıfır olarak ayarlayacağız. Ardından set tile map to … bloğunu ekliyoruz. Dosya haritasını yukarıdaki ekran görüntüsünde gördüğünüz gibi çizin. Duvarları eklemeyi unutmayın!

on sprite of kind Projectile overlaps otherSprite of kind Player ekleyelim – bu, düşman mermilerinin sarı tankımıza çarptığı durumdur. Bu mermilerin düşman mermisi olduğundan ve kendi mermimiz olmadığından emin olmamız gerekiyor, bu yüzden bu koşulu bloğun içine ekleyeceğiz ve eğer True olarak değerlendirilirse, yaşam sayısından bir çıkaracağız. Benzer şekilde, başka bir blokta on sprite of kind Projectile overlaps otherSprite of kind Enemy ekleyerek, merminin sarı tankın mermisi olduğundan emin olacağız ve eğer bu koşul True olarak değerlendirilirse, diğerSprite’ı (düşman tankını) yok edeceğiz, onu enemy_sprite_list listesinden çıkaracağız ve puanı bir artıracağız.

Son şey zafer ve yenilgi koşullarıdır – zafer için, sonsuz blokta puanın 10’dan yüksek veya eşit olup olmadığını kontrol edeceğiz. Eğer öyleyse, zafer ekranını göstereceğiz. Ve yaşam sıfır olduğunda blokta Oyun Bitti ekranını göstereceğiz.
Şimdi simülasyonda deneyin, oyunun beklendiği gibi çalışıp çalışmadığını görün. Ardından GameGo üzerine yükleyin ve düşman tanklarını yok etmenin tadını çıkarın!

Adım 4: Sonsuz Oyun ve İyileştirmeler

GitHub deposumuzda, Makecode arcade için iki dosya indirebilirsiniz – biri, bu talimatları takip ettiğinizde alacağınız dosya ile tamamen aynı ve diğeri, rastgele oluşturulmuş seviye ilerlemesine sahip güncellenmiş versiyondur. 10 seviyeden oluşmaktadır, her biri rastgele oluşturulmuş ve her bir sonraki seviyede düşman sayısı artırılmıştır.
Ve elbette, bunun üzerine oyuna ekleyebileceğiniz daha birçok şey var! Daha iyi müzik, kırılabilir duvarlar, farklı zafer koşulları ve daha fazlası!
Eğer oyunun geliştirilmiş bir versiyonunu yaparsanız, lütfen aşağıdaki yorumlarda paylaşın! Yapımcılar ve STEM eğitmenleri için GameGo ve diğer donanımlar hakkında daha fazla bilgi için web sitemizi ziyaret edin, https://tinkergen.com/ ve blogumuza abone olun.
