Satura rādītājs:

Tīkla sāncensība: zema latentuma spēle BBC Micro: bits: 10 soļi (ar attēliem)
Tīkla sāncensība: zema latentuma spēle BBC Micro: bits: 10 soļi (ar attēliem)

Video: Tīkla sāncensība: zema latentuma spēle BBC Micro: bits: 10 soļi (ar attēliem)

Video: Tīkla sāncensība: zema latentuma spēle BBC Micro: bits: 10 soļi (ar attēliem)
Video: Traveling Wrap-Up + Robots and Reading Comments 2024, Decembris
Anonim
Tīkla sāncensība: zema latentuma spēle BBC Micro: bit
Tīkla sāncensība: zema latentuma spēle BBC Micro: bit
Tīkla sāncensība: zema latentuma spēle BBC Micro: bit
Tīkla sāncensība: zema latentuma spēle BBC Micro: bit

Šajā apmācībā es paskaidrošu, kā BBC micro: bit ieviest vairāku spēlētāju pamata spēli ar šādām funkcijām:

  • Vienkāršs interfeiss
  • Zems latentums starp pogu nospiešanu un ekrāna atjauninājumiem
  • Elastīgs dalībnieku skaits
  • Vienkārša spēles vadība, izmantojot galveno tālvadības ("root") ierīci

Spēle būtībā ir politikas simulācija. Visi spēlētāji sāk spēlēt bez komandām, izņemot divus spēlētājus. Viens no šiem spēlētājiem tiek piešķirts komandai A, bet otrs - komandai B.

Spēles mērķis, lai katrs spēlētājs būtu komandā kopā ar lielāko daļu spēlētāju laikā, kad visi tiek pārveidoti.

Iepriekš redzamā diagramma parāda ierobežota stāvokļa mašīnu, t.i., to stāvokļu specifikāciju, kuros ierīce var atrasties, un pārejas starp šiem stāvokļiem.

Stāvokli var uzskatīt par pašreizējo datu kopu, kas raksturo ierīces atmiņu kopš tās ieslēgšanas. Pamatojoties uz šiem datiem, ierīce var veikt noteiktas darbības vai atšķirīgi reaģēt uz lietotāja ievadīto informāciju.

Pāreja ir loģisks nosacījums, kas, ja tā ir patiesa, izraisa ierīces stāvokļa maiņu. Pāreja var notikt no viena stāvokļa uz jebkuru citu. Štatā var būt vairākas pārejas.

Iepriekš redzamajā diagrammā ir norādīti šādi stāvokļi:

  • Nepiešķirts
  • Klausieties A.
  • Klausieties B.
  • Komanda A.
  • B komanda

Ierīce, kurā darbojas spēles kods, var būt jebkurā no šiem pieciem stāvokļiem, bet tikai pa vienam un tikai šajos piecos.

Visā ceļvedī es pieņemšu, ka jūs izmantojat Microsoft MakeCode redaktoru, kas atrodams vietnē

Ar pilnu spēles ieviešanu var iepazīties šeit:

makecode.microbit.org/_CvRMtheLbRR3 ("microbit-demo-user" ir projekta nosaukums)

Galvenā ("root") tīkla kontroliera ieviešanu var atrast šeit:

makecode.microbit.org/_1kKE6TRc9TgE ("microbit-demo-root" ir projekta nosaukums)

Es atsaucos uz šiem piemēriem visā apmācībā.

1. darbība. Apsvērumi par lielu attēlu

Pirms mēs rakstām jebkuru kodu, mums ir jādomā par to, kā mēs vēlamies izskatīties mūsu galaprodukts. citiem vārdiem sakot, kādas ir pieteikuma prasības? Ko mūsu kodam vajadzētu likt ierīcei darīt, kad tā ir pabeigta? Esmu sadalījis galvenās lietojumprogrammas funkcionalitāti sešās kategorijās, no kurām katru var aplūkot no atšķirīga dizaina viedokļa.

  1. Mēs vēlamies kontrolēt ierīces darbības, pamatojoties uz tās pašreizējo stāvokli
  2. Mēs vēlamies, lai ierīce reaģētu uz lietotāja ievadīto informāciju
  3. Mēs varam vēlēties parādīt animācijas un grafikas, izmantojot 5 x 5 LED displeju
  4. Mēs vēlamies inicializēt datu vērtības ierīces atmiņā, kad ierīce sāk darboties
  5. Mēs vēlamies pārsūtīt datus bezvadu režīmā, izmantojot ierīces radio
  6. Mēs vēlamies klausīties un saņemt datus, izmantojot ierīces radio, un attiecīgi tos apstrādāt

Ļaujiet man sīkāk pastāstīt par katru no tiem.

1. Mēs vēlamies kontrolēt ierīces darbības, pamatojoties uz tās pašreizējo stāvokli

Tāpat kā vairums citu programmu, koda norādīto norādījumu izpilde notiek pa vienai rindai. Mēs vēlamies, lai mūsu ierīce izpildītu noteiktus norādījumus, pamatojoties uz tās iekšējo stāvokli, kā parādīts diagrammā šīs apmācības augšpusē. Mēs varētu uzrakstīt nosacījumu sēriju pēc katra koda bloka, kas pārbauda ierīces darbību, taču šī pieeja var kļūt ļoti netīra ļoti ātri, tāpēc mēs izmantosim bezgalīgu cilpu, kas vienkārši pārbauda vienu mainīgo un pamatojoties uz šo mainīgo, izpilda noteiktu instrukciju kopu vai vispār neko nedara. Šis mainīgais tiks identificēts ar sufiksu "_state" gan mūsu lietotnē, gan mūsu saknes lietojumprogrammā.

2. Mēs vēlamies, lai ierīce reaģētu uz lietotāja ievadīto informāciju

Neskatoties uz normālu koda izpildi, kas notiek secīgi, tas ir, vienu rindu vienlaikus, mums ir nepieciešams, lai mūsu ierīce reaģētu uz pogu nospiešanu, kamēr galvenā stāvokļa cilpa nosaka, kas ierīcei jādara jebkurā brīdī. Šim nolūkam ierīcei ir iespēja nosūtīt signālus uz zemāka līmeņa programmatūru, kas mijiedarbojas ar aparatūru, izraisot tā saukto notikumu. Mēs varam rakstīt kodu, kas liek ierīcei kaut ko darīt, kad tā konstatē noteikta veida notikumus.

3. Mēs vēlamies parādīt animācijas un grafikas, izmantojot 5 x 5 LED displeju

Šķiet, ka tā izdarīšanas mehānisms ir vienkāršs, taču bloks parāda attēlu, un tas pievieno slēptu 400 ms aizkavi. Tā kā mēs vēlamies, lai mūsu ierīce turpinātu izpildīt savu stāvokļa ciklu ar pēc iespējas mazāku latentumu, mums būs jārediģē javascript kods, lai samazinātu kavēšanos.

4. Mēs vēlamies inicializēt datu vērtības ierīces atmiņā, kad ierīce sāk darboties

Pirms mūsu ierīce kaut ko dara, lietojumprogrammai ir jāielādē savi dati atmiņā. Tas ietver pastāvīgus mainīgos, kas nosaukti koda lasāmības dēļ, mainīgos, kas satur attēlus, kas var būt daļa no animācijas, un skaitītāju mainīgos, kuriem jāsākas ar nulli, lai tie darbotos pareizi. Mēs nonāksim garā mainīgo nosaukumu un to nesen piešķirto vērtību sarakstā. Kā personīgā stila izvēle es atzīmēšu nemainīgas vērtības, t.i., vērtības, kuras man nekad nevajadzēs mainīt, izmantojot ALL_CAPS. Es arī pievienoju galveno mainīgo identifikatorus ar kategorijas nosaukumu, kas attiecas uz objekta vai tipa veidu, uz kuru attiecas identifikators. Tas tiek darīts, lai atvieglotu koda ievērošanu. Es nekad neizmantošu mainīgā nosaukumu, piemēram, “vienums” vai “x”, jo rodas neskaidrības, kas rodas, mēģinot atšifrēt kodu.

5. Mēs vēlamies pārsūtīt datus bezvadu režīmā, izmantojot ierīces radio

Tas faktiski ir diezgan vienkāršs uzdevums, lietojot MakeCode bloku valodu. Mēs vienkārši iestatām visas ierīces vienā radio grupā sāknēšanas laikā, un tad, kad vēlamies nosūtīt signālu, mēs varam nodot vienu numuru mums piešķirtajam blokam "Radio send number". Ir svarīgi, lai sūtītājs un saņēmējs strādā vienā radio grupā, jo pretējā gadījumā viņi sūtīs vai saņems dažādās frekvencēs, un saziņa būs neveiksmīga.

6. Mēs vēlamies klausīties un saņemt datus, izmantojot ierīces radio, un attiecīgi tos apstrādāt

Paturot prātā tos pašus apsvērumus kā iepriekšējais vienums, mēs klausīsimies ienākošās pārraides tāpat kā lietotāja ievadīto informāciju: ar notikumu apstrādātāju. Mēs uzrakstīsim koda bloku, kas pārbaudīs visus ienākošos signālus un pārbaudīs, vai ir jāveic kādas darbības, netraucējot galveno stāvokļa cilpu.

Turklāt mums īsi jāapsver daudz vienkāršākas saknes lietojumprogrammas dizains - programma, kas ierīcei ļaus kontrolēt visu tīklu. Es tam netērēšu daudz laika, jo tas ir daudz vienkāršāk nekā iepriekš minētais dizains, un liela daļa no tā ir vienkārši atkārtošanās. Saknes deice funkcionalitāti esmu sadalījis trīs kategorijās.

  1. Mēs vēlamies, lai varētu izvēlēties signālu
  2. Mēs vēlamies pārraidīt signālu

-

1. Mēs vēlamies, lai varētu izvēlēties signālu

To var izdarīt, vienkārši nospiežot pogu, lai atkārtotu iespējamos signālus. Tā kā ir tikai trīs, ar šo pieeju pietiks. Tajā pašā laikā mums var būt cilpa, kas pastāvīgi atkārtoti parāda izvēlēto signālu, ļaujot lietotājam nospiest pogu un redzēt, ka izvēlētais signāls parādās LED displejā ar ļoti mazu latentumu.

2. Mēs vēlamies, lai varētu pārraidīt signālu

Tā kā ir divas pogas, mēs varam izraudzīties vienu izvēlei un otru apstiprināšanai. Tāpat kā lietotne, mēs vienkārši nosūtām signālu tīklā kā numuru. Cita informācija nav nepieciešama.

Vairāk par vienkāršo signāla protokolu es runāšu nākamajā sadaļā.

2. solis: Signāla protokols: vienkārša valoda tīkla saziņai

Turpmāk minētos signālus var uzskatīt par visu iespējamo vārdu kopumu, ko ierīces var izmantot, lai sarunātos savā starpā. Tā kā tīkls ir tik vienkāršs, nav daudz ko teikt, un tāpēc mēs varam attēlot šos trīs signālus ar vienkāršām veselām skaitļu vērtībām.

0. Atiestatīt

  • Identifikators kodā: SIG-R
  • Vesela skaitļa vērtība: 0
  • Mērķis: Lieciet visām ierīcēm, kas atrodas diapazonā, atmest to, ko viņi dara, un rīkoties tā, it kā tās būtu tikko palaistas. Ja šis signāls sasniedz katru tīkla ierīci, viss tīkls tiks atiestatīts un lietotāji var sākt jaunu spēli. Šo signālu var pārraidīt tikai saknes ierīce.

1. Pārvēršana A

  • Identifikators kodā: SIG-A
  • Vesela skaitļa vērtība: 1
  • Mērķis: pasakiet jebkurai ierīcei LISTEN_A, kad tā ir saņēmusi reklāmguvuma signālu, lai pārslēgtos uz stāvokli TEAM_A.

2. Pārvēršana B

  1. Identifikators kodā: SIG-B
  2. Vesela skaitļa vērtība: 2
  3. Mērķis: pasakiet jebkurai ierīcei, kas atrodas stāvoklī LISTEN_B, kad tā ir saņēmusi reklāmguvuma signālu, lai pārslēgtos uz stāvokli TEAM_B.

3. darbība. Mēs vēlamies kontrolēt ierīces darbības, pamatojoties uz tās pašreizējo stāvokli

Mēs vēlamies kontrolēt ierīces darbības, pamatojoties uz tās pašreizējo stāvokli
Mēs vēlamies kontrolēt ierīces darbības, pamatojoties uz tās pašreizējo stāvokli
Mēs vēlamies kontrolēt ierīces darbības, pamatojoties uz tās pašreizējo stāvokli
Mēs vēlamies kontrolēt ierīces darbības, pamatojoties uz tās pašreizējo stāvokli
Mēs vēlamies kontrolēt ierīces darbības, pamatojoties uz tās pašreizējo stāvokli
Mēs vēlamies kontrolēt ierīces darbības, pamatojoties uz tās pašreizējo stāvokli

Beidzot mēs varam sākt rakstīt kodu.

Vispirms atveriet jaunu projektu vietnē Make Code

  • Izveidojiet jaunu funkciju. Es saucu raktuves cilpu, jo šī ir lietojumprogrammas galvenā cilpa
  • Pievienojiet cilpas bloku, kas atkārtosies bezgalīgi. Es izmantoju, kamēr (true), jo burtiskā patiesība nekad nebūs nepatiesa, tāpēc lietojumprogrammas vadības plūsma nekad neizies no cilpas
  • Pievienojiet pietiekami daudz bloķēšanas, lai pārbaudītu, vai ierīce atrodas kādā no pieciem iespējamiem stāvokļiem
  • Izveidojiet mainīgo, lai noturētu pašreizējo ierīces stāvokli
  • Izveidojiet mainīgos, lai attēlotu katru no pieciem iespējamiem stāvokļiem

    Piezīme. Ir labi, ka šiem mainīgajiem vēl nav piešķirtas vērtības. Mēs pie tā nonāksim. Šajā brīdī svarīgāk ir rakstīt tīru, viegli lasāmu kodu

  • Mainiet katru nosacījumu blokā “if-else”, lai salīdzinātu pašreizējo stāvokli ar kādu no iespējamiem stāvokļiem
  • Bloka if-else apakšā pievienojiet pauzi dažiem milisekundēm un izveidojiet mainīgo, lai turētu šo skaitli. Mēs to inicializēsim vēlāk. Pārliecinieties, vai mainīgajam ir aprakstošs nosaukums, piemēram, ērce vai sirdsdarbība. Tā kā šī ir ierīces galvenā cilpa, šī pauze noteiks ātrumu, kādā ierīce izpilda galveno cilpu, tāpēc tā ir ļoti svarīga vērtība un ir pārāk svarīga, lai būtu burvju skaitlis bez nosaukuma.

Piezīme: neuztraucieties par pelēkajiem blokiem trešajā attēlā. Pie tiem es tikšu vēlāk.

4. darbība. Mēs vēlamies reaģēt uz lietotāja ievadi

Mēs vēlamies reaģēt uz lietotāja ievadi
Mēs vēlamies reaģēt uz lietotāja ievadi
Mēs vēlamies reaģēt uz lietotāja ievadi
Mēs vēlamies reaģēt uz lietotāja ievadi

Tagad mēs vēlamies ierīcei pateikt, kā rīkoties ar pogu nospiešanu. Pirmā doma varētu būt vienkārši ievades kategorijā izmantot blokus "Kad poga tiek nospiesta", taču mēs gribētu precīzāku kontroli. Mēs izmantosim bloku "ieslēgts notikums no (X) ar vērtību (Y)" no kontroles kategorijas zem papildu sadaļas, jo šajā apmācībā mēs esam pieredzējuši.

  • Izveidojiet četrus blokus “par notikumu no…”.

    • Diviem no tiem vajadzētu pārbaudīt notikuma avotu "MICROBIT_ID_BUTTON_A"
    • Diviem no tiem vajadzētu pārbaudīt notikuma avotu "MICROBIT_ID_BUTTON_B"
    • No diviem notikumiem, kuru mērķis ir katra poga:

      • Jāpārbauda, vai nav notikuma veida "MICROBIT_BUTTON_EVT_UP"
      • Jāpārbauda, vai nav notikuma veida "MICROBIT_BUTTON_EVT_DOWN"
    • Piezīme. Šīs iespējas ar lielajiem burtiem ir etiķetes, kas tiek izmantotas zemākā līmeņa mikro: bitu kodā. Tie ir vienkārši vietturi, kurus vēlāk aizstāj ar veseliem skaitļiem, kad kods tiek apkopots izpildāmā binārā. Cilvēkiem ir vieglāk izmantot šīs etiķetes, nekā meklēt, kuru veselu skaitli ievietot, lai gan abi darbotos vienādi.
  • Stila jautājumā es izvēlējos, lai katrs bloks “uz notikumu no…” izsauktu funkciju, kas apraksta izvirzīto notikumu. Lai gan tas nav absolūti nepieciešams, manuprāt, tas uzlabo lasāmību. Ja kāds to vēlas, viņi var ievietot notikumu apstrādes kodu pašā blokā "on event from …".

    Piezīme. Koda bloku, kas apstrādā ierīces reakciju uz notikumu, intuitīvi sauc par "notikumu apstrādātāju"

  • Katrā notikumu apstrādātājā pievienojiet to pašu struktūru, ja citādi, lai sadalītu vadības plūsmu, pamatojoties uz ierīces stāvokli, kā struktūru galvenajā stāvokļa cilpā.
  • Pievienojiet piešķiršanas blokus, kas maina ierīces stāvokli, kā norādīts mūsu stāvokļa diagrammā

    • Mēs zinām, ka tad, kad ierīce ir stāvoklī UNASSIGNED, ierīcei vajadzētu reaģēt uz pogu A, nospiežot pāreju uz stāvokli LISTEN_A, un pogu B, nospiežot pāreju uz stāvokli LISTEN_B.
    • Mēs arī zinām, ka tad, kad ierīce ir stāvoklī LISTEN_A vai LISTEN_B, ierīcei vajadzētu reaģēt uz attiecīgi A pogu un B pogu, atgriežoties, pārejot atpakaļ uz stāvokli UNASSIGNED.
    • Visbeidzot, mēs zinām, ka tad, kad ierīce atrodas stāvoklī TEAM_A vai TEAM_B, ierīcei ir jāreaģē uz nospiesto pogu A un pogu B, attiecīgi pārraidot SIG_A un SIG_B.

      Šajā brīdī nav jāaizpilda informācija par apraides signāliem. Mēs pie tā nonāksim vēlāk. Svarīgi ir tas, ka mēs uzdodam šīm funkcijām izmantot mūsu rakstīto kodu, piešķirot šim darbību blokam nosaukumu, piemēram, broadcastSignalSIG_A, kas apraksta, kas šajā brīdī būtu jādara

5. darbība. Mēs vēlamies inicializēt datu vērtības ierīču atmiņā, kad ierīce sāk darboties

Mēs vēlamies inicializēt datu vērtības ierīču atmiņā, kad ierīce sāk darboties
Mēs vēlamies inicializēt datu vērtības ierīču atmiņā, kad ierīce sāk darboties
Mēs vēlamies inicializēt datu vērtības ierīču atmiņā, kad ierīce sāk darboties
Mēs vēlamies inicializēt datu vērtības ierīču atmiņā, kad ierīce sāk darboties
Mēs vēlamies inicializēt datu vērtības ierīču atmiņā, kad ierīce sāk darboties
Mēs vēlamies inicializēt datu vērtības ierīču atmiņā, kad ierīce sāk darboties

Šajā brīdī mēs esam izmantojuši daudz mainīgo (datu nosaukumus), bet mēs faktiski neesam piešķīruši šiem nosaukumiem vērtības. Mēs vēlamies, lai ierīce sāknēšanas laikā ielādētu visu šo mainīgo vērtības atmiņā, tāpēc mēs ievietojam šo mainīgo inicializāciju blokā "start".

Šīs vērtības mums ir jāinicializē:

  • Signāla konstantes saskaņā ar signāla protokolu. Vērtībām jābūt:

    • SIG_R = 0
    • SIG_A = 1
    • SIG_B = 2
    • Piezīme. Es šīm konstantēm pievienoju “EnumSignals”, lai norādītu, ka šiem mainīgajiem ir jāizturas tā, it kā tie būtu daļa no uzskaitītā tipa, ko sauc par signāliem. Šādi šie mainīgie var tikt ieviesti citās programmēšanas valodās. Uzskaitīto tipu definīcija un skaidrojums ir ārpus manas apmācības jomas. To var meklēt Google, ja viņi to vēlas. Šie prefiksi ir vienkārši stilistiskas izvēles, un tie nav būtiski programmas pareizai darbībai.
  • Stāvokļa konstantes, kas var būt patvaļīgas, ja vien tām ir vērtība. Es izvēlējos stilu, lai vienkārši izmantotu veselus skaitļus, kas aug no 0, piemēram:

    • NEMAINĀTS = 0
    • LISTEN_A = 1
    • LISTEN_B = 2
    • KOMANDA_A = 3
    • TEAM_B = 4
    • Piezīme. Es pieņēmu tādu pašu stila lēmumu attiecībā uz šo mainīgo prefiksiem. Turklāt es minēšu, ka viss saistībā ar šiem uzdevumiem, vērtībām un kārtību ir pilnīgi patvaļīgs. Nav pat nozīmes tam, ka šīs vērtības dažādās ierīcēs ir konsekventas, jo tās tiek izmantotas tikai iekšēji, nevis saziņai tīklā. Svarīgi ir tikai tas, ka mainīgajiem ir vērtība un ka tos var salīdzināt, lai noskaidrotu, vai tie ir līdzvērtīgi.
  • Lasāmības labad konstante ar nosaukumu BOOT_STATE un iestatiet to uz UNASSIGNED. Tas padara faktu, ka mēs atiestatām sāknēšanas stāvokli, nevis patvaļīgāku stāvokli, vēl skaidrāk, kad ierīce saņem atiestatīšanas signālu, ko mēs īstenosim vēlāk.
  • Animācijas konstantes, kas tiek izmantotas nākamajā darbībā, lai izveidotu animācijas, kas ļauj ārkārtīgi zemas latentuma pārtraukumus, izmantojot lietotāja ievadi. Mēs līdz šim tos neesam izmantojuši, taču tie noteikti tiks izskaidroti un izmantoti nākamajā sadaļā. Dažu no tiem nosaukumiem vajadzētu būt intuitīviem.

    • 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
  • Vēl viens mainīgais animācijai, šoreiz skaitītājs, kas noteikti nav nemainīgs. Tāpat kā lielākā daļa skaitītāju, mēs inicializējam to uz 0

    iTickLoadingAnimation = 0

  • Izveidojiet divas mainīgo sērijas, lai turētu animācijas rāmjus. Pirmajā, ko es saucu par “ielādes animāciju”, vajadzētu būt četriem attēliem (ko jūs, iespējams, uzminējāt pēc pēdējās pastāvīgās inicializācijas), un otrajam, ko es saucu par “apraides animāciju”, kurā vajadzētu būt trim attēliem. Es ieteiktu nosaukt mainīgos, lai tie atbilstu animācijas rāmjiem, piem. ringAnimation0, ringAnimation1…

    Izveidojiet tādas pašas attēla vērtības kā es vai izveidoju oriģinālākus un vēsākus attēlus

  • Visbeidzot, mums ir jāiestata ierīces radio grupa uz 0, izmantojot bloku "radio komplekta grupa (X)"
  • Pēc izvēles sērijas izvadei uzrakstiet ziņojumu “Inicializācija pabeigta”, lai lietotājam pateiktu, ka viss gāja gludi.
  • Tagad, kad esam pabeiguši ierīces iestatīšanu, mēs varam izsaukt savu stāvokļa cilpas funkciju.

6. darbība. Mēs vēlamies parādīt animācijas un grafikas, izmantojot 5 X 5 LED displeju

Mēs vēlamies parādīt animācijas un grafiku, izmantojot 5 X 5 LED displeju
Mēs vēlamies parādīt animācijas un grafiku, izmantojot 5 X 5 LED displeju
Mēs vēlamies parādīt animācijas un grafiku, izmantojot 5 X 5 LED displeju
Mēs vēlamies parādīt animācijas un grafiku, izmantojot 5 X 5 LED displeju
Mēs vēlamies parādīt animācijas un grafiku, izmantojot 5 X 5 LED displeju
Mēs vēlamies parādīt animācijas un grafiku, izmantojot 5 X 5 LED displeju

Un tagad par kaut ko pavisam citu.

Mēs vēlamies parādīt dažas animācijas un dažas rakstzīmes, taču nevēlamies pārtraukt galveno stāvokļa cilpu. Diemžēl blokiem, kas parāda attēlus un teksta virknes, pēc noklusējuma ir 400 ms aizkave. To nevar mainīt, ja nav rediģēts koda JavaScript attēlojums. Tātad, to mēs darīsim.

  • Izveidojiet funkciju katram attēlam. Tas ļaus attēla parādīšanai izmantot vienu bloku, nevis katru reizi rediģēt javascript. Šajā īpašajā programmā neviens attēls netiek izmantots vairāk nekā vienu reizi, taču es joprojām domāju, ka šis stils atvieglo koda lasīšanu.
  • Katrā jaunajā funkcijā pievienojiet bloku "parādīt attēlu (X) pie 0 nobīdes", aizstājot atbilstošo attēla mainīgā nosaukumu (X)
  • Pievienojiet galvenajā stāvokļa cilpā. Bloki "Rādīt virkni (X)" katram blokam, izņemot to, kas apstrādā stāvokli UNASSIGNED. Pievienojiet rakstzīmi, ko ierīce parādīs, lai norādītu dažādus tās stāvokļus. Lūk, ko es izdarīju:

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

      Stāvokļa UNASSIGNED gadījumā zvaniet funkcijai, kas atjauninās ielādes animāciju. Tālāk mēs aizpildīsim šīs funkcijas detaļas

  • Pārslēdzieties uz javascript režīmu.
  • Atrodiet katru zvanu uz X.showImage (0) un basic.showString (X)
  • Mainiet katru uz X.showImage (0, 0) vai basic.showString (X, 0)

    • Pievienojot šo papildu argumentu, aizkave pēc darbības tiks iestatīta uz 0. Pēc noklusējuma tas tiek izlaists, un ierīce pārtrauks darbību 400 ms pēc katra no šiem blokiem izpildes.
    • Tagad mums ir gandrīz bez latentuma mehānisms, lai parādītu mūsu attēlus mūsu animācijas blokos, kurus mēs tagad varam izveidot

Pirmkārt, mēs izveidosim salīdzinoši vienkāršo apraides animācijas funkciju. Tas ir vienkāršāk, jo mēs nevēlamies, lai lietotājs varētu kaut ko darīt, kamēr funkcija nav pabeigta, lai neļautu viņiem pārraidīt apraides funkciju. Lai to paveiktu, mēs varam vienkārši ierobežot vadības plūsmu līdz blokam, līdz funkcija ir pabeigta, kas ir standarta uzvedība.

  • Izveidojiet funkciju, kas parādīs apraides animāciju.
  • Šī bloka iekšpusē pievienojiet trīs funkciju izsaukumus, vienu katrā animācijas kadrā, tādā secībā, kādā tie jāparāda
  • Pēc katra zvana attēlu parādīšanas funkcijai pievienojiet bloku "pagaidiet (mēs) (X)".

    Piezīme. Šis bloks no uzlabotās vadības sadaļas iet vēl tālāk par "pauze (ms)", jo tas pilnībā iesaldēs procesoru, līdz būs pagājis norādītais laiks. Kad tiek izmantots pauzes bloks, iespējams, ierīce aizkadrā veiks citus uzdevumus. Ar gaidīšanas bloku tas nav iespējams

  • Aizstāt (X) ar (MS_PER_FRAME_BROADCAST_ANIMATION x MICROSECONDS_PER_MILLISECOND)
  • Tagad animācijai vajadzētu darboties pareizi

Otrkārt, mēs izveidosim iekraušanas animācijas parādīšanas mehānismu. Tā ideja ir atjaunināt LED displeju noteiktā intervālā, ko mēs definējam mainīgajā MS_PER_DEVICE_TICK. Šī vērtība, ierīces atzīmes garums, ir milisekundes, kuras ierīce pauzē pēc katras stāvokļa cilpas atkārtošanas. Tā kā šī vērtība ir pietiekami maza, mēs varam atjaunināt displeju vienu reizi katras displeja cilpas iterācijas laikā, un lietotājam parādīsies, ka animācija norit nevainojami, un, mainoties stāvoklim, starp lietotāja ievadi būs ļoti mazs latentums displejs tiek atjaunināts. Saskaitot ērces, ko mēs darām ar mainīgo iTickLoadingAnimation, mēs varam parādīt atbilstošo animācijas rāmi.

  • Izveidojiet funkciju, kas atjauninās ielādes animāciju
  • Pievienojiet nosacījumu, lai pārbaudītu, vai ērču skaitītājs ir sasniedzis maksimālo vērtību. Šis nosacījums būs patiess, ja ērču skaitītāja vērtība ir lielāka par kadru skaitu ielādes animācijā, kas reizināta ar ērču skaitu, lai parādītu katru kadru

    Ja nosacījums ir patiess, atiestatiet iTickLoadingAnimation uz 0

  • Pievienojiet nosacījumu if-else bloku. Tie noteiks, kuru animācijas rāmi parādīt.

    Ja katram animācijas kadram ērču skaitītājs ir mazāks par ērču skaitu katrā animācijā, kas reizināts ar animācijas kadru skaitu (sākot ar 1), tad parādiet šo kadru, pretējā gadījumā pārbaudiet, vai nākamais kadrs ir tiek parādīts

  • Bloka apakšā palieliniet iTickLoadingAnimation
  • Tagad animācijai vajadzētu darboties pareizi

Piezīme. Visi pelēkie bloki, kas parādās manā piemērā, tiek ģenerēti, rediģējot bloka javascript attēlojumu. Tas vienkārši nozīmē, ka bloks apzīmē javascript kodu, kuru nevar attēlot, izmantojot standarta bloku komplektu, un tas ir jārediģē teksta formā.

7. solis: Mēs vēlamies pārsūtīt datus bez vadiem, izmantojot ierīces radio

Mēs vēlamies pārsūtīt datus bez vadiem, izmantojot ierīces radio
Mēs vēlamies pārsūtīt datus bez vadiem, izmantojot ierīces radio

Šis solis ir daudz īsāks nekā iepriekšējais. Patiesībā tas, iespējams, ir īsākais solis visā šajā apmācībā.

Atgādiniet, ka tad, kad mēs ieprogrammējām ierīces reakciju uz lietotāja ievadi, ekrānuzņēmumā bija divi bloki, kas šajā sadaļā nebija izskaidroti. Tie bija zvani uz funkcijām, kas sūta signālus pa radio. Konkrētāk:

  • Iespiesta poga A:

    • Ja ierīce ir stāvoklī TEAM_A:

      Apraides signāls SIG_A

  • Iespiesta poga B:

    • Ja ierīce ir stāvoklī TEAM_B

      Apraides signāls SIG_B

Izveidojiet šīs funkcijas, ja tās vēl nav.

Katrā funkcijā:

  • Zvaniet apraides animācijas funkcijai. Tādējādi tiks bloķēts jebkas cits, līdz tas tiks pabeigts, un tas notiks pēc MS_PER_FRAME_BROADCAST_ANIMATION * 3 = 1,5 sekundēm. Konstante tiek reizināta ar trim, jo animācijā ir trīs kadri. Tas ir patvaļīgi, un to var pievienot vairāk, ja estētiskais jauninājums ir pietiekami liels. Otrs šīs animācijas mērķis ir neļaut lietotājam pārraidīt surogātpastu.
  • Pievienojiet bloku "radio sūtīšanas numurs (X)", kur ir funkcijas nosaukumā minētā signāla konstante

Tas ir viss, kas jāpārraida pa radio.

8. solis: Mēs vēlamies klausīties un saņemt datus ierīces radio un attiecīgi apstrādāt

Mēs vēlamies klausīties un saņemt datus ierīces radio un attiecīgi apstrādāt
Mēs vēlamies klausīties un saņemt datus ierīces radio un attiecīgi apstrādāt
Mēs vēlamies klausīties un saņemt datus ierīces radio un attiecīgi apstrādāt
Mēs vēlamies klausīties un saņemt datus ierīces radio un attiecīgi apstrādāt

Šis ir pēdējais solis, lai izveidotu galveno lietojumprogrammu.

Mēs pastāstīsim ierīcei, kā apstrādāt ienākošos radiosignālus. Pirmkārt, mūsu ierīce nosauks saņemto signālu. Pēc tam, pamatojoties uz šī signāla vērtību, tā izlems, kādas darbības veikt, ja tādas ir.

Pirmkārt:

  1. Izveidojiet koda bloku, sākot ar bloku "pa radio saņemts (X)".
  2. Pēc izvēles piešķiriet saņemto vērtību citam mainīgajam ar vairāk aprakstošu nosaukumu.
  3. Izsauciet funkciju, kas apstrādās signālu

Otrkārt, signālu apstrādes funkcijā:

  1. Izveidojiet paziņojumu if-else bloku, kas sazaro plūsmu, pamatojoties uz signāla vērtību.
  2. Ja signāls bija SIG_R

    Iestatiet ierīces stāvokli uz BOOT_STATE (tāpēc mēs izveidojām šo konstanti agrāk)

  3. Ja signāls bija SIG_A un pašreizējais stāvoklis ir LISTEN_A

    Iestatiet ierīces stāvokli uz TEAM_A

  4. Ja signāls bija SIG_B un pašreizējais stāvoklis ir LISTEN_B

    Iestatiet ierīces stāvokli uz TEAM_B

Tieši tā. Pieteikšanās ir pabeigta.

9. solis: saknes ierīce: mēs vēlamies spēt izvēlēties signālu

Saknes ierīce: mēs vēlamies spēt izvēlēties signālu
Saknes ierīce: mēs vēlamies spēt izvēlēties signālu

Tagad mēs uzrakstīsim vienkāršu lietojumprogrammu "saknes" ierīcei, tas ir, ierīcei, kas kontrolēs tīklu.

Šai ierīcei būs jāveic divas funkcijas:

  • Mēs vēlamies ļaut lietotājam izvēlēties vienu no mūsu signāliem
  • Mēs vēlamies ļaut lietotājam pārraidīt signālu

Tā kā šīs lietojumprogrammas specifikācija ir iepriekšējās informācijas apakškopa, es sniegšu pārskatu, bet neiedziļināšos tik detalizēti kā iepriekš. Augšējā attēlā ir pilns šīs lietojumprogrammas kods.

Lai ļautu lietotājam izvēlēties signālu:

  1. Inicializējiet 5 mainīgos blokā "start":

    1. Trīs signāli (0, 1, 2)
    2. Signālu skaits (3)
    3. Mainīgais, lai noturētu pašlaik izvēlēto signālu (sākotnēji iestatīts uz pirmo signālu, 0)
  2. Nospiediet pogu A:

    1. Palieliniet izvēlēto signālu
    2. Pārbaudiet, vai izvēlētais signāls ir lielāks vai vienāds ar signālu skaitu

      Ja tā, iestatiet izvēlēto signālu uz 0

  3. Pēc ieslēgšanas bloka palaidiet “mūžīgi” cilpu, kas bez kavēšanās parāda pašreizējo izvēlēto signāla vērtību

Lai lietotājs varētu pārraidīt signālu

  1. Iestatiet radio grupu uz 0 blokā "start"
  2. Nospiediet pogu B:

    Pārraidiet izvēlēto signālu, izmantojot "radio sūtīšanas numura (X)" bloku

Tieši tā. Saknes mezgla lietojumprogramma ir ārkārtīgi vienkārša.

10. darbība. Mēs esam pabeiguši

Esam Pabeigti
Esam Pabeigti

Augšpusē ir attēls ar ierīcēm, kurās darbojas lietojumprogramma. Divās labajā pusē darbojas galvenā lietotāja lietojumprogramma, bet kreisajā - saknes lietojumprogramma.

Es demonstrēju šo spēli CS Connections 2018, nedēļas garumā vasaras konferencē vidusskolas un vidusskolas skolotājiem par datorzinātņu izglītību. Es skolotājiem izdalīju aptuveni 40 ierīces un izskaidroju noteikumus. Lielākajai daļai spēle šķita izklaidējoša, un daudziem tā šķita mulsinoša, līdz saprata, kā spēlēt. Demonstrācija bija īsa, taču mēs atklājām, ka spēle ir patīkama diezgan dažāda pūļa vidū.

Plašāku informāciju par CS Connections 2018 var atrast šeit.

Ieteicams: