İçindekiler:

Micropython'daki Space Invaders on Micro:bit: 5 Adım
Micropython'daki Space Invaders on Micro:bit: 5 Adım

Video: Micropython'daki Space Invaders on Micro:bit: 5 Adım

Video: Micropython'daki Space Invaders on Micro:bit: 5 Adım
Video: How to make a Bluetooth remote using a Raspberry Pi Pico W and MicroPython 2024, Temmuz
Anonim
Image
Image

Önceki yazılarımızda TinkerGen eğitimi tarafından geliştirilen taşınabilir bir retro oyun konsolu olan GameGo'da oyun yapımını araştırmıştık. Yaptığımız oyunlar eski Nintendo oyunlarını andırıyordu. Bugünün makalesinde, atari oyunlarının altın çağına bir adım geri atacağız. Space Invaders oyununu Micro:bit mikrodenetleyici üzerinde Micropython'da yeniden oluşturacağız - ve bir bükülme olarak, oyunu daha rahat oynamamızı sağlayan BitPlayer Micro:bit uzantısını da kullanacağız.

Bu eğitim, daha önce grafik programlama eğitimleri için kullandığımız geleneksel aşamalı sıralama yerine Micropython'da oyunu kodlamakla ilgili olduğundan, kod bloğunu blok blok gözden geçireceğiz - önemli işlevleri, sınıfları ve ana döngü. Kodun tamamını bu projenin GitHub deposundan indirebilirsiniz. Kemerlerinizi bağlayın ve başlayalım!

Gereçler

TinkerGen BitPlayer

BBC Mikro: bit

Adım 1: Ana Döngü

Oyun kolu
Oyun kolu

Bu derste "yöntem" kelimesini oldukça sık kullanacağım. Python'daki bir yöntem, nesne/sınıflarla ilişkilendirilmesi dışında bir işleve biraz benzer. Bu nedenle, sadeleştirme için "sınıf içinde bir işlev" olarak okuyabilirsiniz. Yöntemler hakkında daha fazla bilgiyi buradan okuyabilirsiniz.

ile ana döngüye giriyoruz.

game_over değilken:

şart. İçeride, seviyeler sözlüğünden istilacıların sayısını, ortaya çıkma şanslarını ve bir sonraki seviyeye geçmek için gereken sayıları alıyoruz. Daha sonra, JoyStick sınıf örneğinin Listen_Dir örnek yöntemleriyle sol-sağ hareketi kontrol ederiz. Koşullardan biri True olarak değerlendirilirse, oynanabilir karakterimizin x değerini artırır/azaltırız. Bunu iki if koşuluyla [-2, 2] ile sınırlıyoruz. Ardından DisplayBuffer sınıfının bir örneğini başlatıyoruz ve "kalkan" veya "ateş mermisi" düğmesine basıldığını kontrol ediyoruz. Nesneleri daha sonra işlemek üzere ayarlamak için DisplayBuffer.set() yöntemini kullanırız. Kalkanı oluşturmak için doğrudan DisplayBuffer.set() kullanıyoruz, ancak mermiler ve istilacılar için onları ilgili listelerine ekliyoruz ve daha sonra DispBuffer.render() ile oluşturmak için aşağıdaki kodla birer birer for döngüsünde set() yapıyoruz:

madde işaretleri içinde b için: vaders içinde v için b.render(dispBuf): v.render(dispBuf)

Tüm istilacılar, mermiler ve kalkanlar, her ana döngü yinelemesinde bir kez görüntülenir.

dispBuf.render()

Ana döngü bitmeden önce işgalcilerin mermilerinden herhangi birinin ekranın sonuna ulaşıp ulaşmadığını kontrol ediyoruz ve varsa onları ilgili listelerinden siliyoruz.

2. Adım: Oyun çubuğu

Oyun kolu
Oyun kolu

BitPlayer'ı tutmak ve kullanmak kolaydır, Gameboy veya PSP denetleyicileri gibi 2 eksenli bir joystick ile ayrıca L, R, A, B, C ve D olarak etiketlenmiş 6 programlanabilir düğme daha içerir. Etkileyici ve etkileşimli bir deneyim için BitPlayer kendisinde bir zil, bir titreşim motoru ve bir OLED ekran gibi ek çevre birimlerini bağlamak için bir Grove I2C bağlantı noktası bulunur.

Bu oyun için joystick'in yalnızca sol-sağ rocker'ını kullanıyoruz, örneğin tüm BitPlayer düğmelerinin kullanımıyla ilgili olarak bu projenin GitHub deposundaki joystick_example.py dosyasına göz atabilirsiniz. JoyStick sınıfının örneğini oluştururken, X ekseni varsayılan okumasını kontrol ederiz ve bu değeri self. Read_X içinde saklarız. Ardından Listen_Dir işlevinde, bu varsayılan değerden sapmanın duyarlılık değişkeninden daha yüksek olup olmadığını kontrol ederiz (JoyStick'in çok hassas olduğunu düşünüyorsanız, kendiniz ayarlamayı deneyin) ve algılanan yöne göre True of False değerini döndürürüz.

Bunun nasıl çalıştığına dair somut bir örneğe bakalım:

Varsayılan X ekseni okumamızın 0 olduğunu varsayalım. Ardından Joystick'i sağa hareket ettirirsek:

New_X = JoyStick_X.read_analog() #New_X=200

Sağ = New_X - self. Read_X #Sağ = 200 Sol = self. Read_X - New_X #Sol = -200

Sonra yönü kontrol ettiğimizde:

Precision = 150if Right > Precision: #200 > 150 True Get_Rocker = DIR['R'] elif Left > Precision: #-200 > 150 False Get_Rocker = DIR['L'] else: Get_Rocker = DIR['NONE'] ise Dir == Get_Rocker: True döndür, yoksa False döndür

3. Adım: Arabelleği Görüntüle

Ekran Arabelleği
Ekran Arabelleği

DisplayBuf sınıfı, LED ekranın kontrolünden sorumludur. Set() ve render() olmak üzere iki yöntem kullanılarak yapılır. set() yöntemi, LED ekran piksellerine karşılık gelen değerleri değiştirir. Micro:bit LED ekranındaki piksellerin string veya liste olarak ifade edilebileceğini hatırlayabilirsiniz - "00000:00000:00000:00000:00000" boş bir ekrandır. "00000:00000:00000:00000:00100", alt sıranın ortasında loş ışıklı piksel bulunan bir ekrandır.

00000:

00000

:00000

:00000:

00100"

Bu gösterimin işlenmesi daha kolay olabilir:)

Yani, ana döngü sırasında yaptığımız şey, ekranda görüntülenmesi gereken tüm nesnelerimizi ayarlamak için DisplayBuf'un set() yöntemini çağırmaktır. Daha sonra hepsini aynı anda ekranda göstermek için render() yöntemini kullanırız.

Adım 4: İstilacılar, Mermiler ve Oyuncu

İstilacılar, Mermiler ve Oyuncu
İstilacılar, Mermiler ve Oyuncu

Mermiler ve İstilacılar Mover sınıfına aittir. Mover sınıfı örnekleri, parlaklıklarının yanı sıra x, y konumlarına ve hızlarına sahiptir. Mover sınıfının iki örnek yöntemi vardır, set() ve move(). set() yöntemi, LED matrisinde daha sonra işlemek üzere kaydetmek üzere güncellenmiş koordinatlarla DisplayBuf set() yöntemini çağırır. move() yöntemi, örnek hızına göre örnek koordinatını günceller - bu daha sonra, seviyeler ilerledikçe istilacıların hızını değiştirmemiz gerektiğinde kullanışlı olur.

Bullet sınıfı ve Invader sınıfı Mover sınıfının alt sınıflarıdır. Burada kalıtım denen bir şey kullanıyoruz. super() işlevi, kodu tekrarlamaya gerek kalmadan alt sınıftaki üst sınıfın yöntemlerini çağırmamızı sağlar.

Adım 5: Kendiniz Yapın

Kendi haline getir
Kendi haline getir

Tebrikler! Klasik Space Invaders oyununu Micro:bit'te harika bir oyun donanımıyla yeniden yarattınız. Tabii ki, buradan oyun kodunu geliştirebilirsiniz - örneğin, şu an itibariyle oyun sadece bir seviyeye sahip - daha zorlu olanları ekleyebilirsiniz. Ayrıca, hatırlayabileceğiniz gibi, orijinal oyunda, oyuncunun önünde yüzen kayalar var, bunları da ekleyebilirsiniz.

Oyunun geliştirilmiş bir versiyonunu yaparsanız, aşağıdaki yorumlarda paylaşın! Üreticiler ve STEM eğitimcileri için BitPlayer ve diğer donanımlar hakkında daha fazla bilgi için https://tinkergen.com/ web sitemizi ziyaret edin ve bültenimize abone olun.

TinkerGen kısa süre önce MARK(Make A Robot Kit) için bir Kickstarter kampanyası oluşturdu; kodlama, robotik ve yapay zeka öğretmek için bir robot kiti!

hexkcd/micro-vaders'ın orijinal Micropython kodu, TinkerGen BitPlayer ile çalışacak şekilde değiştirildi.

Önerilen: