İçindekiler:

Network Rivalry: BBC Micro:bit için Düşük Gecikmeli Bir Oyun: 10 Adım (Resimlerle)
Network Rivalry: BBC Micro:bit için Düşük Gecikmeli Bir Oyun: 10 Adım (Resimlerle)

Video: Network Rivalry: BBC Micro:bit için Düşük Gecikmeli Bir Oyun: 10 Adım (Resimlerle)

Video: Network Rivalry: BBC Micro:bit için Düşük Gecikmeli Bir Oyun: 10 Adım (Resimlerle)
Video: 7 düvel birleşti batıramadı! AMD, sıfırdan zirveye nasıl tırmandı? 2024, Temmuz
Anonim
Ağ Rekabeti: BBC Micro:bit için Düşük Gecikmeli Bir Oyun
Ağ Rekabeti: BBC Micro:bit için Düşük Gecikmeli Bir Oyun
Ağ Rekabeti: BBC Micro:bit için Düşük Gecikmeli Bir Oyun
Ağ Rekabeti: BBC Micro:bit için Düşük Gecikmeli Bir Oyun

Bu eğitimde, BBC micro:bit'te aşağıdaki özelliklere sahip temel bir çok oyunculu oyunun nasıl uygulanacağını açıklayacağım:

  • Basit bir arayüz
  • Düğmeye basma ve ekran güncellemeleri arasında düşük gecikme süresi
  • Esnek sayıda katılımcı
  • Bir ana uzaktan kumanda ("kök") cihazı kullanarak oyun üzerinde kolay kontrol

Oyun aslında bir siyaset simülasyonudur. İki oyuncu dışında tüm oyuncular herhangi bir takıma atanmadan başlar. Bu oyunculardan biri A Takımına, diğeri B Takımına atanır.

Her oyuncu için oyunun amacı, herkesin dönüştürüldüğü anda oyuncuların çoğunluğu ile takımda olmaktır.

Yukarıdaki şema, bir sonlu durum makinesini, yani cihazın içinde olabileceği durumların ve bu durumlar arasındaki geçişlerin bir spesifikasyonunu göstermektedir.

Durum, açıldığından beri cihazın hafızasını tanımlayan mevcut veri seti olarak düşünülebilir. Bu verilere dayanarak, cihaz belirli eylemleri gerçekleştirebilir veya kullanıcı girişine farklı tepki verebilir.

Geçiş, doğru olduğunda aygıtın durumunu değiştirmesine neden olan mantıksal bir durumdur. Bir durumdan başka bir duruma geçiş olabilir. Bir durum birden fazla geçişe sahip olabilir.

Yukarıdaki diyagram aşağıdaki durumları belirtir:

  • Atanmamış
  • A'yı dinle
  • B'yi dinle
  • A Takımı
  • B Takımı

Oyun kodunu çalıştıran bir cihaz, bu beş durumdan herhangi birinde olabilir, ancak her seferinde yalnızca bir tane ve yalnızca bu beş durumda olabilir.

Kılavuz boyunca, https://makecode.microbit.org adresinde bulunabilecek Microsoft'un MakeCode düzenleyicisini kullandığınızı varsayacağım.

Oyunun tam uygulaması burada bulunabilir:

makecode.microbit.org/_CvRMtheLbRR3 ("microbit-demo-user" proje adıdır)

Ve ana ("kök") ağ denetleyicisinin uygulanması burada bulunabilir:

makecode.microbit.org/_1kKE6TRc9TgE ("microbit-demo-root" proje adıdır)

Eğitimim boyunca bu örneklere değineceğim.

1. Adım: Büyük Resim Tasarımında Dikkat Edilecek Hususlar

Herhangi bir kod yazmadan önce, son ürünümüzün nasıl görünmesini istediğimizi düşünmeliyiz. başka bir deyişle, uygulamanın gereksinimleri nelerdir? Kodumuz bittiğinde cihaza ne yapmasını söylemelidir? Ana uygulamanın işlevselliğini, her biri farklı bir tasarım perspektifinden ele alınabilecek altı kategoriye ayırdım.

  1. Cihazın eylemlerini mevcut durumuna göre kontrol etmek istiyoruz
  2. Cihazın kullanıcı girişine tepki vermesini istiyoruz
  3. 5 x 5 LED ekranı kullanarak animasyonları ve grafikleri görüntülemek isteyebiliriz
  4. Cihaz açıldığında cihaz hafızasındaki veri değerlerini başlatmak istiyoruz.
  5. Cihazın radyosunu kullanarak verileri kablosuz olarak iletmek istiyoruz
  6. Cihazın radyosu üzerinden veri dinlemek ve almak ve buna göre işlemek istiyoruz.

Her biri hakkında biraz daha ayrıntıya girmeme izin verin.

1. Cihazın eylemlerini mevcut durumuna göre kontrol etmek istiyoruz

Diğer birçok program gibi, kod tarafından belirtilen talimatların yürütülmesi her seferinde bir satır olur. Cihazımızın, bu öğreticinin başındaki şemada gösterildiği gibi, dahili durumuna göre belirli talimatları yürütmesini istiyoruz. Cihazın yapması gerektiğini kontrol eden her kod bloğundan sonra bir dizi koşul yazabiliriz, ancak bu yaklaşım çok hızlı bir şekilde çok dağınık olabilir, bu yüzden bunun yerine sadece bir değişkeni kontrol eden ve bu değişkene dayanan sonsuz bir döngü kullanacağız., belirli bir dizi talimatı yürütür veya hiçbir şey yapmaz. Bu değişken hem kullanıcı uygulamamızda hem de kök uygulamamızda "_state" son ekiyle tanımlanacaktır.

2. Cihazın kullanıcı girişine tepki vermesini istiyoruz

Kodun sıralı olarak, yani her satırda bir satırda normal yürütülmesine rağmen, ana durum döngüsü cihazın herhangi bir anda ne yapması gerektiğini belirlerken cihazımızın düğmelere tepki vermesine ihtiyacımız var. Bu amaçla cihaz, donanımla etkileşime giren daha düşük seviyeli yazılıma sinyal göndererek olayı tetikleme yeteneğine sahiptir. Cihaza belirli bir olay türü algıladığında bir şeyler yapmasını söyleyen kod yazabiliriz.

3. 5 x 5 LED ekranı kullanarak animasyonları ve grafikleri görüntülemek istiyoruz

Bunu yapmak için mekanizma basit görünüyor, ancak bir görüntü gösteren blok, 400 ms'lik gizli bir gecikme ekliyor. Cihazımızın durum döngüsünü mümkün olduğunca az gecikmeyle yürütmeye devam etmesini istediğimizden, gecikmeyi en aza indirmek için javascript kodunu düzenlememiz gerekecek.

4. Cihaz açıldığında cihazın hafızasındaki veri değerlerini başlatmak istiyoruz

Cihazımız herhangi bir şey yapmadan önce uygulamanın verilerini belleğe yüklemesi gerekiyor. Bu, kod okunabilirliği için adlandırılan sabit değişkenleri, bir animasyonun parçası olabilecek görüntüleri içeren değişkenleri ve düzgün çalışması için 0'dan başlaması gereken sayaç değişkenlerini içerir. Uzun bir değişken isimleri listesi ve onların yeni atanan değerleri ile sonuçlanacağız. Kişisel bir stil seçimi olarak, ALL_CAPS kullanarak sabit değerleri, yani asla değiştirmem gerekmeyecek değerleri belirteceğim. Ayrıca ana değişken tanımlayıcılarına, tanımlayıcının altına düştüğü bir tür nesne veya türe atıfta bulunan bir kategori adı ekleyeceğim. Bu, kodun takip edilmesini kolaylaştırma girişimidir. Kodu deşifre etmeye çalışırken ortaya çıkan belirsizlik nedeniyle asla "item" veya "x" gibi bir değişken adı kullanmayacağım.

5. Cihazın radyosunu kullanarak verileri kablosuz olarak iletmek istiyoruz

Bu aslında MakeCode blok dilini kullanırken oldukça basit bir iştir. Sadece açılışta tüm cihazları aynı radyo grubuna ayarlıyoruz ve daha sonra sinyal göndermek istediğimizde bize verilen "Radyo gönderme numarası" bloğuna tek bir numara iletebiliyoruz. Gönderici ve alıcının aynı radyo grubu üzerinde çalışması önemlidir, aksi takdirde farklı frekanslarda gönderip alacakları için iletişim başarısız olacaktır.

6. Cihazın radyosu üzerinden veri dinlemek ve almak ve buna göre işlemek istiyoruz

Önceki madde ile aynı hususları göz önünde bulundurarak, gelen iletimleri, kullanıcı girdisini dinlediğimiz gibi dinleyeceğiz: bir olay işleyicisi ile. Gelen sinyalleri inceleyecek ve ana durum döngüsünü bozmadan herhangi bir işlem yapılıp yapılmayacağını kontrol edecek bir kod bloğu yazacağız.

Ek olarak, bir cihazın tüm ağı kontrol etmesine izin verecek bir program olan çok daha basit bir kök uygulamasının tasarımını kısaca ele almalıyız. Yukarıdaki tasarımdan çok daha basit olduğu ve çoğu sadece tekrar olduğu için buna fazla zaman harcamayacağım. Kök ilacının işlevselliğini üç kategoriye ayırdım.

  1. Bir sinyal seçebilmek istiyoruz
  2. Bir sinyal iletebilmek istiyoruz

--

1. Bir sinyal seçebilmek istiyoruz

Bu, olası sinyaller arasında yinelenen bir düğme kullanılarak yapılabilir. Sadece üç tane olduğundan, bu yaklaşım yeterli olacaktır. Aynı zamanda, seçilen sinyali sürekli olarak yeniden görüntüleyen, kullanıcının bir düğmeye basmasına ve seçilen sinyalin çok az gecikmeyle LED ekranda göründüğünü görmesine izin veren bir döngüye sahip olabiliriz.

2. Bir sinyal iletebilmek istiyoruz

İki buton olduğu için birini seçim, diğerini onay için atayabiliriz. Kullanıcı uygulaması gibi, sinyali ağ üzerinden bir sayı olarak gönderiyoruz. Gerekli başka bir bilgi yoktur.

Bir sonraki bölümde basit sinyal protokolü hakkında daha fazla konuşacağım.

Adım 2: Sinyal Protokolü: Ağ İletişimi için Basit Bir Dil

Aşağıdaki sinyaller, cihazların birbirleriyle konuşmak için kullanabilecekleri tüm olası kelimelerin kümesi olarak düşünülebilir. Ağ çok basit olduğu için söylenecek fazla bir şey yok ve bu yüzden bu üç sinyali basit tamsayı değerleri ile temsil edebiliriz.

0. Sıfırla

  • Koddaki tanımlayıcı: SIG-R
  • Tamsayı değeri: 0
  • Amaç: Menzil içindeki tüm cihazlara yaptıklarını bırakmalarını ve yeni başlatılmış gibi davranmalarını söyleyin. Bu sinyal ağdaki her cihaza ulaşırsa, tüm ağ sıfırlanacak ve kullanıcılar yeni bir oyuna başlayabilir. Bu sinyal yalnızca bir kök cihaz tarafından yayınlanabilir.

1. Dönüşüm A

  • Koddaki tanımlayıcı: SIG-A
  • Tamsayı değeri: 1
  • Amaç: LISTEN_A durumunda olan herhangi bir cihaza, dönüştürme sinyalini aldıklarında, TEAM_A durumuna geçmelerini söyleyin.

2. Dönüşüm B

  1. Koddaki tanımlayıcı: SIG-B
  2. Tam sayı değeri: 2
  3. Amaç: LISTEN_B durumundaki herhangi bir cihaza, dönüştürme sinyalini aldıklarında TEAM_B durumuna geçmelerini söyleyin.

Adım 3: Cihazın Eylemlerini Mevcut Durumuna Göre Kontrol Etmek İstiyoruz

Cihazın Eylemlerini Mevcut Durumuna Göre Kontrol Etmek İstiyoruz
Cihazın Eylemlerini Mevcut Durumuna Göre Kontrol Etmek İstiyoruz
Cihazın Eylemlerini Mevcut Durumuna Göre Kontrol Etmek İstiyoruz
Cihazın Eylemlerini Mevcut Durumuna Göre Kontrol Etmek İstiyoruz
Cihazın Eylemlerini Mevcut Durumuna Göre Kontrol Etmek İstiyoruz
Cihazın Eylemlerini Mevcut Durumuna Göre Kontrol Etmek İstiyoruz

Sonunda kod yazmaya başlayabiliriz.

İlk olarak Make Code'da yeni bir proje açın

  • Yeni bir işlev oluşturun. Bu uygulamanın çekirdek döngüsü olduğu için mayın döngüsünü çağırdım.
  • Süresiz olarak tekrarlanacak bir döngü bloğu ekleyin. while(true) kullandım çünkü değişmez bir true asla false olmayacak, bu nedenle uygulamanın kontrol akışı asla döngüden çıkmayacak
  • Aygıtın olası beş durumundan herhangi birinde olup olmadığını kontrol etmek için yeterli if-else bloğu ekleyin
  • Geçerli cihaz durumunu tutmak için bir değişken oluşturun
  • Beş olası durumun her birini temsil edecek değişkenler oluşturun

    Not: Bu değişkenlerin henüz atanmış değerleri olmaması normaldir. Buna ulaşacağız. Bu noktada temiz, okunması kolay kod yazmamız daha önemli

  • Mevcut durumu olası durumlardan biriyle karşılaştırmak için if-else bloklarındaki her koşulu değiştirin
  • If-else bloklarının altına, birkaç milisaniyelik bir duraklama ekleyin ve bu sayıyı tutacak bir değişken oluşturun. Daha sonra başlatacağız. Değişkenin kene veya kalp atışı gibi açıklayıcı bir adı olduğundan emin olun. Bu, cihazın çekirdek döngüsü olduğundan, bu duraklama, cihazın ana döngüyü yürütme hızını belirleyecektir, bu nedenle çok önemli bir değerdir ve adı olmayan sihirli bir sayı olamayacak kadar önemlidir.

Not: Üçüncü resimdeki gri bloklar için endişelenmeyin. Bunlara sonra geleceğim.

Adım 4: Kullanıcı Girişine Tepki Vermek İstiyoruz

Kullanıcı Girişine Tepki Vermek İstiyoruz
Kullanıcı Girişine Tepki Vermek İstiyoruz
Kullanıcı Girişine Tepki Vermek İstiyoruz
Kullanıcı Girişine Tepki Vermek İstiyoruz

Şimdi, cihaza düğmeye basmanın nasıl yapılacağını anlatmak istiyoruz. İlk düşünce, giriş kategorisindeki "Düğmeye basıldığında" bloklarını kullanmak olabilir, ancak bundan daha ayrıntılı kontrol istiyoruz. Bu eğitimde ilerlediğimiz için, gelişmiş bölümün altındaki kontrol kategorisindeki "(X) from (X) with value (Y)" bloğunu kullanacağız.

  • Dört adet "on event from…" bloğu oluşturun.

    • Bunlardan ikisi "MICROBIT_ID_BUTTON_A" olay kaynağını kontrol etmelidir
    • Bunlardan ikisi "MICROBIT_ID_BUTTON_B" olay kaynağını kontrol etmelidir.
    • Her düğmeyi hedefleyen iki olaydan:

      • "MICROBIT_BUTTON_EVT_UP" türünde bir olay kontrol edilmelidir.
      • "MICROBIT_BUTTON_EVT_DOWN" türünde bir olay kontrol edilmelidir.
    • Not: Tamamı büyük harflerle yazılan bu seçenekler, alt düzey mikro:bit kodunda kullanılan etiketlerdir. Bunlar, kod yürütülebilir bir ikili dosyaya derlendiğinde daha sonra tam sayılarla değiştirilen yer tutuculardır. Her ikisi de aynı şekilde çalışsa da, insanlar için bu etiketleri kullanmak, hangi tamsayıyı koyacaklarına bakmaktan daha kolaydır.
  • Stil meselesi olarak, her "on event from…" bloğunun, yükseltilmiş olayı tanımlayan bir işlevi çağırmasını seçtim. Kesinlikle gerekli olmasa da, bence bu okunabilirliği artırıyor. Bunu yapmak isterse, olay işleme kodunu "on event from…" bloğunun içine koyabilirler.

    Not: Cihazın bir olaya verdiği yanıtı işleyen kod bloğuna sezgisel olarak "olay işleyici" adı verilir

  • Her olay işleyicisine, ana durum döngüsündeki yapı ile aygıt durumuna göre kontrol akışını bölmek için kullanılan aynı if-else yapısını ekleyin.
  • Durum diyagramımız tarafından belirtildiği gibi cihazın bu durumunu değiştiren atama blokları ekleyin

    • Cihaz UNASSIGNED durumundayken, cihazın LISTEN_A durumuna geçişle basılan A düğmesine ve LISTEN_B durumuna geçişle basılan B düğmesine tepki vermesi gerektiğini biliyoruz.
    • Ayrıca, cihaz LISTEN_A veya LISTEN_B durumundayken, cihazın A butonunun serbest bırakılmasına ve B butonunun serbest bırakılmasına, UNASSIGNED durumuna geri dönerek tepki vermesi gerektiğini de biliyoruz.
    • Son olarak, cihaz TEAM_A veya TEAM_B durumundayken, cihazın A düğmesine basıldığında ve B düğmesine basıldığında sırasıyla SIG_A yayınlayarak ve SIG_B yayınlayarak tepki vermesi gerektiğini biliyoruz.

      Bu noktada yayın sinyallerinin ayrıntılarını doldurmak gerekli değildir. Buna daha sonra geleceğiz. Önemli olan o eylem bloğuna o noktada ne yapılması gerektiğini anlatan yayınSignalSIG_A gibi bir isim vererek yazacağımız kodu kullanmaları için bu fonksiyonlara talimat vermemizdir

Adım 5: Cihaz Açıldığında Cihaz Belleğindeki Veri Değerlerini Başlatmak İstiyoruz

Cihaz Açıldığında Cihaz Belleğindeki Veri Değerlerini Başlatmak İstiyoruz
Cihaz Açıldığında Cihaz Belleğindeki Veri Değerlerini Başlatmak İstiyoruz
Cihaz Açıldığında Cihaz Belleğindeki Veri Değerlerini Başlatmak İstiyoruz
Cihaz Açıldığında Cihaz Belleğindeki Veri Değerlerini Başlatmak İstiyoruz
Cihaz Açıldığında Cihaz Belleğindeki Veri Değerlerini Başlatmak İstiyoruz
Cihaz Açıldığında Cihaz Belleğindeki Veri Değerlerini Başlatmak İstiyoruz

Bu noktada çok sayıda değişken kullandık (veri için isimler), ama aslında bu isimlere değerler atamadık. Aygıtın önyükleme yaparken tüm bu değişkenlerin değerlerini belleğe yüklemesini istiyoruz, bu nedenle bu değişkenler için başlatmayı bir "başlangıç" bloğuna yerleştiriyoruz.

Başlatmamız gereken değerler şunlardır:

  • Sinyal protokolüne göre sinyal sabitleri. Değerler MUTLAKA:

    • SIG_R = 0
    • SIG_A = 1
    • SIG_B = 2
    • Not: Bu değişkenlerin Signals adlı numaralandırılmış bir türün parçasıymış gibi davranması gerektiğini belirtmek için bu sabitlerin önüne "EnumSignals" koydum. Bu değişkenler diğer programlama dillerinde bu şekilde uygulanabilir. Numaralandırılmış türlerin tanımı ve açıklaması öğreticimin kapsamı dışındadır. Arzu eden olursa Google'a yazabilir. Bu önekler sadece stilistik seçimlerdir ve programın düzgün çalışması için hiç de gerekli değildir.
  • Bir değeri olduğu sürece keyfi olabilen durum sabitleri. 0'dan artan tamsayıları kullanmak için bir stil seçimi yaptım, şöyle:

    • ATANMAMIŞ = 0
    • DİNLE_A = 1
    • DİNLE_B = 2
    • TAKIM_A = 3
    • TAKIM_B = 4
    • Not: Bu değişkenler için de öneklerle ilgili aynı stil kararını verdim. Ayrıca, bu atamalar, değerler ve sıra ile ilgili her şeyin tamamen keyfi olduğunu belirteceğim. Bu değerlerin cihazdan cihaza tutarlı olması önemli değildir, çünkü ağ üzerinden iletişim için değil, yalnızca dahili olarak kullanılırlar. Önemli olan tek şey, değişkenlerin bir değeri olması ve eşdeğer olup olmadıklarını görmek için birbirleriyle karşılaştırılabilmeleridir.
  • Okunabilirlik için BOOT_STATE adlı bir sabit ve onu UNASSIGNED olarak ayarlayın. Bu, cihaz daha sonra uygulayacağımız bir sıfırlama sinyali aldığında, daha keyfi bir durum yerine önyükleme durumuna sıfırlamamızı daha açık hale getirir.
  • Kullanıcı girişi yoluyla son derece düşük gecikme süreli kesintiye izin veren animasyonlar oluşturmak için aşağıdaki adımda kullanılan animasyon sabitleri. Bunları şimdiye kadar kullanmadık, ancak aşağıdaki bölümde kesinlikle açıklanacak ve kullanılacaktır. Bunlardan bazılarının anlamı, adlarından dolayı sezgisel olmalıdır.

    • TICKS_PER_FRAME_LOADING_ANIMATION = 50
    • MS_PER_DEVICE_TICK = 10
    • MS_PER_FRAME_BROADCAST_ANIMATION = 500
    • MICROSECONDS_PER_MILLISECOND = 1000
    • NUMBER_OF_FRAMES_IN_LOADING_ANIMATION = 4
  • Animasyon için başka bir değişken, bu sefer kesinlikle sabit olmayan bir sayaç. Çoğu sayaç gibi, onu 0 olarak başlatıyoruz

    iTickLoadingAnimasyon = 0

  • Animasyon karelerini tutmak için iki dizi değişken oluşturun. "Yükleme animasyonu" olarak adlandırdığım ilki, (son sabit başlatma ile tahmin etmiş olabileceğiniz) dört görüntüye sahip olmalı ve ikincisi, benim "yayın animasyonu" olarak adlandırdığım, üç görüntüye sahip olmalıdır. Değişkenleri animasyonun karelerine karşılık gelecek şekilde adlandırmanızı öneririm, ör. ringAnimation0, ringAnimation1…

    Benim yaptığımla aynı görüntü değerlerini oluşturun veya daha özgün ve daha havalı görüntüler oluşturun

  • Son olarak, "radyo seti grubu (X)" bloğunu kullanarak cihazın radyo grubunu 0'a ayarlamalıyız.
  • İsteğe bağlı olarak, kullanıcıya her şeyin yolunda gitmediğini söylemek için "Başlatma tamamlandı" mesajını seri çıktıya yazın.
  • Artık cihazı kurmayı bitirdiğimize göre durum döngüsü fonksiyonumuzu çağırabiliriz.

Adım 6: 5 X 5 LED Ekranı Kullanarak Animasyonları ve Grafikleri Görüntülemek İstiyoruz

5 X 5 LED Ekran Kullanarak Animasyonları ve Grafikleri Görüntülemek İstiyoruz
5 X 5 LED Ekran Kullanarak Animasyonları ve Grafikleri Görüntülemek İstiyoruz
5 X 5 LED Ekran Kullanarak Animasyonları ve Grafikleri Görüntülemek İstiyoruz
5 X 5 LED Ekran Kullanarak Animasyonları ve Grafikleri Görüntülemek İstiyoruz
5 X 5 LED Ekran Kullanarak Animasyonları ve Grafikleri Görüntülemek İstiyoruz
5 X 5 LED Ekran Kullanarak Animasyonları ve Grafikleri Görüntülemek İstiyoruz

Ve şimdi tamamen farklı bir şey.

Birkaç animasyon ve birkaç karakter görüntülemek istiyoruz, ancak ana durum döngüsünü kesmek istemiyoruz. Ne yazık ki, görüntüleri ve metin dizilerini görüntüleyen blokların varsayılan olarak 400 ms gecikmesi vardır. Kodun javascript gösterimini düzenlemeden bunu değiştirmenin bir yolu yoktur. Yani, yapacağımız şey bu.

  • Her görüntü için bir işlev oluşturun. Bu, her seferinde javascript'i düzenlemek yerine görüntüyü görüntülemek için tek bir blok kullanılmasına izin verecektir. Bu özel programda hiçbir resim birden fazla kullanılmaz, ancak yine de bu stilin kodun okunmasını kolaylaştırdığını düşünüyorum.
  • Her yeni işlevde, (X) yerine karşılık gelen görüntü değişkeni adıyla bir "resmi (X) ofset 0'da göster" bloğu ekleyin.
  • Ana durum döngüsünde ekleyin. "Dizeyi göster (X)" blokları, UNASSIGNED durumunu işleyen bloğun yanı sıra her bloğa. Cihazın farklı durumlarını belirtmek üzere görüntülemesi için bir karakter ekleyin. İşte yaptığım şey:

    • DİNLE_A: 'bir'
    • DİNLE_B: 'b'
    • TEAM_A: 'A'
    • TAKIM_B: 'B'

      UNASSIGNED durumu için, yükleme animasyonunu güncelleyecek bir işleve çağrı yapın. Aşağıda bu fonksiyonun ayrıntılarını dolduracağız

  • Javascript moduna geçin.
  • X.showImage(0) ve basic.showString(X)'e yapılan her çağrıyı bulun
  • Her birini X.showImage(0, 0) veya basic.showString(X, 0) olarak değiştirin

    • Bu ekstra argümanın eklenmesi, eylemden sonraki gecikmeyi 0'a ayarlayacaktır. Varsayılan olarak, bu dışarıda bırakılır ve cihaz, bu blokların her birinin yürütülmesinden sonra 400 ms duraklar.
    • Şimdi, artık oluşturabileceğimiz animasyon bloklarımızda resimlerimizi görüntülemek için neredeyse gecikmesiz bir mekanizmaya sahibiz.

İlk olarak, nispeten basit yayın animasyonu işlevini oluşturacağız. Daha basit çünkü kullanıcının yayın işlevini spam göndermesini engellemek için işlev tamamlanana kadar herhangi bir şey yapmasını istemiyoruz. Bunu başarmak için, standart davranış olan işlev tamamlanana kadar kontrol akışını blokla sınırlı tutabiliriz.

  • Yayın animasyonunu görüntüleyecek bir işlev oluşturun.
  • Bu bloğun içine, animasyonun her karesine bir tane olmak üzere, görüntülenmeleri gereken sırayla üç işlev çağrısı ekleyin.
  • Bir görüntü görüntüleme işlevine yapılan her çağrıdan sonra bir "bekle (bize) (X)" bloğu ekleyin.

    Not: Gelişmiş kontrol bölümünden gelen bu blok, belirtilen süre geçene kadar işlemciyi tamamen donduracağı için "duraklat (ms)" den daha ileri gidecektir. Duraklatma bloğu kullanıldığında, cihazın perde arkasında başka görevleri yerine getirmesi mümkündür. Bekleme bloğu ile bu imkansızdır

  • (X)'i (MS_PER_FRAME_BROADCAST_ANIMATION x MICROSECONDS_PER_MILLISECOND) ile değiştirin
  • Animasyon artık düzgün çalışmalıdır

İkinci olarak, yükleme animasyonunu görüntülemek için mekanizma oluşturacağız. Bunun arkasındaki fikir, LED ekranı MS_PER_DEVICE_TICK değişkeninde tanımladığımız belirli bir aralıkta güncellemektir. Bu değer, aygıt onay uzunluğu, aygıtın durum döngüsünün her yinelemesini tamamladıktan sonra duraklattığı milisaniye sayısıdır. Bu değer yeterince küçük olduğundan, görüntüleme döngüsünün her yinelemesi sırasında ekranı bir kez güncelleyebiliriz ve kullanıcıya animasyonun sorunsuz bir şekilde ilerlediği ve durum değiştiğinde kullanıcının girdisi arasında çok az gecikme olacağı görülecektir. ekran güncelleniyor. iTickLoadingAnimation değişkeni ile yaptığımız tik sayarak, animasyonun uygun karesini görüntüleyebiliriz.

  • Yükleme animasyonunu güncelleyecek bir işlev oluşturun
  • Onay sayacının maksimum değerine ulaşıp ulaşmadığını kontrol etmek için bir koşul ekleyin. Bu koşul, onay sayacının değeri, yükleme animasyonundaki kare sayısı ile her kareyi görüntülemek için işaret sayısı çarpımından büyükse doğru olacaktır.

    Koşul doğruysa, iTickLoadingAnimation'ı 0'a sıfırlayın

  • if-else koşullarının bir bloğunu ekleyin. Bunlar, animasyonun hangi karesinin görüntüleneceğini belirler.

    Animasyonun her karesi için, tik sayacı, her animasyondaki tik sayısı ile animasyonun kare sayısı (1'den başlayarak) çarpımından daha azsa, o kareyi görüntüleyin, aksi takdirde sonraki karenin bir sonraki kare olup olmadığını kontrol edin. görüntülenmek

  • Bloğun altında, iTickLoadingAnimation'ı artırın
  • Animasyon artık düzgün çalışmalıdır

Not: Örneğimde görünen tüm gri bloklar, bir bloğun javascript gösterimini düzenlediğinde oluşturulur. Basitçe, bloğun, standart blok kümesi kullanılarak temsil edilemeyen ve metin biçiminde düzenlenmesi gereken javascript kodunu temsil ettiği anlamına gelir.

7. Adım: Cihazın Telsizini Kullanarak Verileri Kablosuz Olarak İletmek İstiyoruz

Cihazın Telsizini Kullanarak Kablosuz Veri İletmek İstiyoruz
Cihazın Telsizini Kullanarak Kablosuz Veri İletmek İstiyoruz

Bu adım öncekinden çok daha kısadır. Aslında, muhtemelen tüm bu eğitimdeki en kısa adımdır.

Cihazın kullanıcı girişine tepkisini programladığımızda, ekran görüntüsünde o bölümde açıklanmayan iki blok olduğunu hatırlayın. Bunlar, radyo üzerinden sinyal gönderen işlevlere yapılan çağrılardı. Daha spesifik olarak:

  • A düğmesine basıldığında:

    • Cihaz TEAM_A durumundaysa:

      Yayın sinyali SIG_A

  • B düğmesine basıldığında:

    • Cihaz TEAM_B durumundaysa

      Yayın sinyali SIG_B

Zaten yoksa bu işlevleri oluşturun.

Her fonksiyonda:

  • Yayın animasyonu işlevini çağırın. Bu, MS_PER_FRAME_BROADCAST_ANIMATION * 3 = 1.5 saniye içinde olacak olan, tamamlanana kadar başka herhangi bir şeyin olmasını engelleyecektir. Animasyonda üç kare olduğu için sabit üçle çarpılır. Bu isteğe bağlıdır ve estetik yükseltme yeterince büyükse daha fazlası eklenebilir. Bu animasyonun ikinci amacı, bir kullanıcının yayın işlevine spam göndermesini önlemektir.
  • İşlev adında belirtilen sinyal sabitinin olduğu bir "radyo gönderme numarası (X)" bloğu ekleyin

Radyo üzerinden yayın yapmak için gereken tek şey bu.

Adım 8: Cihazın Telsizi Üzerinden Veri Dinlemek ve Almak ve Ona Göre İşlemek İstiyoruz

Cihazın Telsizi Üzerinden Veri Dinlemek, Almak ve Ona Göre İşlemek İstiyoruz
Cihazın Telsizi Üzerinden Veri Dinlemek, Almak ve Ona Göre İşlemek İstiyoruz
Cihazın Telsizi Üzerinden Veri Dinleyip Almak ve Ona Göre İşlemek İstiyoruz
Cihazın Telsizi Üzerinden Veri Dinleyip Almak ve Ona Göre İşlemek İstiyoruz

Bu, ana uygulamayı oluşturmak için son adımdır.

Cihaza gelen radyo sinyallerini nasıl işleyeceğini anlatacağız. Öncelikle cihazımız alınan sinyale isim verecek. Ardından, bu sinyalin değerine göre, varsa hangi işlemin yapılacağına karar verecektir.

Öncelikle:

  1. "Radyoda alınan (X)" bloğuyla başlayan bir kod bloğu oluşturun.
  2. İsteğe bağlı olarak, alınan değeri daha açıklayıcı bir adla başka bir değişkene atayın.
  3. Sinyali işleyecek bir işlevi çağırın

İkincisi, sinyal işleme fonksiyonunda:

  1. Sinyalin değerine dayalı olarak akışı kontrol eden bir if-else ifadeleri bloğu oluşturun.
  2. Sinyal SIG_R ise

    Cihazın durumunu BOOT_STATE olarak ayarlayın (bu yüzden bu sabiti daha önce oluşturduk)

  3. Sinyal SIG_A ise ve mevcut durum LISTEN_A ise

    Cihazın durumunu TEAM_A olarak ayarlayın

  4. Sinyal SIG_B ise ve mevcut durum LISTEN_B ise

    Cihazın durumunu TEAM_B olarak ayarlayın

Bu kadar. Uygulama tamamlandı.

Adım 9: Kök Aygıt: Bir Sinyal Seçebilmek İstiyoruz

Kök Aygıt: Bir Sinyal Seçebilmek İstiyoruz
Kök Aygıt: Bir Sinyal Seçebilmek İstiyoruz

Şimdi bir "root" cihazı yani ağı kontrol edecek bir cihaz için basit bir uygulama yazacağız.

Bu cihazın iki işlevi yerine getirmesi gerekecek:

  • Kullanıcının sinyallerimizden birini seçmesine izin vermek istiyoruz
  • Kullanıcının sinyali yayınlamasına izin vermek istiyoruz

Bu uygulamanın özellikleri öncekinin bir alt kümesi olduğundan, bir genel bakış sunacağım ancak daha önce sahip olduğum kadar ayrıntıya girmeyeceğim. Yukarıdaki resim, bu uygulama için tam kodu içerir.

Kullanıcının bir sinyal seçmesine izin vermek için:

  1. Bir "başlangıçta" bloğunda 5 değişkeni başlatın:

    1. Üç sinyal (0, 1, 2)
    2. Sinyal sayısı (3)
    3. Halihazırda seçili sinyali tutmak için bir değişken (başlangıçta ilk sinyale ayarlanır, 0)
  2. A düğmesine bir kez basın:

    1. Seçilen sinyali artır
    2. Seçilen sinyalin sinyal sayısından büyük veya ona eşit olup olmadığını kontrol edin

      Eğer öyleyse, seçilen sinyali 0'a ayarlayın

  3. Başlatma bloğundan sonra, geçerli seçili sinyal değerini gecikme olmadan görüntüleyen bir "sonsuza kadar" döngü çalıştırın

Kullanıcının bir sinyal yayınlamasına izin vermek için

  1. "Başlangıçta" bloğunda radyo grubunu 0'a ayarlayın
  2. B düğmesine bir kez basın:

    Bir "radyo gönderme numarası (X)" bloğu kullanarak seçilen sinyali yayınlayın

Bu kadar. Kök düğüm uygulaması son derece basittir.

Adım 10: Bitirdik

Biz bitirdik
Biz bitirdik

Yukarıda uygulamayı çalıştıran cihazların bir resmi bulunmaktadır. Sağdaki ikisi ana "kullanıcı" uygulamasını çalıştırıyor ve soldaki "root" uygulamasını çalıştırıyor.

Bu oyunu ortaokul ve lise öğretmenleri için bilgisayar bilimleri eğitimi hakkında bir haftalık bir yaz konferansı olan CS Connections 2018'de gösterdim. Öğretmenlere 40 kadar cihaz dağıttım ve kurallarını anlattım. Çoğu, oyunu eğlenceli buldu ve birçoğu, nasıl oynanacağını anlayana kadar kafa karıştırıcı buldu. Gösteri kısaydı, ancak oyunu oldukça çeşitli bir kalabalık arasında eğlenceli bulduk.

CS Connections 2018 hakkında daha fazla bilgiyi burada bulabilirsiniz.

Önerilen: