Mündəricat:

Şəbəkə Rəqabəti: BBC Micro üçün Aşağı Gecikmə Oyunu: bit: 10 addım (şəkillərlə)
Şəbəkə Rəqabəti: BBC Micro üçün Aşağı Gecikmə Oyunu: bit: 10 addım (şəkillərlə)

Video: Şəbəkə Rəqabəti: BBC Micro üçün Aşağı Gecikmə Oyunu: bit: 10 addım (şəkillərlə)

Video: Şəbəkə Rəqabəti: BBC Micro üçün Aşağı Gecikmə Oyunu: bit: 10 addım (şəkillərlə)
Video: Alltag und Beruf - B2 - Deutsch lernen mit Dialogen 2024, Noyabr
Anonim
Şəbəkə Rəqabəti: BBC Micro üçün Aşağı Gecikmə Oyunu: bit
Şəbəkə Rəqabəti: BBC Micro üçün Aşağı Gecikmə Oyunu: bit
Şəbəkə Rəqabəti: BBC Micro üçün Aşağı Gecikmə Oyunu: bit
Şəbəkə Rəqabəti: BBC Micro üçün Aşağı Gecikmə Oyunu: bit

Bu təlimatda, BBC micro: bit -də aşağıdakı xüsusiyyətlərə malik əsas multiplayer oyunun necə tətbiq olunacağını izah edəcəyəm:

  • Sadə bir interfeys
  • Düyməni basmaqla ekran yeniləmələri arasında gecikmə
  • İştirakçıların çevik sayı
  • Uzaqdan idarə olunan ("kök") cihazdan istifadə edərək oyunu asan idarə etmək

Oyun mahiyyət etibarilə siyasətin simulyasiyasıdır. İki oyunçu istisna olmaqla, bütün oyunçular heç bir komandaya təyin edilmədən başlayırlar. Bu oyunçulardan biri A komandasına, digəri isə B komandasına təyin olunur.

Oyunun məqsədi, hər bir oyunçunun hər kəsin çevrildiyi anda oyunçuların əksəriyyəti ilə komandada olmasıdır.

Yuxarıdakı diaqram, sonlu bir vəziyyət maşınını, yəni cihazın ola biləcəyi vəziyyətləri və bu vəziyyətlər arasındakı keçidləri göstərir.

Bir vəziyyət, cihazın açıldığından bəri yaddaşını təsvir edən mövcud məlumat dəsti kimi düşünülə bilər. Bu məlumatlara əsasən, cihaz müəyyən hərəkətlər edə bilər və ya istifadəçi girişinə fərqli reaksiya verə bilər.

Bir keçid, doğru olduqda cihazın vəziyyətini dəyişməsinə səbəb olan məntiqi bir şərtdir. Keçid bir əyalətdən digər dövlətə keçə bilər. Bir dövlətdə birdən çox keçid ola bilər.

Yuxarıdakı diaqramda aşağıdakı hallar göstərilir:

  • Təyin edilməyib
  • A -ya qulaq asın
  • B -yə qulaq asın
  • Komanda A.
  • B qrupu

Oyun kodunu işlədən bir cihaz bu beş dövlətdən birində ola bilər, ancaq bir anda və yalnız bu beşdə.

Bələdçi boyunca, Microsoft -un MakeCode redaktorundan istifadə etdiyinizi güman edəcəyəm:

Oyunun tam tətbiqini burada tapa bilərsiniz:

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

Və master ("kök") şəbəkə nəzarətçisinin tətbiqini burada tapa bilərsiniz:

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

Dərsliyim boyunca bu nümunələrə müraciət edəcəyəm.

Addım 1: Böyük Şəkil Dizaynı

Hər hansı bir kod yazmadan əvvəl, son məhsulumuzun necə görünməsini istədiyimizi düşünməliyik. başqa sözlə, tətbiqin tələbləri nələrdir? Kodumuz cihaz bitdikdə nə etməli olduğunu söyləməlidir? Əsas tətbiqin funksionallığını hər birinə fərqli bir dizayn baxımından baxıla bilən altı kateqoriyaya bölmüşəm.

  1. Cihazın mövcud vəziyyətinə əsaslanaraq hərəkətlərinə nəzarət etmək istəyirik
  2. Cihazın istifadəçi girişinə reaksiya verməsini istəyirik
  3. 5 x 5 LED displeydən istifadə edərək animasiyalar və qrafiklər göstərmək istəyə bilərik
  4. Cihaz açıldıqda cihazların yaddaşında olan məlumat dəyərlərini işə salmaq istəyirik
  5. Cihazın radiosundan istifadə edərək məlumatları simsiz ötürmək istəyirik
  6. Cihazın radiosu üzərindən məlumatları dinləmək və almaq və buna uyğun olaraq işləmək istəyirik

Hər biri haqqında bir az daha ətraflı məlumat verməyimə icazə verin.

1. Cihazın cari vəziyyətinə əsaslanaraq hərəkətlərinə nəzarət etmək istəyirik

Əksər proqramlar kimi, kod tərəfindən göstərilən təlimatların icrası bir anda bir sətirdə olur. Cihazımızın daxili vəziyyətinə əsaslanaraq bu təlimatın başındakı diaqramda göstərildiyi kimi müəyyən təlimatları yerinə yetirməsini istəyirik. Cihazın etməli olduğunu yoxlayan hər bir kod blokundan sonra bir sıra şərtlər yaza bilərik, amma bu yanaşma çox tez qarışa bilər, buna görə də sadəcə bir dəyişəni yoxlayan və bu dəyişənə əsaslanan sonsuz bir döngə istifadə edəcəyik., müəyyən bir təlimat toplusunu yerinə yetirir və ya heç nə etmir. Bu dəyişən həm istifadəçi tətbiqimizdə, həm də kök tətbiqimizdə "_state" şəkilçisi ilə tanınacaq.

2. Cihazın istifadəçi girişinə reaksiya verməsini istəyirik

Kodun ardıcıl olaraq, yəni hər bir sətirdə normal yerinə yetirilməsinə baxmayaraq, cihazımızın düymə basmalarına reaksiya verməsinə ehtiyac duyuruq, əsas vəziyyət döngəsi cihazın hər an nə etməli olduğunu müəyyənləşdirir. Bu məqsədlə cihaz, cihazla qarşılıqlı əlaqədə olan aşağı səviyyəli proqrama siqnal göndərmə qabiliyyətinə malikdir və hadisə adlanan şeyi tetikler. Xüsusi bir hadisə növü algıladığında cihaza bir şey etməsini söyləyən kod yaza bilərik.

3. 5 x 5 LED displeydən istifadə edərək animasiyalar və qrafiklər göstərmək istəyirik

Bunu etmək mexanizmi sadə görünür, ancaq bir şəkil bloku 400 ms gizli bir gecikmə əlavə edir. Cihazımızın vəziyyət halını mümkün qədər az gecikmə ilə davam etdirməsini istədiyimiz üçün gecikməni minimuma endirmək üçün javascript kodunu düzəltməliyik.

4. Cihaz açıldıqda cihazların yaddaşında olan məlumat dəyərlərini işə salmaq istəyirik

Cihazımız bir şey etməzdən əvvəl tətbiqin məlumatlarını yaddaşa yükləməsi lazımdır. Bura kodun oxunaqlılığı üçün adlandırılan sabit dəyişənlər, animasiyanın bir hissəsi ola biləcək şəkilləri olan dəyişənlər və düzgün işləməsi üçün 0 -dan başlamalı olan sayğac dəyişənləri daxildir. Dəyişən adların və yeni təyin olunan dəyərlərin uzun bir siyahısı ilə sona çatacağıq. Şəxsi bir üslub seçimi olaraq, ALL_CAPS istifadə edərək daimi dəyərləri, yəni heç vaxt dəyişməyəcəyim dəyərləri ifadə edəcəyəm. Ayrıca, əsas dəyişən identifikatorların, identifikatorun düşdüyü bir növ obyektə və ya növə aid bir kateqoriya adı ilə prefiks edəcəyəm. Bu, kodun izlənilməsini asanlaşdırmaq üçün edilir. Kodu deşifr etməyə çalışarkən ortaya çıxan qeyri -müəyyənlik səbəbiylə "maddə" və ya "x" kimi dəyişən bir ad istifadə etməyəcəyəm.

5. Cihazın radiosundan istifadə edərək məlumatları simsiz ötürmək istəyirik

MakeCode bloklar dilindən istifadə edərkən bu əslində olduqca sadə bir işdir. Sadəcə bütün cihazları yükləmə vaxtında eyni radio qrupuna qoyduq və sonra bir siqnal göndərmək istədikdə bizə verilən "Radio göndərmə nömrəsi" blokuna bir nömrəni ötürə bilərik. Göndərənin və alıcının eyni radio qrupunda işləməsi vacibdir, çünki bu edilməsə, fərqli tezliklərdə göndərəcək və ya alacaq və ünsiyyət uğursuz olacaq.

6. Cihazın radiosu üzərindən məlumatları dinləmək və almaq və buna uyğun olaraq işləmək istəyirik

Əvvəlki maddə ilə eyni mülahizələri nəzərə alaraq, daxil olan ötürmələri istifadəçi girişini dinlədiyimiz kimi dinləyəcəyik: bir hadisə işləyicisi ilə. Daxil olan siqnalları yoxlayacaq və əsas vəziyyət halqasını pozmadan hər hansı bir tədbir görüləcəyini yoxlayacaq bir kod bloku yazacağıq.

Bundan əlavə, bir cihazın bütün şəbəkəni idarə etməsinə imkan verəcək bir proqram olan daha sadə kök tətbiqinin dizaynını qısaca nəzərdən keçirməliyik. Bunun üçün çox vaxt sərf etməyəcəyəm, çünki yuxarıdakı dizayndan çox sadədir və çoxu sadəcə təkrarlanır. Kök zərfinin funksionallığını üç kateqoriyaya bölmüşəm.

  1. Bir siqnal seçə bilmək istəyirik
  2. Siqnal ötürmək istəyirik

-

1. Bir siqnal seçə bilmək istəyirik

Bu, sadəcə mümkün olan siqnalları təkrarlayan bir düyməyə sahib olmaqla edilə bilər. Yalnız üçü olduğu üçün bu yanaşma kifayət edər. Eyni zamanda, istifadəçiyə bir düyməni basmağa və seçilmiş siqnalın LED ekranda çox az gecikmə ilə görünməsinə imkan verən, seçilmiş siqnalı daim yenidən göstərən bir döngə ola bilər.

2. Bir siqnal ötürə bilmək istəyirik

İki düymə olduğu üçün birini seçim üçün, digərini təsdiq üçün təyin edə bilərik. İstifadəçi tətbiqi kimi, siqnalı şəbəkə üzərindən bir nömrə olaraq göndəririk. Başqa heç bir məlumat tələb olunmur.

Növbəti hissədə sadə siqnal protokolu haqqında daha çox danışacağam.

Addım 2: Siqnal Protokolu: Şəbəkə Rabitəsi üçün Sadə Dil

Aşağıdakı siqnallar, cihazların bir -biri ilə danışmaq üçün istifadə edə biləcəyi bütün mümkün sözlərin məcmusu kimi düşünülə bilər. Şəbəkə çox sadə olduğu üçün söyləyəcək çox şey yoxdur və buna görə də bu üç siqnalı sadə tam ədədlərlə təmsil edə bilərik.

0. Sıfırla

  • Koddakı identifikator: SIG-R
  • Tam ədəd: 0
  • Məqsəd: Mənzildə olan bütün cihazlara nə etdiklərini atmalarını və yeni açılmış kimi davranmalarını söyləyin. Bu siqnal şəbəkədəki hər bir cihaza çatarsa, bütün şəbəkə sıfırlanacaq və istifadəçilər yeni bir oyuna başlaya bilərlər. Bu siqnal yalnız kök cihaz tərəfindən yayımlana bilər.

1. Çevrilmə A

  • Koddakı identifikator: SIG-A
  • Tam ədəd: 1
  • Məqsəd: LISTEN_A vəziyyətində olan hər hansı bir cihaza, dönüşüm siqnalı aldıqdan sonra TEAM_A vəziyyətinə keçməsini söyləyin.

2. Dönüşüm B

  1. Koddakı identifikator: SIG-B
  2. Tam ədəd: 2
  3. Məqsəd: LISTEN_B vəziyyətində olan hər hansı bir cihaza dönüşüm siqnalı aldıqdan sonra TEAM_B vəziyyətinə keçməsini söyləyin.

Addım 3: Cihazın Mövcud vəziyyətinə əsaslanaraq hərəkətlərinə nəzarət etmək istəyirik

Cihazın Mövcud vəziyyətinə əsaslanaraq hərəkətlərinə nəzarət etmək istəyirik
Cihazın Mövcud vəziyyətinə əsaslanaraq hərəkətlərinə nəzarət etmək istəyirik
Cihazın Mövcud vəziyyətinə əsaslanaraq hərəkətlərinə nəzarət etmək istəyirik
Cihazın Mövcud vəziyyətinə əsaslanaraq hərəkətlərinə nəzarət etmək istəyirik
Cihazın Mövcud vəziyyətinə əsaslanaraq hərəkətlərinə nəzarət etmək istəyirik
Cihazın Mövcud vəziyyətinə əsaslanaraq hərəkətlərinə nəzarət etmək istəyirik

Nəhayət, kod yazmağa başlaya bilərik.

Birincisi, Kod yaratda yeni bir layihə açın

  • Yeni bir funksiya yaradın. Minanın döngəsini çağırdım, çünki bu tətbiqin əsas döngəsidir
  • Əbədi təkrarlanacaq bir döngə bloku əlavə edin. While (true) istifadə etdim, çünki hərfi doğru heç vaxt yalan olmayacaq, buna görə də tətbiqin idarəetmə axını heç vaxt döngədən çıxmayacaq.
  • Cihazın beş mümkün vəziyyətdən birində olub olmadığını yoxlamaq üçün kifayət qədər if-else blokları əlavə edin
  • Mövcud cihaz vəziyyətini saxlamaq üçün bir dəyişən yaradın
  • Beş mümkün vəziyyətin hər birini təmsil etmək üçün dəyişənlər yaradın

    Qeyd: Bu dəyişənlərin hələ təyin olunmuş dəyərlərə sahib olmaması yaxşıdır. Buna çatacağıq. Bu nöqtədə təmiz, oxunması asan bir kod yazmağımız daha vacibdir

  • Mövcud vəziyyəti mümkün vəziyyətlərdən biri ilə müqayisə etmək üçün if-else bloklarındakı hər bir şərti dəyişdirin
  • If-else bloklarının altındakı bir neçə milisaniyəyə fasilə verin və bu nömrəni saxlamaq üçün bir dəyişən yaradın. Daha sonra işə salacağıq. Dəyişənin gənə və ya ürək döyüntüsü kimi təsviri bir ada sahib olduğundan əmin olun. Bu cihazın əsas döngəsi olduğu üçün bu fasilə cihazın əsas döngəni icra sürətini təyin edəcək, buna görə də çox vacib bir dəyərdir və adı olmayan sehrli bir rəqəm olmaq üçün çox vacibdir.

Qeyd: Üçüncü şəkildəki boz bloklardan narahat olmayın. Onlara sonra çatacam.

Addım 4: İstifadəçi Girişinə Reaksiya İstəyirik

İstifadəçi Girişinə Reaksiya İstəyirik
İstifadəçi Girişinə Reaksiya İstəyirik
İstifadəçi Girişinə Reaksiya İstəyirik
İstifadəçi Girişinə Reaksiya İstəyirik

İndi cihaza düymə basmağı necə idarə edəcəyini söyləmək istəyirik. Bir insanın ilk düşüncəsi, giriş kateqoriyasındakı "Düymə basıldığında" bloklarını istifadə etmək ola bilər, amma bundan daha çox detallı bir nəzarət istərdik. Ətraflı bölmənin altındakı nəzarət kateqoriyasındakı "(X) ilə (Y) dəyərli hadisə" blokunu istifadə edəcəyik, çünki bu dərsdə qabaqcılıq.

  • Dörd "hadisə ilə əlaqədar …" blokları yaradın.

    • Bunlardan ikisi "MICROBIT_ID_BUTTON_A" hadisə mənbəyini yoxlamalıdır
    • Bunlardan ikisi "MICROBIT_ID_BUTTON_B" hadisə mənbəyini yoxlamalıdır
    • Hər düyməni hədəf alan iki hadisədən:

      • "MICROBIT_BUTTON_EVT_UP" tipli bir hadisəni yoxlamaq lazımdır
      • "MICROBIT_BUTTON_EVT_DOWN" tipli hadisəni yoxlamaq lazımdır
    • Qeyd: Bütün böyük hərflərdəki bu seçimlər, aşağı səviyyəli mikro: bit kodunda istifadə olunan etiketlərdir. Kod, yerinə yetirilə bilən ikiliyə tərtib edildikdə sonradan tam ədədlərlə əvəz olunan yer tutuculardır. İnsanların bu etiketləri istifadə etməsi, hansı tam ədəd qoyulacağını axtarmaqdan daha asandır, hər ikisi də eyni şəkildə işləyərdi.
  • Üslub olaraq hər bir "hadisədən…" blokunun qaldırılan hadisəni təsvir edən bir funksiyaya sahib olmasını seçdim. Qəti şəkildə lazım olmasa da, məncə bu oxunuşu yaxşılaşdırır. Biri bunu etmək istəsə, hadisə idarə kodunu "on on event from …" bloğunun içinə qoya bilər.

    Qeyd: Cihazın bir hadisəyə cavabını işlədən kod bloku intuitiv olaraq "hadisə idarəçisi" adlanır

  • Hər bir hadisə işləyicisinə, əsas dövlət döngəsindəki quruluş kimi cihaz vəziyyətinə görə idarəetmə axını bölmək üçün istifadə olunan eyni if-else quruluşunu əlavə edin.
  • Vəziyyət diaqramımızda göstərildiyi kimi cihazın vəziyyətini dəyişdirən tapşırıq blokları əlavə edin

    • Bilirik ki, cihaz TƏSVİRSİZ vəziyyətdə olduqda, cihaz LISTEN_A vəziyyətinə keçərkən A düyməsinə və LISTEN_B vəziyyətinə keçərkən B düyməsinə basmalıdır.
    • Həm də bilirik ki, cihaz LISTEN_A və ya LISTEN_B vəziyyətində olduqda, cihaz AÇIQSIZ vəziyyətə keçərək A seriyasındakı A düyməsinə və B düyməsinə buraxılmasına reaksiya verməlidir.
    • Nəhayət, cihaz TEAM_A və ya TEAM_B vəziyyətində olduqda, cihazın SIG_A yayımına və SIG_B yayımına görə basılmış A düyməsinə və B düyməsinə reaksiya verməsi lazım olduğunu bilirik.

      Bu anda yayım siqnallarının detallarını doldurmaq lazım deyil. Buna daha sonra çatacağıq. Vacib olan odur ki, bu funksiyalara həmin bloklar blokuna o anda nə edilməli olduğunu izah edən bir ad verərək yazacağımız kodu istifadə etməyi tapşıraq

Addım 5: Cihaz Yüklənəndə Cihaz Yaddaşında Məlumat Dəyərlərini Başlatmaq İstəyirik

Cihaz Yüklənəndə Cihaz Yaddaşında Məlumat Dəyərlərini Başlatmaq İstəyirik
Cihaz Yüklənəndə Cihaz Yaddaşında Məlumat Dəyərlərini Başlatmaq İstəyirik
Cihaz Yüklənəndə Cihaz Yaddaşında Məlumat Dəyərlərini Başlatmaq İstəyirik
Cihaz Yüklənəndə Cihaz Yaddaşında Məlumat Dəyərlərini Başlatmaq İstəyirik
Cihaz Yüklənəndə Cihaz Yaddaşında Məlumat Dəyərlərini Başlatmaq İstəyirik
Cihaz Yüklənəndə Cihaz Yaddaşında Məlumat Dəyərlərini Başlatmaq İstəyirik

Bu nöqtədə bir çox dəyişəndən istifadə etdik (məlumatların adları), amma əslində bu adlara dəyər verməmişik. Cihazın açılan zaman bütün bu dəyişənlərin dəyərlərini yaddaşa yükləməsini istəyirik, buna görə də bu dəyişənlərin başlanğıcını "start" blokunda yerləşdiririk.

Başlatmalı olduğumuz dəyərlər bunlardır:

  • Siqnal protokoluna görə siqnal sabitləri. Dəyərlər olmalıdır:

    • SIG_R = 0
    • SIG_A = 1
    • SIG_B = 2
    • Qeyd: Bu dəyişənlərin "Siqnallar" adlanan sadalanan bir növün bir hissəsi kimi davranmalı olduqlarını ifadə etmək üçün bu sabitləri "EnumSignals" ilə əlavə etdim. Bu dəyişənlər digər proqramlaşdırma dillərində belə tətbiq oluna bilər. Nümunə verilən növlərin tərifi və izahı mənim tutorialımın əhatə dairəsindən kənardır. İstəsələr Google bunu edə bilər. Bu prefikslər sadəcə stilistik seçimlərdir və proqramın düzgün işləməsi üçün heç də vacib deyildir.
  • Vəziyyət sabitləri, bir dəyəri olduğu müddətcə ixtiyari ola bilər. 0 -dan artan tam ədədləri istifadə etmək üçün bir üslub seçimi etdim:

    • İDARƏ EDİLMƏDİ = 0
    • LISTEN_A = 1
    • LISTEN_B = 2
    • TEAM_A = 3
    • TEAM_B = 4
    • Qeyd: Bu dəyişənlərin prefiksləri ilə bağlı eyni üslubda qərar verdim. Əlavə olaraq qeyd edim ki, bu tapşırıqlar, dəyərlər və nizamla bağlı hər şey tamamilə özbaşınadır. Bu dəyərlərin cihazdan cihaza uyğun gəlməsinin heç bir əhəmiyyəti yoxdur, çünki onlar yalnız daxili istifadə olunur və şəbəkə üzərindən ünsiyyət üçün istifadə edilmir. Önəmli olan dəyişənlərin bir dəyərə sahib olması və bunların bərabər olub olmadığını görmək üçün bir -biri ilə müqayisə oluna bilməsidir.
  • Oxunaqlı olmaq üçün BOOT_STATE adlanan sabit və UNASSIGNED olaraq təyin edin. Bu, cihazın daha sonra tətbiq edəcəyimiz bir sıfırlama siqnalı aldıqda, daha ixtiyari bir vəziyyət əvəzinə, önyükleme vəziyyətinə qayıtmağımızı daha açıq edir.
  • İstifadəçi girişi vasitəsi ilə son dərəcə aşağı gecikməyə səbəb olan animasiyalar yaratmaq üçün aşağıdakı addımda istifadə olunan animasiya sabitləri. Bunları indiyə qədər istifadə etməmişik, ancaq bunlar mütləq aşağıdakı hissədə izah ediləcək və istifadə ediləcəkdir. Bunlardan bəzilərinin mənaları adlarına görə intuitiv 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
  • Animasiya üçün başqa bir dəyişən, bu dəfə mütləq sabit olmayan bir sayğac. Əksər sayğaclar kimi, sıfıra sıfırlayırıq

    iTickLoadingAnimation = 0

  • Animasiya çərçivələrini saxlamaq üçün iki sıra dəyişən yaradın. "Yükləmə animasiyası" adlandırdığım birincidə dörd şəkil (son sabit başlatma ilə təxmin etdiyiniz ola bilər), ikincisində isə "yayım animasiyası" dediyim üç şəkil olmalıdır. Dəyişənləri animasiya çərçivələrinə uyğun adlandırmağı məsləhət görürəm, məsələn. ringAnimation0, ringAnimation1…

    Mənim etdiyim şəkil dəyərlərini yaradın və ya daha orijinal və sərin şəkillər yaradın

  • Son olaraq, "radio dəstəsi qrupu (X)" blokundan istifadə edərək cihazın radio qrupunu 0 -a təyin etməliyik
  • İsteğe bağlı olaraq, istifadəçiyə hər şeyin sürətlə getdiyini bildirmək üçün "Çıxış tamamlandı" mesajını seriya çıxışına yazın.
  • Cihazı qurduqdan sonra, dövlət döngə funksiyamızı çağıra bilərik.

Addım 6: 5 X 5 LED Ekranından istifadə edərək Animasiyalar və Qrafika Göstərmək İstəyirik

5 X 5 LED Ekranından istifadə edərək Animasiyalar və Qrafika Göstərmək İstəyirik
5 X 5 LED Ekranından istifadə edərək Animasiyalar və Qrafika Göstərmək İstəyirik
5 X 5 LED Ekranından istifadə edərək Animasiyalar və Qrafika Göstərmək İstəyirik
5 X 5 LED Ekranından istifadə edərək Animasiyalar və Qrafika Göstərmək İstəyirik
5 X 5 LED Ekranından istifadə edərək Animasiyalar və Qrafika Göstərmək İstəyirik
5 X 5 LED Ekranından istifadə edərək Animasiyalar və Qrafika Göstərmək İstəyirik

Və indi tamamilə fərqli bir şey üçün.

Bir neçə animasiya və bir neçə simvol göstərmək istəyirik, amma əsas vəziyyət halqasını kəsmək istəmirik. Təəssüf ki, şəkilləri və mətn sətirlərini göstərən blokların standart olaraq 400 ms gecikməsi var. Kodun javascript təqdimatını redaktə etmədən bunu dəyişmək üçün heç bir yol yoxdur. Beləliklə, edəcəyimiz budur.

  • Hər bir şəkil üçün bir funksiya yaradın. Bu, hər dəfə javascript redaktə etmək əvəzinə görüntünü göstərmək üçün tək bir blokdan istifadə etməyə imkan verəcəkdir. Bu xüsusi proqramda heç bir görüntü bir dəfədən çox istifadə edilmir, amma yenə də düşünürəm ki, bu üslub kodu oxumağı asanlaşdırır.
  • Hər yeni funksiyada, "X -i" əvəz edən müvafiq şəkil dəyişən adı ilə "ofset 0 -da şəkil (X) göstər" bloku əlavə edin.
  • Əsas vəziyyət döngəsinə əlavə edin. ƏMƏLSİZ vəziyyəti idarə edəndən başqa hər bloka "String (X)" bloklarını göstərin. Fərqli vəziyyətlərini göstərmək üçün cihazın göstərilməsi üçün bir xarakter əlavə edin. İşdə etdiyim budur:

    • LISTEN_A: 'a'
    • LISTEN_B: 'b'
    • TEAM_A: 'A'
    • TEAM_B: 'B'

      TƏSVİRSİZ vəziyyət üçün, yükləmə animasiyasını yeniləyəcək bir funksiyaya zəng edin. Bu funksiyanın detallarını aşağıda dolduracağıq

  • JavaScript rejiminə keçin.
  • X.showImage (0) və basic.showString (X) üçün edilən bütün zəngləri tapın
  • Hər birini X.showImage (0, 0) və ya basic.showString (X, 0) olaraq dəyişdirin

    • Bu əlavə arqumentin əlavə edilməsi, hərəkətdən sonrakı gecikməni 0 olaraq təyin edəcək. Varsayılan olaraq, bu kənarda qalıb və bu blokların hər birinin icrasından sonra cihaz 400 ms ərzində fasilə verəcək.
    • İndi şəkillərimizi animasiya bloklarımızda göstərə biləcəyimiz gecikmədən azad bir mexanizmimiz var, indi qura bilərik

Birincisi, nisbətən sadə yayım animasiya funksiyasını quracağıq. İstifadəçinin yayım funksiyasını spam etməsini dayandırmaq üçün funksiya tamamlanana qədər bir şey edə bilməsini istəmədiyimiz üçün daha sadədir. Bunu yerinə yetirmək üçün, funksiya tamamlanana qədər idarəetmə axını məhdudlaşdıra bilərik, bu da standart davranışdır.

  • Yayım animasiyasını göstərəcək bir funksiya yaradın.
  • Bu blokun içərisində, animasiyanın hər bir çərçivəsinə bir dənə, görünmə qaydasına görə üç funksiya çağırışı əlavə edin
  • Şəkil göstərmə funksiyasına hər zəngdən sonra "gözləyin (bizi) (X)" bloku əlavə edin.

    Qeyd: İnkişaf etmiş idarəetmə bölməsindən olan bu blok, "duraklama (ms)" dan daha da irəli gedəcək, çünki göstərilən müddət bitənə qədər prosessoru tamamilə donduracaq. Fasilə bloku istifadə edildikdə, cihazın pərdə arxasında digər vəzifələri yerinə yetirməsi mümkündür. Gözləmə bloku ilə bu mümkün deyil

  • (X) ilə (MS_PER_FRAME_BROADCAST_ANIMATION x MICROSECONDS_PER_MILLISECOND) əvəz edin
  • İndi animasiya düzgün işləməlidir

İkincisi, yükləmə animasiyasını göstərmək üçün bir mexanizm quracağıq. Bunun arxasındakı fikir, MS_PER_DEVICE_TICK dəyişənində təyin etdiyimiz LED ekranı müəyyən bir müddətdə yeniləməkdir. Bu dəyər, cihaz gənə uzunluğu, vəziyyət döngəsinin hər bir iterasiyasını tamamladıqdan sonra cihazın dayandırdığı milisaniyələrin sayıdır. Bu dəyər kifayət qədər kiçik olduğu üçün, ekran döngəsinin hər bir təkrarlanması zamanı ekranı bir dəfə yeniləyə bilərik və istifadəçiyə animasiyanın fasiləsiz irəlilədiyi görünür və vəziyyət dəyişdikdə istifadəçinin girişi arasında çox az gecikmə olacaq. ekran yenilənir. İTickLoadingAnimation dəyişəniylə etdiyimiz gənələri sayaraq, animasiyanın uyğun çərçivəsini göstərə bilərik.

  • Yükləmə animasiyasını yeniləyəcək bir funksiya yaradın
  • Gənə sayğacının maksimum dəyərə çatdığını yoxlamaq üçün bir şərt əlavə edin. Bu şərt, gənə sayğacının dəyəri, hər çərçivəni göstərmək üçün yükləmə animasiyasındakı çərçivələrin sayından çox olduqda, doğru olar.

    Şərt doğrudursa, iTickLoadingAnimation -ı sıfırlayın

  • If-else şərtləri bloku əlavə edin. Bunlar animasiyanın hansı çərçivəsini göstərəcəyini müəyyən edəcək.

    Animasiyanın hər bir çərçivəsi üçün, əgər sayğac hər animasiyadakı gənə sayının animasiyanın çərçivə sayı ilə vurulmasından azdırsa (1 -dən başlayaraq), o çərçivəni göstərin, əks halda növbəti kadrın nümayiş olunsun

  • Blokun altındakı iTickLoadingAnimation -ı artırın
  • İndi animasiya düzgün işləməlidir

Qeyd: Mənim nümunəmdə görünən bütün boz bloklar, bir blokun javascript təsvirini redaktə edərkən yaranır. Sadəcə, blok, standart bloklar dəsti ilə təmsil oluna bilməyən və mətn şəklində redaktə edilməli olan JavaScript kodunu ifadə edir.

Addım 7: Cihazın Radiosundan istifadə edərək məlumatları Kabelsiz ötürmək istəyirik

Cihazın radiosundan istifadə edərək məlumatları simsiz ötürmək istəyirik
Cihazın radiosundan istifadə edərək məlumatları simsiz ötürmək istəyirik

Bu addım əvvəlkindən xeyli qısadır. Əslində, bu, bəlkə də bütün dərslikdəki ən qısa addımdır.

Xatırladaq ki, cihazın istifadəçi girişinə reaksiyasını proqramlaşdırdığımız zaman ekran görüntüsündə o bölmədə izah edilməyən iki blok var idi. Bunlar radio üzərindən siqnal göndərən funksiyalara edilən zənglər idi. Daha dəqiq desək:

  • A düyməsinə basıldı:

    • Cihaz TEAM_A vəziyyətindədirsə:

      Yayım siqnalı SIG_A

  • B düyməsinə basıldı:

    • Cihaz TEAM_B vəziyyətindədirsə

      Yayım siqnalı SIG_B

Bu funksiyalar onsuz da yoxdursa yaradın.

Hər funksiyada:

  • Yayım animasiya funksiyasına zəng edin. Bu, tamamlanana qədər MS_PER_FRAME_BROADCAST_ANIMATION * 3 = 1.5 saniyədə baş verən hər hansı bir şeyin qarşısını alacaq. Sabit üç ilə vurulur, çünki animasiyada üç çərçivə var. Bu ixtiyari və estetik yüksəliş kifayət qədər böyük olarsa daha çox əlavə edilə bilər. Bu animasiyanın ikinci məqsədi istifadəçinin yayım funksiyasını spam etməsinin qarşısını almaqdır.
  • "Radio göndərmə nömrəsi (X)" blokunu əlavə edin, burada funksiya adında göstərilən siqnal sabitidir

Radioda yayımlamaq üçün lazım olan budur.

Addım 8: Cihazın Radiosundan Dinləmək və Məlumat Almaq İstəyirik və buna uyğun olaraq onu emal edirik

Cihazın Radiou üzərindən Dinləmək və Məlumat Almaq İstəyirik və buna uyğun olaraq işləməliyik
Cihazın Radiou üzərindən Dinləmək və Məlumat Almaq İstəyirik və buna uyğun olaraq işləməliyik
Cihazın Radiou üzərindən Dinləmək və Məlumat Almaq İstəyirik və buna uyğun olaraq işləməliyik
Cihazın Radiou üzərindən Dinləmək və Məlumat Almaq İstəyirik və buna uyğun olaraq işləməliyik

Bu, əsas tətbiqi yaratmaq üçün son addımdır.

Cihaza gələn radio siqnallarının necə işlənəcəyini söyləyəcəyik. Əvvəlcə cihazımız alınan siqnalı adlandıracaq. Sonra, bu siqnalın dəyərinə əsaslanaraq, əgər varsa, hansı hərəkəti etməli olduğuna qərar verəcəkdir.

Birincisi:

  1. "Radio qəbul (X)" bloku ilə başlayan bir kod bloku yaradın.
  2. İsteğe bağlı olaraq, alınan dəyəri daha açıqlayıcı bir adla başqa bir dəyişənə təyin edin.
  3. Siqnalın işlənməsini təmin edən bir funksiya çağırın

İkincisi, siqnal işləmə funksiyasında:

  1. Siqnalın dəyərinə əsaslanaraq şöbənin idarə olunduğu if-else ifadələr bloku yaradın.
  2. Siqnal SIG_R olsaydı

    Cihazın vəziyyətini BOOT_STATE olaraq təyin edin (bu səbəbdən bu sabitliyi daha əvvəl yaratdıq)

  3. Siqnal SIG_A olsaydı və cari vəziyyət LISTEN_A olarsa

    Cihazın vəziyyətini TEAM_A olaraq təyin edin

  4. Siqnal SIG_B olsaydı və cari vəziyyət LISTEN_B olarsa

    Cihazın vəziyyətini TEAM_B olaraq təyin edin

Bu belədir. Tətbiq bitdi.

Addım 9: Kök Cihazı: Siqnal Seçə Bilmək İstəyirik

Kök Cihazı: Siqnal Seçə Bilmək İstəyirik
Kök Cihazı: Siqnal Seçə Bilmək İstəyirik

İndi, "kök" bir cihaz, yəni şəbəkəni idarə edəcək bir cihaz üçün sadə bir proqram yazacağıq.

Bu cihaz iki funksiyanı yerinə yetirməlidir:

  • İstifadəçiyə siqnallarımızdan birini seçməsinə icazə vermək istəyirik
  • İstifadəçiyə siqnalın yayımlanmasına icazə vermək istəyirik

Bu tətbiqin spesifikasiyası əvvəlki bir alt hissə olduğu üçün ümumi bir məlumat verəcəyəm, amma əvvəllər olduğu qədər detallara girməyəcəyəm. Yuxarıdakı şəkil bu tətbiq üçün tam kodu ehtiva edir.

İstifadəçiyə siqnal seçməsinə icazə vermək üçün:

  1. "Başlanğıcda" blokunda 5 dəyişəni işə salın:

    1. Üç siqnal (0, 1, 2)
    2. Siqnal sayı (3)
    3. Hal -hazırda seçilmiş siqnalı saxlamaq üçün bir dəyişən (əvvəlcə ilk siqnala təyin edilmiş, 0)
  2. A düyməsini sıxın:

    1. Seçilmiş siqnalı artırın
    2. Seçilən siqnalın siqnal sayından çox və ya bərabər olub olmadığını yoxlayın

      Əgər belədirsə, seçilmiş siqnalı 0 olaraq təyin edin

  3. Başlanğıc blokundan sonra gecikmədən cari seçilmiş siqnal dəyərini göstərən "əbədi" döngə işlədin

İstifadəçiyə bir siqnal yayımlamağa icazə vermək

  1. "Başlanğıcda" blokundakı radio qrupunu 0 olaraq təyin edin
  2. B düyməsini sıxın:

    "Radio göndərmə nömrəsi (X)" blokundan istifadə edərək seçilmiş siqnalı yayımlayın

Bu belədir. Kök node tətbiqi son dərəcə sadədir.

Addım 10: Bitirdik

Bitirdik
Bitirdik

Yuxarıda tətbiqi işlədən cihazların bir şəkli var. Sağdakı ikisi əsas "istifadəçi" tətbiqini, solda isə "kök" tətbiqini işlədir.

Bu oyunu orta və orta məktəb müəllimləri üçün kompüter elmləri təhsili ilə bağlı bir həftə davam edən CS Connections 2018 konfransında nümayiş etdirdim. Müəllimlərə 40 -a yaxın cihaz verdim və qaydaları izah etdim. Əksəriyyət oyunun əyləncəli olduğunu, bir çoxları isə necə oynayacağını anlayana qədər çaşqınlıq yaratdığını gördü. Nümayiş qısa idi, amma olduqca fərqli bir izdiham arasında oyunun əyləncəli olduğunu gördük.

CS Connections 2018 haqqında daha çox məlumatı burada tapa bilərsiniz.

Tövsiyə: