Sisukord:

Võrgu rivaalitsemine: madala latentsusega mäng BBC Micro jaoks: bit: 10 sammu (piltidega)
Võrgu rivaalitsemine: madala latentsusega mäng BBC Micro jaoks: bit: 10 sammu (piltidega)

Video: Võrgu rivaalitsemine: madala latentsusega mäng BBC Micro jaoks: bit: 10 sammu (piltidega)

Video: Võrgu rivaalitsemine: madala latentsusega mäng BBC Micro jaoks: bit: 10 sammu (piltidega)
Video: Book 07 - The Hunchback of Notre Dame Audiobook by Victor Hugo (Chs 1-8) 2024, Juuli
Anonim
Võrgu rivaalitsemine: madala latentsusega mäng BBC Micro: bitile
Võrgu rivaalitsemine: madala latentsusega mäng BBC Micro: bitile
Võrgu rivaalitsemine: madala latentsusega mäng BBC Micro: bitile
Võrgu rivaalitsemine: madala latentsusega mäng BBC Micro: bitile

Selles õpetuses selgitan, kuidas rakendada põhilist mitme mängijaga mängu BBC mikro: bitil järgmiste funktsioonidega:

  • Lihtne liides
  • Madal latentsusaeg nupuvajutuste ja ekraaniuuenduste vahel
  • Paindlik osalejate arv
  • Mängu lihtne juhtimine kaugjuhtimisseadme ("root") abil

Mäng on sisuliselt poliitika simulatsioon. Kõik mängijad alustavad ühegi meeskonnaga määramata, välja arvatud kaks mängijat. Üks neist mängijatest määratakse meeskonda A ja teine meeskond B.

Mängu eesmärk on, et iga mängija oleks meeskonnas, kus on enamik mängijaid sel ajal, kui kõik on konverteeritud.

Ülaltoodud diagramm illustreerib piiratud olekuga masinat, st olekute spetsifikatsiooni, milles seade võib olla, ja nende olekute vahelisi üleminekuid.

Olekut võib pidada praeguseks andmekogumiks, mis kirjeldab seadme mälu pärast selle sisselülitamist. Nende andmete põhjal võib seade teatud toiminguid teha või kasutaja sisendile erinevalt reageerida.

Üleminek on loogiline tingimus, mis tõesuse korral muudab seadme olekut. Üleminek võib toimuda ühest olekust teise. Olekul võib olla mitu üleminekut.

Ülaltoodud diagramm määrab järgmised olekud:

  • Määramata
  • Kuulake A.
  • Kuulake B.
  • Meeskond A.
  • Meeskond B.

Mängukoodi käivitav seade võib asuda ühes neist viiest olekust, kuid ainult üks korraga ja ainult need viis.

Eeldan kogu juhendis, et kasutate Microsofti MakeCode redaktorit, mille leiate aadressilt

Mängu täieliku rakendamise leiate siit:

makecode.microbit.org/_CvRMtheLbRR3 ("microbit-demo-user" on projekti nimi)

Ja põhivõrgu kontrolleri juurutamise leiate siit:

makecode.microbit.org/_1kKE6TRc9TgE ("microbit-demo-root" on projekti nimi)

Ma viitan neile näidetele kogu oma õpetuses.

1. samm: kaalutlused suurte piltide kujundamisel

Enne mis tahes koodi kirjutamist peame mõtlema, milline me tahame oma lõpptoote välja näha. teisisõnu, millised on rakenduse nõuded? Mida peaks meie kood käsima seadmel teha, kui see on lõpetatud? Olen jaganud põhirakenduse funktsionaalsuse kuueks kategooriaks, millest igaühte võib käsitleda erinevast disainiperspektiivist.

  1. Soovime juhtida seadme toiminguid selle praeguse oleku põhjal
  2. Soovime, et seade reageeriks kasutaja sisendile
  3. Me võime soovida kuvada animatsioone ja graafikat 5 x 5 LED -ekraani abil
  4. Soovime lähtestada seadme mälus olevad andmeväärtused
  5. Soovime seadme raadio abil andmeid juhtmevabalt edastada
  6. Tahame seadme raadio kaudu andmeid kuulata ja vastu võtta ning neid vastavalt töödelda

Lubage mul minna igaühe kohta veidi üksikasjalikumalt.

1. Tahame juhtida seadme toiminguid, lähtudes selle hetkeseisust

Nagu enamik teisi programme, toimub koodiga määratud juhiste täitmine üks rida korraga. Soovime, et meie seade täidaks teatud juhiseid oma sisemise oleku põhjal, nagu on näidatud selle õpetuse ülaosas oleval skeemil. Võiksime kirjutada rea tingimusi pärast igat koodiplokki, mis seadet kontrollima peaks, kuid see lähenemine võib väga kiiresti väga sassi minna, nii et kasutame selle asemel lõpmatut tsüklit, mis lihtsalt kontrollib ühte muutujat ja põhineb sellel muutujal, täidab konkreetseid juhiseid või ei tee üldse midagi. See muutuja identifitseeritakse nii meie kasutaja- kui ka juurrakenduse järelliite "_state" järgi.

2. Soovime, et seade reageeriks kasutaja sisendile

Vaatamata koodi tavapärasele täitmisele, mis toimub järjestikku, st üks rida korraga, peame seadmel reageerima nupuvajutustele, samal ajal kui põhiseisund määrab, mida seade peaks igal hetkel tegema. Sel eesmärgil on seadmel võimalus saata signaale madalama taseme tarkvarale, mis suhtleb riistvaraga, käivitades sündmuse. Võime kirjutada koodi, mis käsib seadmel teatud tüüpi sündmuste tuvastamisel midagi ette võtta.

3. Soovime kuvada animatsioone ja graafikat 5 x 5 LED -ekraani abil

Selle tegemise mehhanism näib olevat lihtne, kuid plokk kuvab pilti, lisades 400 ms varjatud viivituse. Kuna soovime, et meie seade jätkaks oma olekusilmust võimalikult väikese latentsusega, peame viivituse minimeerimiseks JavaScripti koodi muutma.

4. Tahame lähtestada seadme mälus olevad andmeväärtused

Enne kui meie seade midagi ette võtab, peab rakendus oma andmed mällu laadima. See hõlmab pidevaid muutujaid, mis on nimetatud koodi loetavuse jaoks, muutujaid, mis sisaldavad pilte, mis võivad olla osa animatsioonist, ja loendurimuutujaid, mis peavad korralikult töötamiseks algama nullist. Lõpuks on meil pikk nimekiri muutujate nimedest ja nende äsja määratud väärtustest. Isikliku stiilivalikuna tähistan ALL_CAPS abil püsiväärtusi, st väärtusi, mida ma ei pea kunagi muutma. Lisan ka eesliite peamiste muutujate identifikaatoritele kategooria nimega, mis viitab mingile objektile või tüübile, mille alla identifikaator kuulub. Selle eesmärk on muuta koodi jälgimine lihtsamaks. Ma ei kasuta kunagi muutuja nime nagu „item” või „x”, kuna koodi lahtimõtestamisel tekib ebaselgus.

5. Tahame seadme raadio abil andmeid juhtmevabalt edastada

See on tegelikult üsna lihtne ülesanne MakeCode plokkide keele kasutamisel. Me lihtsalt seadistame kõik seadmed alglaadimise ajal samasse raadiogruppi ja siis, kui tahame signaali saata, saame edastada ühe numbri meile antud raadiosaatmisnumbrile. On oluline, et saatja ja vastuvõtja töötaksid ühes ja samas raadiogrupis, sest vastasel juhul saadavad või võtavad nad vastu erinevatel sagedustel ning side ebaõnnestub.

6. Tahame seadme raadio kaudu andmeid kuulata ja vastu võtta ning neid vastavalt töödelda

Pidades silmas samu kaalutlusi nagu eelmine üksus, kuulame sissetulevaid edastusi samamoodi nagu kasutaja sisendit: sündmuste käitlejaga. Kirjutame koodiploki, mis uurib sissetulevaid signaale ja kontrollib, kas toiminguid tuleb teha ilma põhiseisundit häirimata.

Lisaks peaksime lühidalt kaaluma palju lihtsama juurrakenduse disaini - programmi, mis võimaldab seadmel juhtida kogu võrku. Ma ei kuluta sellele palju aega, kuna see on palju lihtsam kui ülaltoodud disain ja suur osa sellest on lihtsalt kordamine. Olen jaganud juurestiku funktsionaalsuse kolme kategooriasse.

  1. Tahame signaali valida
  2. Tahame signaali edastada

-

1. Me tahame, et oleks võimalik signaali valida

Seda saab teha lihtsalt nupu abil, mis kordab võimalikke signaale. Kuna neid on ainult kolm, piisab sellest lähenemisest. Samal ajal võib meil olla silmus, mis kuvab valitud signaali pidevalt uuesti, võimaldades kasutajal vajutada nuppu ja näha, kuidas valitud signaal ilmub LED -ekraanile väga väikese latentsusega.

2. Tahame signaali edastada

Kuna nuppe on kaks, saame valida ühe valimiseks ja teise kinnitamiseks. Nagu kasutajarakendus, saadame signaali lihtsalt võrgu kaudu numbrina. Muud teavet pole vaja.

Lihtsast signaaliprotokollist räägin lähemalt järgmises osas.

2. etapp: signaaliprotokoll: lihtne võrgusuhtluse keel

Järgnevaid signaale võib pidada kõigi võimalike sõnade kogumiks, mida seadmed saavad omavahel kasutada. Kuna võrk on nii lihtne, pole palju öelda ja seega saame neid kolme signaali kujutada lihtsate täisarvuväärtustega.

0. Lähtesta

  • Identifikaator koodis: SIG-R
  • Täisarv: 0
  • Eesmärk: öelge kõikidele levialas olevatele seadmetele, et nad loobuksid oma tegemistest ja käituksid nagu oleks need lihtsalt käivitatud. Kui see signaal jõuab igasse võrguseadmesse, lähtestatakse kogu võrk ja kasutajad saavad alustada uut mängu. Seda signaali saab edastada ainult juurseade.

1. Teisendus A

  • Identifikaator koodis: SIG-A
  • Täisarv: 1
  • Eesmärk: öelge igale seadmele, mis on olekus LISTEN_A, pärast konversioonisignaali vastuvõtmist olekule TEAM_A.

2. Teisendus B

  1. Identifikaator koodis: SIG-B
  2. Täisarv: 2
  3. Eesmärk: öelge igale seadmele, mis on olekus LISTEN_B, pärast konversioonisignaali vastuvõtmist olekule TEAM_B.

Samm: tahame juhtida seadme toiminguid selle praeguse oleku alusel

Soovime juhtida seadme toiminguid selle praeguse oleku põhjal
Soovime juhtida seadme toiminguid selle praeguse oleku põhjal
Soovime juhtida seadme toiminguid selle praeguse oleku alusel
Soovime juhtida seadme toiminguid selle praeguse oleku alusel
Soovime juhtida seadme toiminguid selle praeguse oleku põhjal
Soovime juhtida seadme toiminguid selle praeguse oleku põhjal

Lõpuks saame hakata koodi kirjutama.

Esiteks avage Make Code'is uus projekt

  • Looge uus funktsioon. Helistasin mine loopile, sest see on rakenduse tuum
  • Lisage silmusplokk, mis kordub lõputult. Kasutasin samas (tõene), sest sõnasõnaline tõene ei ole kunagi vale, seega ei välju rakenduse juhtimisvoog silmusest kunagi
  • Lisage piisavalt if-else plokke, et kontrollida, kas seade on viiest võimalikust olekust
  • Looge seadme praeguse oleku hoidmiseks muutuja
  • Looge muutujad, mis esindavad kõiki viit võimalikku olekut

    Märkus: On OK, et nendel muutujatel pole veel määratud väärtusi. Jõuame selleni. Siinkohal on olulisem, et me kirjutaksime puhta ja kergesti loetava koodi

  • Muutke plokkide if-else iga tingimust, et võrrelda praegust olekut ühe võimaliku olekuga
  • Lisage if-else-plokkide allosas paus mõne millisekundi jaoks ja looge selle numbri hoidmiseks muutuja. Me lähtestame selle hiljem. Veenduge, et muutujal oleks kirjeldav nimi, näiteks puuk või südamelöögid. Kuna see on seadme põhisilmus, määrab see paus kiiruse, millega seade käivitab põhiahela, seega on see väga oluline väärtus ja liiga tähtis, et olla maagiline number ilma nimeta.

Märkus. Ärge muretsege kolmanda pildi hallide plokkide pärast. Nende juurde jõuan hiljem.

Samm: tahame kasutaja sisendile reageerida

Tahame kasutaja sisendile reageerida
Tahame kasutaja sisendile reageerida
Tahame kasutaja sisendile reageerida
Tahame kasutaja sisendile reageerida

Nüüd tahame seadmele öelda, kuidas nupuvajutusi käsitseda. Esimene mõte võib olla lihtsalt sisestuskategooria plokkide "Kui nuppu vajutatakse" kasutamine, kuid me tahaksime sellest täpsemat juhtimist. Kasutame täpsema jaotise juhtkategooria plokki "on event from (X) with value (Y)", kuna oleme selles õpetuses edasijõudnud.

  • Looge neli plokki "sündmuse kohta …".

    • Kaks neist peaksid kontrollima sündmuse allikat "MICROBIT_ID_BUTTON_A"
    • Kaks neist peaksid kontrollima sündmuse allikat "MICROBIT_ID_BUTTON_B"
    • Kahest sündmusest, mis sihivad kumbagi nuppu:

      • Tuleks kontrollida sündmuse tüüpi "MICROBIT_BUTTON_EVT_UP"
      • Tuleks kontrollida sündmuse tüüpi "MICROBIT_BUTTON_EVT_DOWN"
    • Märkus. Need suure algustähega valikud on sildid, mida kasutatakse madalama taseme mikro: bitkoodis. Need on lihtsalt kohatäited, mis asendatakse hiljem täisarvudega, kui kood kompileeritakse käivitatavale binaarfailile. Inimestel on neid silte lihtsam kasutada kui otsida, milline täisarv sisestada, kuigi mõlemad toimiksid samamoodi.
  • Valisin stiili mõttes, et iga plokk „on event from…” kutsuks üles funktsiooni, mis kirjeldab tõstetud sündmust. Kuigi see pole tingimata vajalik, parandab see minu arvates loetavust. Kui keegi soovib seda teha, saavad nad sündmuste käitlemise koodi sisestada ploki "on event from …" sisse.

    Märkus. Koodiplokki, mis haldab seadme vastust sündmusele, nimetatakse intuitiivselt "sündmuste käitlejaks"

  • Lisage igale sündmuste käitlejale sama if-else struktuur, mida kasutati juhtimisvoo jagamiseks seadme oleku alusel, nagu põhiseisundi struktuur.
  • Lisage määramisplokid, mis muudavad seadme olekut vastavalt meie olekudiagrammile

    • Me teame, et kui seade on olekus UNASSIGNED, peaks seade reageerima nupule A, mida vajutatakse üleminekule olekule LISTEN_A, ja nupule B, mida vajutab üleminek olekule LISTEN_B
    • Samuti teame, et kui seade on olekus LISTEN_A või LISTEN_B, peaks seade reageerima vastavalt vabastatud nupule A ja nupule B, minnes tagasi olekusse UNASSIGNED.
    • Lõpuks teame, et kui seade on olekus TEAM_A või TEAM_B, peaks seade reageerima vajutatud nupule A ja nupule B, edastades vastavalt SIG_A ja SIG_B.

      Sel hetkel ei ole vaja signaalide edastamise üksikasju täita. Selleni jõuame hiljem. Oluline on see, et juhendame neid funktsioone kasutama koodi, mille me kirjutame, andes sellele toimingute plokile nime, näiteks broadcastSignalSIG_A, mis kirjeldab, mida sel hetkel teha tuleks

Samm: tahame lähtestada andmete väärtused seadmete mälus, kui seade käivitub

Tahame lähtestada seadme mällu andmete väärtused, kui seade käivitub
Tahame lähtestada seadme mällu andmete väärtused, kui seade käivitub
Tahame lähtestada seadme mällu andmete väärtused, kui seade käivitub
Tahame lähtestada seadme mällu andmete väärtused, kui seade käivitub
Tahame lähtestada seadme mällu andmete väärtused, kui seade käivitub
Tahame lähtestada seadme mällu andmete väärtused, kui seade käivitub

Praegu oleme kasutanud palju muutujaid (andmete nimed), kuid tegelikult ei ole neile nimedele väärtusi omistanud. Soovime, et seade laadiks käivitamisel kõigi nende muutujate väärtused mällu, nii et asetame nende muutujate initsialiseerimise käivitusplokki.

Need väärtused peame lähtestama:

  • Signaalikonstandid vastavalt signaaliprotokollile. Väärtused PEAVAD olema järgmised:

    • SIG_R = 0
    • SIG_A = 1
    • SIG_B = 2
    • Märkus: lisasin neile konstantidele märke "EnumSignals", et märkida, et need muutujad peavad käituma nii, nagu oleksid nad osa loetletud tüübist, mida nimetatakse signaalideks. Nii saab neid muutujaid rakendada teistes programmeerimiskeeltes. Loetletud tüüpide määratlus ja selgitus jääb minu õpetuse raamest välja. Googeldada võib, kui nad seda soovivad. Need eesliited on lihtsalt stiililised valikud ja pole programmi nõuetekohaseks toimimiseks üldse olulised.
  • Olekukonstandid, mis võivad olla suvalised, kui neil on väärtus. Tegin stiilivaliku, et kasutada lihtsalt 0 -st kasvavaid täisarve, näiteks nii:

    • MÄÄRAMATA = 0
    • LISTEN_A = 1
    • LISTEN_B = 2
    • TEAM_A = 3
    • TEAM_B = 4
    • Märkus: tegin sama stiiliotsuse ka nende muutujate eesliidete osas. Lisaks mainin, et kõik nende ülesannete, väärtuste ja järjekorra kohta on täiesti meelevaldne. Pole isegi oluline, et need väärtused oleksid seadmetelt järjepidevad, sest neid kasutatakse ainult sisemiselt, mitte võrgu kaudu suhtlemiseks. Tähtis on vaid see, et muutujatel oleks väärtus ja neid saaks üksteisega võrrelda, et näha, kas need on samaväärsed või mitte.
  • Loetavuse huvides konstant BOOT_STATE ja määrake see UNASSIGNED. See muudab asjaolu, et lähtestame suvalisema oleku asemel alglaadimise olekusse, selgemalt, kui seade saab lähtestamissignaali, mille rakendame hiljem.
  • Animatsioonikonstandid, mida kasutatakse järgmises etapis animatsioonide loomiseks, mis võimaldavad kasutaja sisendi kaudu äärmiselt väikese latentsusajaga katkestusi. Me pole neid siiani kasutanud, kuid järgmises osas neid kindlasti selgitatakse ja kasutatakse. Mõne neist tähendus peaks nende nimede tõttu olema intuitiivne.

    • 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
  • Veel üks animatsiooni muutuja, seekord loendur, mis pole kindlasti konstantne. Nagu enamik loendureid, lähtestame selle väärtuseks 0

    iTickLoadingAnimation = 0

  • Animatsioonide kaadrite hoidmiseks looge kaks muutujate seeriat. Esimesel, mida ma nimetan "laadimisanimatsiooniks", peaks olema neli pilti (mida võisite arvata viimase pideva initsialiseerimise järgi) ja teisel, mida ma nimetan "ringhäälingu animatsiooniks", millel peaks olema kolm pilti. Soovitan nimetada muutujad, et need vastaksid animatsiooni kaadritele, nt. ringAnimation0, ringAnimation1…

    Loo samad pildiväärtused nagu mina või loo originaalsemaid ja lahedamaid pilte

  • Viimaseks, kuid mitte vähem tähtsaks, peame seadistama seadme raadiogrupi väärtuseks 0, kasutades "raadiovõrgu rühma (X)" plokki
  • Soovi korral kirjutage jadaväljundisse teade „Initsialiseerimine lõpule viidud”, et kasutajale öelda, et kõik läks sujuvalt.
  • Nüüd, kui oleme seadme seadistamise lõpetanud, võime helistada oma olekusilmuse funktsioonile.

Samm: tahame animatsioone ja graafikat kuvada 5 x 5 LED -ekraani abil

Soovime kuvada animatsioone ja graafikat 5 x 5 LED -ekraani abil
Soovime kuvada animatsioone ja graafikat 5 x 5 LED -ekraani abil
Soovime kuvada animatsioone ja graafikat 5 x 5 LED -ekraani abil
Soovime kuvada animatsioone ja graafikat 5 x 5 LED -ekraani abil
Soovime kuvada animatsioone ja graafikat 5 x 5 LED -ekraani abil
Soovime kuvada animatsioone ja graafikat 5 x 5 LED -ekraani abil

Ja nüüd hoopis teistsuguseks.

Tahame kuvada mõningaid animatsioone ja paari märki, kuid ei taha katkestada põhiseisundit. Kahjuks on pilte ja teksti stringe kuvavate plokkide vaikimisi viivitus 400 ms. Seda ei saa kuidagi muuta ilma koodi JavaScripti esitusviisi muutmata. Niisiis, me teeme seda.

  • Looge iga pildi jaoks funktsioon. See võimaldab pildi kuvamiseks kasutada ühte plokki, selle asemel, et iga kord JavaScripti redigeerida. Selles konkreetses programmis ei kasutata ühtegi pilti rohkem kui üks kord, kuid arvan siiski, et see stiil muudab koodi lugemise lihtsamaks.
  • Lisage igasse uude funktsiooni "plokk" näita pilti (X) nihkega 0 ", asendades vastava pildimuutuja nime (X)
  • Lisa põhiseisundis. "Näita stringi (X)" plokke igale plokile peale selle, mis käsitleb olekut UNASSIGNED. Lisage seadme kuvamiseks märk, mis näitab selle erinevaid olekuid. Siin on, mida ma tegin:

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

      Oleku UNASSIGNED korral helistage funktsioonile, mis värskendab laadimisanimatsiooni. Selle funktsiooni üksikasjad täidame allpool

  • Lülitu javascripti režiimile.
  • Leidke iga kõne X.showImage (0) ja basic.showString (X)
  • Muutke igaüks kas X.showImage (0, 0) või basic.showString (X, 0)

    • Selle täiendava argumendi lisamine määrab toimingujärgse viivituse väärtuseks 0. Vaikimisi jäetakse see välja ja seade peatub 400 ms pärast iga sellise ploki täitmist.
    • Nüüd on meil piltide kuvamiseks animatsiooniplokkides peaaegu latentsusvaba mehhanism, mille saame nüüd luua

Esiteks ehitame suhteliselt lihtsa ringhäälingu animatsioonifunktsiooni. See on lihtsam, sest me ei taha, et kasutaja saaks midagi teha enne, kui funktsioon on lõpule jõudnud, et takistada neil edastusfunktsiooni rämpsposti saatmist. Selle saavutamiseks võime lihtsalt hoida kontrollvoogu piiratud plokiga, kuni funktsioon on lõpetatud, mis on tavapärane käitumine.

  • Looge funktsioon, mis kuvab ringhäälingu animatsiooni.
  • Lisage selle ploki sisse kolm funktsioonikutset, üks animatsiooni igale kaadrile, nende kuvamise järjekorras
  • Lisage piltide kuvamise funktsioonile iga kõne järel plokk "oota (meie) (X)".

    Märkus. See täiustatud juhtimise sektsiooni plokk läheb isegi kaugemale kui "paus (ms)", kuna see külmutab protsessori täielikult, kuni määratud aeg on möödas. Pausiploki kasutamisel on võimalik, et seade täidab kaadri taga muid ülesandeid. Ootamisploki abil on see võimatu

  • Asenda (X) tekstiga (MS_PER_FRAME_BROADCAST_ANIMATION x MICROSECONDS_PER_MILLISECOND)
  • Animatsioon peaks nüüd korralikult toimima

Teiseks ehitame üles laadimisanimatsiooni kuvamise mehhanismi. Selle idee on värskendada LED -ekraani kindla intervalliga, mille määratleme muutuja MS_PER_DEVICE_TICK. See väärtus, seadme puugi pikkus, on millisekundite arv, mille seade peatab pärast olekusilmuse iga iteratsiooni lõpetamist. Kuna see väärtus on piisavalt väike, saame ekraani värskendada üks kord iga kuvamisahela iteratsiooni ajal ja kasutajale näib, et animatsioon edeneb sujuvalt ning oleku muutudes on kasutaja sisendi vahel väga väike latentsusaeg kuvarit uuendatakse. Lugedes puuke, mida teeme muutujaga iTickLoadingAnimation, saame kuvada animatsiooni sobiva kaadri.

  • Looge funktsioon, mis värskendab laadimisanimatsiooni
  • Lisage tingimus, et kontrollida, kas puugiloendur on saavutanud oma maksimaalse väärtuse. See tingimus on tõene, kui puugiloenduri väärtus on suurem kui laadimisanimatsiooni kaadrite arv korrutatuna iga kaadri kuvamiseks märgitud puukide arvuga

    Kui tingimus on tõene, lähtestage iTickLoadingAnimation väärtuseks 0

  • Lisage if-else tingimuste plokk. Need määravad, millist animatsiooni kaadrit kuvada.

    Kui linnukese loendur on animatsiooni iga kaadri korral väiksem kui puukide arv igas animatsioonis korrutatuna animatsiooni kaadrinumbriga (alates 1 -st), siis kuvage see kaader, muidu kontrollige, kas järgmine kaader on kuvatakse

  • Ploki allosas suurendage iTickLoadingAnimation
  • Animatsioon peaks nüüd korralikult toimima

Märkus. Kõik minu näites ilmuvad hallid plokid luuakse ploki JavaScripti esitusviisi redigeerimisel. See tähendab lihtsalt seda, et plokk tähistab JavaScripti koodi, mida ei saa standardplokkide komplekti abil esitada ja mida tuleb teksti kujul muuta.

Samm: tahame seadme raadio abil andmeid juhtmevabalt edastada

Soovime seadme raadio abil andmeid juhtmevabalt edastada
Soovime seadme raadio abil andmeid juhtmevabalt edastada

See samm on palju lühem kui eelmine. Tegelikult on see ilmselt kogu selle õpetuse lühim samm.

Tuletame meelde, et kui me programmeerisime seadme vastuse kasutaja sisendile, oli mul ekraanipildil kaks plokki, mida selles osas ei selgitatud. Need olid kõned funktsioonidele, mis saadavad raadio kaudu signaale. Täpsemalt:

  • Vajutati nuppu A:

    • Kui seade on olekus TEAM_A:

      Eetrisignaal SIG_A

  • Vajutati nuppu B:

    • Kui seade on olekus TEAM_B

      Eetrisignaal SIG_B

Looge need funktsioonid, kui neid juba pole.

Igas funktsioonis:

  • Helistage ringhäälingu animatsioonifunktsioonile. See blokeerib millegi muu toimumise kuni selle valmimiseni, mis toimub MS_PER_FRAME_BROADCAST_ANIMATION * 3 = 1,5 sekundi pärast. Konstant korrutatakse kolmega, kuna animatsioonis on kolm kaadrit. See on meelevaldne ja võib lisada rohkem, kui esteetiline uuendus on piisavalt suur. Selle animatsiooni teine eesmärk on takistada kasutajal edastusfunktsiooni rämpsposti saatmist.
  • Lisage plokk "raadiosaatmisnumber (X)", kus on funktsiooni nimes mainitud signaalikonstant

See on kõik, mida peab raadio kaudu edastama.

Samm: tahame seadme raadio kaudu andmeid kuulata ja vastu võtta ning neid vastavalt töödelda

Tahame seadme raadio kaudu andmeid kuulata ja vastu võtta ning neid vastavalt töödelda
Tahame seadme raadio kaudu andmeid kuulata ja vastu võtta ning neid vastavalt töödelda
Tahame seadme raadio kaudu andmeid kuulata ja vastu võtta ning neid vastavalt töödelda
Tahame seadme raadio kaudu andmeid kuulata ja vastu võtta ning neid vastavalt töödelda

See on põhirakenduse loomise viimane samm.

Me ütleme seadmele, kuidas sissetulevaid raadiosignaale töödelda. Esiteks nimetab meie seade vastuvõetud signaali. Seejärel otsustab ta selle signaali väärtuse põhjal, milliseid meetmeid võtta, kui neid on.

Esiteks:

  1. Looge koodiplokk, mis algab plokiga "raadiosaatmisel (X)".
  2. Soovi korral määrake saadud väärtus teisele kirjeldavama nimega muutujale.
  3. Helistage funktsioonile, mis signaali töötleb

Teiseks, signaalitöötlusfunktsioonis:

  1. Looge if-else lausete plokk, mis hargneb voolu vastavalt signaali väärtusele.
  2. Kui signaal oli SIG_R

    Seadke seadme olekuks BOOT_STATE (sellepärast lõime selle konstandi varem)

  3. Kui signaal oli SIG_A ja praegune olek on LISTEN_A

    Seadke seadme olekuks TEAM_A

  4. Kui signaal oli SIG_B ja praegune olek on LISTEN_B

    Seadke seadme olekuks TEAM_B

See on kõik. Taotlus on lõpetatud.

Samm: juurseade: tahame olla võimelised signaali valima

Juurseade: tahame osata signaali valida
Juurseade: tahame osata signaali valida

Nüüd kirjutame lihtsa rakenduse "root" seadmele, see tähendab seadmele, mis juhib võrku.

See seade peab täitma kahte funktsiooni:

  • Tahame lubada kasutajal valida ühe meie signaalidest
  • Tahame lubada kasutajal signaali edastada

Kuna selle rakenduse spetsifikatsioon on eelneva alamhulk, annan ülevaate, kuid ma ei süvene nii üksikasjalikult kui varem. Ülaltoodud pilt sisaldab selle rakenduse täielikku koodi.

Signaali valimiseks kasutajal toimige järgmiselt.

  1. Initsialiseeri 5 muutujat käivitusplokis:

    1. Kolm signaali (0, 1, 2)
    2. Signaalide arv (3)
    3. Muutuja, mis hoiab parajasti valitud signaali (algselt seatud esimesele signaalile, 0)
  2. Vajutage nuppu A:

    1. Suurendage valitud signaali
    2. Kontrollige, kas valitud signaal on suurem või võrdne signaalide arvuga

      Kui jah, seadke valitud signaal väärtuseks 0

  3. Pärast käivitusplokki käivitage "igavesti" tsükkel, mis kuvab viivitamata praeguse valitud signaali väärtuse

Et võimaldada kasutajal signaali edastada

  1. Seadke raadioside rühm "käivitamisel" 0 -le
  2. Vajutage nuppu B:

    Edastage valitud signaal ploki "raadiosaatmisnumber (X)" abil

See on kõik. Juursõlme rakendus on äärmiselt lihtne.

10. samm: oleme lõpetanud

Oleme valmis
Oleme valmis

Ülal on pilt rakendust käitavatest seadmetest. Kaks parempoolset käitavad peamist "kasutaja" rakendust ja vasakul olev "root" rakendust.

Demonstreerisin seda mängu CS Connections 2018-l, mis on nädala pikkune suvekonverents kesk- ja keskkooliõpetajatele informaatikahariduse teemal. Andsin õpetajatele välja umbes 40 seadet ja selgitasin reegleid. Enamik pidas mängu meelelahutuslikuks ja paljud pidasid seda segaseks, kuni said aru, kuidas mängida. Demonstratsioon oli lühike, kuid leidsime, et mäng on üsna mitmekesise rahvahulga seas nauditav.

Lisateavet CS Connections 2018 kohta leiate siit.

Soovitan: