Мазмұны:
- 1 -қадам: Үлкен сурет дизайнына қатысты ойлар
- 2 -қадам: Сигнал протоколы: желілік байланыстың қарапайым тілі
- 3 -қадам: Біз құрылғының әрекетін оның қазіргі күйіне қарай басқарғымыз келеді
- 4 -қадам: Біз пайдаланушылардың енгізуіне жауап бергіміз келеді
- 5 -қадам: Құрылғы жүктелген кезде біз құрылғылардың жадындағы деректердің мәнін инициализациялауды қалаймыз
- 6 -қадам: Біз 5 X 5 жарықдиодты дисплейдің көмегімен анимация мен графиканы көрсеткіміз келеді
- 7 -қадам: Біз деректерді құрылғы радиосын пайдаланып сымсыз жеткізгіміз келеді
- 8 -қадам: Біз құрылғының радиосы арқылы деректерді тыңдағымыз және алғымыз келеді және оны сәйкес өңдейміз
- 9 -қадам: Түбірлік құрылғы: Біз сигналды таңдай аламыз
- 10 -қадам: Біз аяқтадық
Бейне: Желілік бәсекелестік: BBC Micro үшін төмен кідіріс ойыны: бит: 10 қадам (суреттермен)
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:24
Бұл оқулықта мен келесі мүмкіндіктермен BBC micro: bit -те негізгі көп ойыншы ойынын қалай енгізу керектігін түсіндіремін:
- Қарапайым интерфейс
- Түймені басу мен экранды жаңарту арасындағы төмен кідіріс
- Қатысушылардың икемді саны
- Негізгі қашықтан басқару құралы («түбірлік») көмегімен ойынды оңай басқару
Бұл ойын саясаттың симуляциясы. Барлық ойыншылар екі ойыншыны қоспағанда, кез келген командаға тағайындалмай басталады. Бұл ойыншылардың бірі А тобына, ал екіншісі В тобына тағайындалған.
Ойынның мақсаты - әр ойыншының барлық ойыншылардың көпшілігі бар командада болу.
Жоғарыдағы диаграмма соңғы күйдегі машинаны көрсетеді, яғни құрылғы болуы мүмкін күйлердің сипаттамасы және сол күйлер арасындағы ауысулар.
Күйді құрылғы қосылғаннан бері оның жадын сипаттайтын ағымдағы мәліметтер жиынтығы деп санауға болады. Осы мәліметтерге сүйене отырып, құрылғы белгілі бір әрекеттерді орындай алады немесе пайдаланушының енгізуіне басқаша жауап береді.
Ауысу - бұл логикалық шарт, егер ол рас болса, құрылғыны күйін өзгертуге әкеледі. Көшу бір күйден кез келген күйге ауысуы мүмкін. Мемлекетте бірнеше ауысулар болуы мүмкін.
Жоғарыдағы диаграмма келесі күйлерді көрсетеді:
- Тағайындалмады
- А тыңдаңыз
- Б тыңдаңыз
- А командасы
- B тобы
Ойын кодымен жұмыс істейтін құрылғы осы бес күйдің кез келгенінде болуы мүмкін, бірақ бір уақытта, тек осы бесеу.
Нұсқаулықта сіз Microsoft -тың MakeCode редакторын қолданасыз деп ойлаймын, оны мына жерден табуға болады:
Ойынның толық орындалуын мына жерден табуға болады:
makecode.microbit.org/_CvRMtheLbRR3 («microbit-demo-user»-бұл жобаның атауы)
Негізгі («түбірлік») желілік контроллердің орындалуын мына жерден табуға болады:
makecode.microbit.org/_1kKE6TRc9TgE («microbit-demo-root»-жобаның атауы)
Мен бұл мысалдарға оқулық бойы жүгінемін.
1 -қадам: Үлкен сурет дизайнына қатысты ойлар
Кез келген кодты жазбас бұрын, біздің түпкі өніміміз қандай болатынын ойлауымыз керек. басқаша айтқанда, өтінімге қандай талаптар қойылады? Біздің код құрылғы аяқталғаннан кейін не істеу керектігін айтуы керек? Мен негізгі қосымшаның функционалдығын алты категорияға бөлдім, олардың әрқайсысын әр түрлі дизайн тұрғысынан қарастыруға болады.
- Біз құрылғының әрекетін оның қазіргі күйіне қарай басқарғымыз келеді
- Біз құрылғы пайдаланушының енгізуіне жауап беруін қалаймыз
- Біз 5 x 5 жарықдиодты дисплейдің көмегімен анимация мен графиканы көрсеткіміз келуі мүмкін
- Біз құрылғы жүктелген кезде деректер жадын инициализациялауды қалаймыз
- Біз деректерді құрылғы радиосын пайдаланып сымсыз жеткізгіміз келеді
- Біз құрылғы радиосы арқылы деректерді тыңдағымыз және қабылдағымыз келеді және оны сәйкес өңдегіміз келеді
Әрқайсысы туралы толығырақ айтуға рұқсат етіңіз.
1. Біз құрылғының әрекетін оның қазіргі күйіне қарай басқарғымыз келеді
Басқа бағдарламалар сияқты, кодта көрсетілген нұсқаулықтардың орындалуы бір жолдан тұрады. Біз бұл оқулықтың жоғарғы жағындағы диаграммада көрсетілгендей, біздің құрылғының ішкі күйіне байланысты белгілі бір нұсқауларды орындағанын қалаймыз. Біз құрылғыны тексеретін әрбір код блогынан кейін шартты серияларды жаза аламыз, бірақ бұл тәсіл өте тез бұзылуы мүмкін, сондықтан біз оның орнына айнымалы мәнді тексеретін шексіз циклды қолданатын боламыз., нұсқаулардың нақты жиынтығын орындайды немесе мүлде ештеңе жасамайды. Бұл айнымалыны қолданушы қосымшамызда да, түбірлі қосымшамызда да «_state» жұрнағы арқылы анықтайды.
2. Біз құрылғының пайдаланушы енгізуіне жауап беруін қалаймыз
Кодтың жүйелі түрде орындалуына қарамастан, яғни бір жолда, біздің құрылғы түймені басуға жауап беруі керек, ал негізгі күй циклы құрылғы кез келген уақытта не істеу керектігін анықтайды. Осы мақсатта құрылғы аппараттық құралдармен өзара әрекеттесетін төменгі деңгейдегі бағдарламалық қамтамасыз етуге сигнал жіберу мүмкіндігіне ие болады, бұл оқиға деп аталады. Біз құрылғыға оқиғаның белгілі бір түрін анықтаған кезде бірдеңе істеуін айтатын код жаза аламыз.
3. Біз 5 x 5 жарықдиодты дисплейдің көмегімен анимация мен графиканы көрсеткіміз келеді
Мұны істеу механизмі қарапайым болып көрінеді, бірақ кескінді көрсету блогы 400 мс жасырын кідірісті қосады. Біз құрылғымыздың күй циклін мүмкіндігінше аз кідіріспен жалғастыруын қалайтындықтан, кешігуді азайту үшін JavaScript кодын өңдеу қажет болады.
4. Құрылғы жүктелген кезде, біз құрылғының жадындағы деректер мәндерін инициализациялауды қалаймыз
Біздің құрылғы бірдеңе жасамас бұрын, қолданба деректерді жадқа жүктеуі керек. Бұған кодтың оқылуы үшін аталған тұрақты айнымалылар, анимацияның бөлігі болуы мүмкін суреттері бар айнымалылар және дұрыс жұмыс істеу үшін 0 -ден басталуы қажет есептегіш айнымалылар кіреді. Біз айнымалы атаулардың және олардың жаңадан тағайындалған мәндерінің ұзақ тізімімен аяқтаймыз. Жеке стиль таңдауы ретінде мен ALL_CAPS көмегімен тұрақты мәндерді, яғни ешқашан өзгертуге болмайтын мәндерді белгілеймін. Мен сондай -ақ негізгі айнымалы идентификаторларға санат атауы бар префиксті қоямын, ол идентификаторға жататын объект немесе түрге жатады. Бұл кодты орындауды жеңілдету үшін. Мен кодты шешуге тырысқанда туындайтын түсініксіздікке байланысты «элемент» немесе «х» сияқты айнымалы атауды ешқашан қолданбаймын.
5. Біз деректерді құрылғы радиосын пайдаланып сымсыз жеткізгіміз келеді
Бұл MakeCode блоктар тілін қолдануда өте қарапайым тапсырма. Біз барлық құрылғыларды жүктеу кезінде бір радио тобына қоямыз, содан кейін сигнал жібергіміз келсе, бізге берілген «Радио жіберу нөмірі» блогына бір нөмірді жібере аламыз. Жіберуші мен қабылдаушының бір радио топта жұмыс істегені маңызды, себебі олай болмаған жағдайда олар әр түрлі жиіліктерде жібереді немесе қабылдайды, ал байланыс сәтсіз болады.
6. Біз құрылғының радиосы арқылы деректерді тыңдағымыз және қабылдағымыз келеді және оны сәйкес өңдегіміз келеді
Алдыңғы тармақта айтылғандарды ескере отырып, біз кіріс жіберулерді қолданушылардың енгізулерін тыңдайтындай тыңдайтын боламыз: оқиға өңдегішпен. Біз кез келген кіріс сигналдарын тексеретін және негізгі күй циклін бұзбай, қандай да бір әрекеттің жасалатынын тексеретін код блогын жазамыз.
Сонымен қатар, біз құрылғыға бүкіл желіні басқаруға мүмкіндік беретін бағдарламаның қарапайым түбірлік қосымшасының дизайнын қысқаша қарастыруымыз керек. Мен бұған көп уақыт жұмсамаймын, себебі бұл жоғарыда көрсетілген дизайннан әлдеқайда қарапайым және оның көп бөлігі қайталау. Мен түбірлік сүйектің функционалдығын үш санатқа бөлдім.
- Біз сигналды таңдай аламыз
- Біз сигналды жібергіміз келеді
-
1. Біз сигналды таңдай білгіміз келеді
Мұны мүмкін сигналдар арқылы қайталанатын батырманың көмегімен жасауға болады. Тек үшеуі болғандықтан, бұл әдіс жеткілікті болады. Сонымен бірге бізде таңдалған сигналды үнемі қайта көрсететін цикл болуы мүмкін, бұл пайдаланушыға түймені басуға және таңдалған сигналдың LED дисплейінде өте аз кідіріспен пайда болуын көруге мүмкіндік береді.
2. Біз сигналды жібере алғымыз келеді
Екі түйме болғандықтан, біз біреуін таңдау үшін, екіншісін растау үшін тағайындай аламыз. Қолданушы қосымшасы сияқты біз де сигналды желі арқылы нөмір ретінде жібереміз. Басқа ақпарат қажет емес.
Келесі бөлімде қарапайым сигнал протоколы туралы толығырақ айтатын боламын.
2 -қадам: Сигнал протоколы: желілік байланыстың қарапайым тілі
Келесі сигналдарды құрылғылар бір -бірімен сөйлесу үшін қолданатын барлық мүмкін сөздердің жиынтығы ретінде қарастыруға болады. Желі өте қарапайым болғандықтан, көп нәрсе айтуға болмайды, сондықтан біз бұл үш сигналды қарапайым бүтін мәндермен көрсете аламыз.
0. Қалпына келтіру
- Кодтағы идентификатор: SIG-R
- Бүтін мән: 0
- Мақсаты: Қондырғыдағы барлық құрылғыларға не істеп жатқандарын тастап, жаңа ғана іске қосылған сияқты әрекет етулерін айтыңыз. Егер бұл сигнал желідегі әрбір құрылғыға жетсе, бүкіл желі қалпына келтіріледі және пайдаланушылар жаңа ойынды бастай алады. Бұл сигнал тек түбірлік құрылғы арқылы таратылуы мүмкін.
1. Конверсия А
- Кодтағы идентификатор: SIG-A
- Бүтін мән: 1
- Мақсаты: LISTEN_A күйіндегі кез келген құрылғыға, олар түрлендіру сигналын алғаннан кейін, TEAM_A күйіне ауысуды айтыңыз.
2. Конверсия В
- Кодтағы идентификатор: SIG-B
- Бүтін мән: 2
- Мақсаты: LISTEN_B күйіндегі кез келген құрылғыға, олар түрлендіру сигналын алғаннан кейін, TEAM_B күйіне ауысуды айтыңыз.
3 -қадам: Біз құрылғының әрекетін оның қазіргі күйіне қарай басқарғымыз келеді
Ақырында, біз кодты жаза бастаймыз.
Алдымен Make Code ішінде жаңа жоба ашыңыз
- Жаңа функция жасаңыз. Мен кеніш деп атадым, себебі бұл қосымшаның негізгі циклы
- Белгісіз қайталанатын цикл блогын қосыңыз. Мен «true» қолдандым, себебі тура шындық ешқашан жалған болмайды, сондықтан қолданбаның басқару ағыны ешқашан циклден шықпайды.
- Құрылғының мүмкін болатын бес күйінің кез келгенін тексеру үшін жеткілікті if-else блоктарын қосыңыз
- Құрылғының ағымдағы күйін сақтау үшін айнымалыны жасаңыз
-
Мүмкін болатын бес күйдің әрқайсысын көрсету үшін айнымалылар жасаңыз
Ескерту: Бұл айнымалыларда әлі тағайындалған мәндер жоқ. Біз бұған жетеміз. Бұл кезде таза, оқуға оңай код жазғанымыз маңызды
- If-else блоктарындағы әрбір шартты ағымдағы күйді ықтимал күйлердің бірімен салыстыру үшін өзгертіңіз
- If-else блоктарының төменгі жағында бірнеше миллисекундқа үзіліс қосыңыз және сол санды ұстайтын айнымалы мәнді жасаңыз. Біз оны кейінірек инициализациялаймыз. Айнымалының кене немесе жүрек соғысы сияқты сипаттамалық атауы бар екеніне көз жеткізіңіз. Бұл құрылғының негізгі циклы болғандықтан, бұл кідіріс құрылғының негізгі циклды орындау жылдамдығын анықтайды, сондықтан бұл өте маңызды мән және аты жоқ сиқырлы сан болу үшін тым маңызды.
Ескерту: Үшінші суреттегі сұр блоктар туралы алаңдамаңыз. Мен оларға кейінірек жетемін.
4 -қадам: Біз пайдаланушылардың енгізуіне жауап бергіміз келеді
Енді біз құрылғыға түймені басуды қалай басқаруға болатынын айтқымыз келеді. Бірінші ой - енгізу санатындағы «Түйме басылған кезде» блоктарын пайдалану ғана болуы мүмкін, бірақ біз одан гөрі түйіршікті басқаруды қалаймыз. Біз кеңейтілген бөлімдегі басқару санатындағы «(X) мәні (Y) бар» оқиғасын қолданамыз, өйткені біз осы оқулықта жетілдірілгенбіз.
-
«Оқиғадан …» төрт блогын жасаңыз.
- Олардың екеуі «MICROBIT_ID_BUTTON_A» оқиға көзін тексеруі керек
- Олардың екеуі «MICROBIT_ID_BUTTON_B» оқиға көзін тексеруі керек
-
Әр түймеге бағытталған екі оқиғаның ішінде:
- «MICROBIT_BUTTON_EVT_UP» түріндегі оқиғаны тексеру керек
- «MICROBIT_BUTTON_EVT_DOWN» түріндегі оқиғаны тексеру керек
- Ескерту: Бұл опциялар барлық бас әріптермен төменгі деңгейдегі микро: бит кодында қолданылатын белгілер болып табылады. Олар жай толтырғыштар, кейін код орындалатын екілік файлға құрастырылғанда бүтін сандармен ауыстырылады. Адамдарға бұл таңбаларды қолдану қай бүтін санды қоюды іздеуден гөрі оңай, бірақ екеуі де бірдей жұмыс істейтін болады.
-
Мен стилі бойынша әрбір «оқиғадан …» блоктық шақыруды көтерілген оқиғаны сипаттайтын функцияны таңдадым. Қажет болмаса да, бұл менің оқуды жақсартады. Егер біреу қаласа, олар оқиғаны өңдеу кодын «on from event from …» блогының ішіне қоя алады.
Ескертпе: оқиғаға құрылғының жауабын өңдейтін код блогы интуитивті түрде «оқиғаларды өңдеуші» деп аталады
- Әр оқиға өңдегішке басқару күйін негізгі күй цикліндегі құрылым ретінде құрылғы күйіне байланысты бөлу үшін қолданылатын if-else құрылымын қосыңыз.
-
Біздің күй диаграммасында көрсетілгендей құрылғының күйін өзгертетін тағайындау блоктарын қосыңыз
- Біз білеміз, құрылғы ТАПСЫРЫЛМАҒАН күйде болғанда, құрылғы LISTEN_A күйіне ауысу арқылы басылған А түймесіне, ал LISTEN_B күйіне ауысу арқылы В түймесін басуға тиіс.
- Сондай -ақ, біз білеміз, LISTEN_A немесе LISTEN_B күйінде болғанда, құрылғы БАСАРЫЛМАҒАН күйге ауысу арқылы тиісінше босатылған А түймешігі мен В батырмасына босатылуы тиіс.
-
Ақырында, біз құрылғы TEAM_A немесе TEAM_B күйінде болған кезде, құрылғы тиісінше SIG_A трансляциясы арқылы басылған А түймесіне және В түймесіне жауап беруі керек екенін білеміз.
Бұл кезде сигнал тарату туралы мәліметтерді толтырудың қажеті жоқ. Біз бұған кейін жетеміз. Маңыздысы - біз бұл функцияларға сол кезде не істеу керектігін сипаттайтын radioSignalSIG_A сияқты атау беру арқылы жазатын кодты қолдануды тапсырамыз
5 -қадам: Құрылғы жүктелген кезде біз құрылғылардың жадындағы деректердің мәнін инициализациялауды қалаймыз
Бұл кезде біз көптеген айнымалыларды қолдандық (деректер атаулары), бірақ біз бұл атауларға мәндерді тағайындаған жоқпыз. Біз құрылғы жүктелген кезде осы айнымалы мәндердің барлығын жадқа жүктегенін қалаймыз, сондықтан біз осы айнымалылардың инициализациясын «іске қосу» блогына орналастырамыз.
Бұл инициализациялау керек мәндер:
-
Сигнал протоколы бойынша сигнал тұрақтылары. Мәндер МІНДЕТТІ:
- SIG_R = 0
- SIG_A = 1
- SIG_B = 2
- Ескерту: Мен бұл тұрақтыларға «EnumSignals» префиксін қойдым, бұл айнымалылар сигналдар деп аталатын тізімге енген сияқты әрекет ету керектігін білдіреді. Осылайша, бұл айнымалыларды басқа бағдарламалау тілдерінде қолдануға болады. Санамаланған түрлердің анықтамасы мен түсіндірмесі менің оқулықтан тыс. Егер олар қаласа, оны Google -ге жіберуге болады. Бұл префикстер тек стилистикалық таңдаулар болып табылады және бағдарламаның дұрыс жұмыс істеуі үшін қажет емес.
-
Мәні болғанша ерікті болуы мүмкін күй тұрақтылары. Мен 0 -ден өсетін бүтін сандарды пайдалану үшін стиль таңдадым, мысалы:
- ТАПСЫРЫЛмаған = 0
- LISTEN_A = 1
- LISTEN_B = 2
- TEAM_A = 3
- TEAM_B = 4
- Ескерту: Мен осы айнымалылардың префикстеріне қатысты бірдей стильді шешім қабылдадым. Сонымен қатар, мен бұл тапсырмалар, мәндер мен тәртіп туралы бәрі мүлдем ерікті екенін айтамын. Бұл мәндердің құрылғыдан құрылғыға сәйкес келуі маңызды емес, өйткені олар желі ішінде байланыс үшін емес, тек ішкі пайдаланылады. Маңыздысы - айнымалылардың мәні бар және оларды бір -бірімен салыстырып, олардың эквивалентті немесе сәйкес еместігін білу.
- Оқуға ыңғайлы болу үшін BOOT_STATE деп аталатын тұрақты және оны ТАПСЫРЫЛМАҒАН етіп орнатыңыз. Бұл құрылғы қалпына келтіру сигналын алған кезде неғұрлым еркін күйге емес, жүктеу күйіне қайта оралатындығымызды көрсетеді, біз оны кейінірек енгіземіз.
-
Келесі қадамда пайдаланушы енгізу арқылы өте төмен кідірісті үзуге мүмкіндік беретін анимация жасау үшін қолданылатын анимациялық тұрақтылар. Біз оларды осы уақытқа дейін қолданған жоқпыз, бірақ олар міндетті түрде келесі бөлімде түсіндіріледі және қолданылады. Олардың кейбіреулерінің атаулары интуитивті болуы керек.
- 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
-
Анимацияның тағы бір айнымалысы, бұл жолы тұрақты емес есептегіш. Көптеген есептегіштер сияқты біз оны 0 -ге инициализациялаймыз
iTickLoadingAnimation = 0
-
Анимация кадрларын ұстау үшін айнымалылардың екі сериясын жасаңыз. Мен «жүктеу анимациясы» деп атайтын біріншісінде төрт сурет болуы керек (сіз оны соңғы инициализация кезінде болжаған шығарсыз), ал екіншісінде мен «эфирлік анимация» деп атаймын, ол үш кескін болуы керек. Мен анимация кадрларына сәйкес келетін айнымалыларды атауды ұсынамын, мысалы. ringAnimation0, ringAnimation1…
Мен жасаған сурет мәндерін жасаңыз немесе көбірек түпнұсқалық және салқын суреттер жасаңыз
- Ақырында, біз «радио жинақ тобы (X)» блогы арқылы құрылғының радио тобын 0 -ге қоюымыз керек
- Қажет болса, пайдаланушыға бәрі өзгергенін айту үшін сериялық шығысқа «Инициализация аяқталды» хабарын жазыңыз.
- Енді біз құрылғыны баптауды аяқтағаннан кейін, біздің мемлекеттік цикл функциясын шақыра аламыз.
6 -қадам: Біз 5 X 5 жарықдиодты дисплейдің көмегімен анимация мен графиканы көрсеткіміз келеді
Ал енді мүлде басқа нәрсе үшін.
Біз бірнеше анимация мен бірнеше таңбаны көрсеткіміз келеді, бірақ негізгі күй циклін үзгіміз келмейді. Өкінішке орай, кескіндер мен мәтін жолдарын көрсететін блоктар әдепкі бойынша 400 мс кешіктіріледі. Кодты JavaScript ұсынуын өңдемей -ақ өзгерту мүмкін емес. Сонымен, бұл біз жасайтын нәрсе.
- Әр сурет үшін функция жасаңыз. Бұл JavaScript -ті өңдеудің орнына суретті көрсету үшін бір блокты пайдалануға мүмкіндік береді. Бұл нақты бағдарламада ешқандай сурет бірнеше рет қолданылмайды, бірақ менің ойымша, бұл стиль кодты оқуды жеңілдетеді.
- Әрбір жаңа функцияда сәйкес суреттің айнымалы атауын (X) алмастыратын «0 -дегі кескінді (X) көрсету» блогын қосыңыз.
-
Негізгі күй циклына қосыңыз. «Байланыссыз» күйін өңдейтін блоктан басқа, әрбір блокқа «X жолын (X) көрсет». Құрылғының әр түрлі күйлерін көрсету үшін көрсетілетін таңбаны қосыңыз. Міне мен не істедім:
- LISTEN_A: 'a'
- LISTEN_B: 'b'
- TEAM_A: «А»
-
TEAM_B: 'B'
ТАПСЫРЫЛмаған күйі үшін жүктеу анимациясын жаңартатын функцияға қоңырау шалыңыз. Біз бұл функцияның егжей -тегжейін төменде толтырамыз
- JavaScript режиміне ауысыңыз.
- X.showImage (0) және basic.showString (X) әр қоңырауды табыңыз.
-
Әрқайсысын X.showImage (0, 0) немесе basic.showString (X, 0) етіп өзгертіңіз.
- Бұл қосымша аргументті қосу әрекеттен кейінгі кідірісті 0 -ге қояды. Әдепкі бойынша, бұл сыртта қалады және бұл блоктардың әрқайсысы орындалғаннан кейін құрылғы 400 мс кідіреді.
- Енді бізде суреттерді анимациялық блоктарымызда көрсетуге болатын кешіктірілмейтін механизм бар, оны қазір құрастыруға болады
Біріншіден, біз салыстырмалы түрде қарапайым анимациялық функцияны құрамыз. Бұл қарапайым, өйткені біз қолданушының функция аяқталмайынша ештеңе істеуін қаламаймыз, сондықтан олардың тарату функциясын спамға жіберуін тоқтатамыз. Мұны істеу үшін біз функцияның толық орындалуына дейін бақылауды шектей аламыз, бұл стандартты әрекет.
- Трансляция анимациясын көрсететін функция жасаңыз.
- Бұл блоктың ішіне анимацияның әр кадрына бір функционалды үш қоңырауды қосу ретімен қосыңыз
-
Әр шақырудан кейін кескінді көрсету функциясына «күту (бізге) (X)» блогын қосыңыз.
Ескертпе: Жетілдірілген басқару бөлімінен алынған бұл блок «кідіріс (мс)» -дан да жоғары болады, себебі ол көрсетілген уақыт өткенге дейін процессорды толықтай қатырады. Кідірту блогы қолданылған кезде, құрылғы сахна артында басқа да тапсырмаларды орындай алады. Күту блогында бұл мүмкін емес
- (X) орнына (MS_PER_FRAME_BROADCAST_ANIMATION x MICROSECONDS_PER_MILLISECOND) қойыңыз
- Анимация енді дұрыс жұмыс істеуі керек
Екіншіден, біз жүктеу анимациясын көрсету механизмін құрамыз. Мұның идеясы - LED дисплейін MS_PER_DEVICE_TICK айнымалысында анықтайтын белгілі бір аралықта жаңарту. Бұл мән, құрылғы белгі ұзындығы - күй циклінің әрбір қайталануын аяқтағаннан кейін құрылғы кідіртетін миллисекундтардың саны. Бұл мән жеткілікті кішкентай болғандықтан, дисплей циклінің әр қайталануы кезінде дисплейді бір рет жаңарта аламыз және пайдаланушыға анимация үздіксіз жүріп жатқанын көреміз, ал күй өзгергенде, пайдаланушының енгізуі арасында кідіріс аз болады. дисплей жаңартылады. ITickLoadingAnimation айнымалысын қолданатын кенелерді санау арқылы біз анимацияның сәйкес кадрын көрсете аламыз.
- Жүктеу анимациясын жаңартатын функция жасаңыз
-
Кене есептегіш максималды мәнге жеткенін тексеру үшін шартты қосыңыз. Егер таңбалауыштың мәні жүктеу анимациясындағы кадрлар санынан әр кадрды көрсету үшін кенелердің санына көбейсе, бұл шарт дұрыс болады.
Егер шарт дұрыс болса, iTickLoadingAnimation мәнін 0 қалпына келтіріңіз
-
If-else шарттар блогын қосыңыз. Бұл анимацияның қандай кадрын көрсету керектігін анықтайды.
Егер анимацияның әр кадры үшін, егер санақшы анимацияның кадр санына көбейтілген анимациядағы кенелердің санынан аз болса (1 -ден басталады), онда осы кадрды көрсетіңіз, әйтпесе келесі кадрдың көрсетіледі
- Блоктың төменгі жағында iTickLoadingAnimation артады
- Анимация енді дұрыс жұмыс істеуі керек
Ескерту: Менің мысалда пайда болған барлық сұр блоктар блоктың JavaScript көрінісін өңдегенде жасалады. Бұл жай блоктың стандартты жиынтығының көмегімен ұсынылмайтын және мәтін түрінде өңделуі керек JavaScript кодын білдіреді.
7 -қадам: Біз деректерді құрылғы радиосын пайдаланып сымсыз жеткізгіміз келеді
Бұл қадам алдыңғыға қарағанда әлдеқайда қысқа. Шын мәнінде, бұл бүкіл оқулықтағы ең қысқа қадам.
Еске салайық, біз пайдаланушының енгізуіне құрылғының жауабын бағдарламалаған кезде, менде бұл бөлімде түсіндірілмеген скриншотта екі блок болды. Бұл радио арқылы сигнал жіберетін функцияларға шақырулар. Нақтырақ айтқанда:
-
А түймесі басылды:
-
Егер құрылғы TEAM_A күйінде болса:
Тарату сигналы SIG_A
-
-
В батырмасы басылды:
-
Егер құрылғы TEAM_B күйінде болса
Тарату сигналы SIG_B
-
Егер бұл функциялар бұрыннан жоқ болса, жасаңыз.
Әр функцияда:
- Трансляция анимациясы функциясын шақырыңыз. Бұл MS_PER_FRAME_BROADCAST_ANIMATION * 3 = 1,5 секунд ішінде болатын кез келген әрекеттің аяқталуына жол бермейді. Тұрақты үшке көбейтіледі, себебі анимацияда үш кадр бар. Бұл кездейсоқ және егер эстетикалық жаңарту жеткілікті үлкен болса, оны қосуға болады. Бұл анимацияның екінші мақсаты - қолданушының тарату функциясын спамға жіберуіне жол бермеу.
- «Радио жіберу нөмірі (X)» блогын қосыңыз, мұнда функция атауында айтылған сигнал тұрақтысы
Бұл радио арқылы хабар тарату үшін қажет.
8 -қадам: Біз құрылғының радиосы арқылы деректерді тыңдағымыз және алғымыз келеді және оны сәйкес өңдейміз
Бұл негізгі қосымшаны құрудың соңғы қадамы.
Біз құрылғыға кіріс радио сигналдарын қалай өңдеу керектігін айтатын боламыз. Біріншіден, біздің құрылғы қабылданған сигналды атайды. Содан кейін, ол сигналдың мәніне сүйене отырып, ол қандай шара қолдану керектігін шешеді.
Бірінші:
- «Қабылданған радиода (X)» блогынан басталатын код блогын жасаңыз.
- Қажет болса, сол алынған мәнді сипаттамалы атауы бар басқа айнымалыға тағайындаңыз.
- Сигналды өңдейтін функцияны шақырыңыз
Екіншіден, сигналды өңдеу функциясында:
- Сигналдың мәніне негізделген тармақты басқаратын if-else операторларының блогын құрыңыз.
-
Егер сигнал SIG_R болса
Құрылғының күйін BOOT_STATE күйіне орнатыңыз (сондықтан біз бұл тұрақты мәнді ертерек құрдық)
-
Егер сигнал SIG_A болса және ағымдағы күй LISTEN_A болса
Құрылғының күйін TEAM_A деп орнатыңыз
-
Егер сигнал SIG_B болса және ағымдағы күй LISTEN_B болса
Құрылғының күйін TEAM_B күйіне орнатыңыз
Міне бітті. Өтініш аяқталды.
9 -қадам: Түбірлік құрылғы: Біз сигналды таңдай аламыз
Енді біз «түбірлік» құрылғыға, яғни желіні басқаратын құрылғыға қарапайым қосымшаны жазамыз.
Бұл құрылғы екі функцияны орындауы керек:
- Біз пайдаланушыға біздің сигналдардың бірін таңдауға рұқсат бергіміз келеді
- Біз пайдаланушыға сигналды таратуға рұқсат бергіміз келеді
Бұл қосымшаның сипаттамасы алдыңғы бөлімнің жиынтығы болғандықтан, мен шолуды беремін, бірақ мен бұрынғыдай егжей -тегжейлі айтпаймын. Жоғарыдағы суретте осы қосымшаның толық коды бар.
Пайдаланушыға сигналды таңдауға рұқсат беру үшін:
-
«Іске қосу» блогында 5 айнымалы мәнді инициализациялаңыз:
- Үш сигнал (0, 1, 2)
- Сигналдар саны (3)
- Ағымдағы таңдалған сигналды ұстайтын айнымалы (бастапқыда бірінші сигналға орнатылған, 0)
-
А түймесін басыңыз:
- Таңдалған сигналды көбейтіңіз
-
Таңдалған сигнал сигналдар санынан үлкен немесе оған тең екенін тексеріңіз
Олай болса, таңдалған сигналды 0 -ге орнатыңыз
- Іске қосу блогынан кейін ағымдағы таңдалған сигналдың мәнін кідіріссіз көрсететін «мәңгілік» циклды іске қосыңыз
Қолданушыға сигнал таратуға рұқсат беру үшін
- «Іске қосылғанда» блогындағы радио тобын 0 -ге орнатыңыз
-
В батырмасын басу керек:
Таңдалған сигналды «радио жіберу нөмірі (X)» блогы арқылы таратыңыз
Міне бітті. Түбірлік түйін қосымшасы өте қарапайым.
10 -қадам: Біз аяқтадық
Жоғарыда қосымшаны іске қосатын құрылғылардың суреті. Оң жақтағы екеуі негізгі «пайдаланушы» қосымшасын, ал сол жақта «түбірлік» қосымшаны іске қосады.
Мен бұл ойынды CS Connections 2018-де, информатика бойынша орта және жоғары мектеп мұғалімдеріне арналған апталық жазғы конференцияда көрсеттім. Мен мұғалімдерге 40 -қа жуық құрылғыны беріп, ережелерді түсіндірдім. Көбісі бұл ойынның қызықты болатынын, ал көпшілігі қалай ойнау керектігін білмейінше оны шатастыратын деп тапты. Демонстрация қысқа болды, бірақ біз әр түрлі адамдар арасында ойынды қызықты деп таптық.
CS Connections 2018 туралы қосымша ақпаратты мына жерден табуға болады.
Ұсынылған:
BBC Micro: бит және Scratch - интерактивті руль және жүргізуші ойыны: 5 қадам (суреттермен)
BBC Micro: бит және Scratch - интерактивті руль және көлік жүргізу ойыны: Менің осы аптадағы тапсырмаларымның бірі - біз жазған Scratch бағдарламасымен интерфейс жасау үшін BBC Micro: bit пайдалану. Мен бұл ThreadBoard тақтасын ендірілген жүйені құрудың тамаша мүмкіндігі деп ойладым! Менің сызатқа шабытым
Сандық кідіріс педалы: 19 қадам (суреттермен)
Цифрлық кідіріс педалы: Гитара педальдарын құру-көп уақытты қажет ететін, жиі көңілсіз және қымбат процесс. Егер сіз өзіңіздің цифрлық кешіктіру педалын жасау арқылы уақыт пен ақшаны үнемдейсіз деп ойласаңыз, мен сізге R.G. Киннің педальды құрылыс экономикасы бойынша беті
LP-2010 AES17 1998 Коммутациялық күшейткіш төмен өту (төмен өту) сүзгісі: 4 қадам
LP-2010 AES17 1998 ауыспалы күшейткіштің төмен өтуі (төмен өту) сүзгісі: бұл өте жақсы өткізгіштігі бар D классының күшейткіші. Жақсы жұмыс, суперо өнімділік, оңай қосылу бұл өнімді пайдалануды жеңілдетеді. жоғары шығын өнімділігі
Pimoroni Enviro көмегімен жарық пен түсті өлшеу: микро үшін бит: бит: 5 қадам
Pimoroni Enviro көмегімен жарық пен түстерді өлшеу: бит үшін микро: бит: Мен бұрын жарық пен түстерді өлшеуге мүмкіндік беретін кейбір құрылғыларда жұмыс істедім, және сіз осындай өлшемдердің теориясы туралы көптеген нұсқауларды таба аласыз. жақында қоршаған ортаны шығарды: бит, m үшін қосымша
Sony Ericsson GC83 сымсыз желілік картасы үшін жаңа антенна: 5 қадам
Sony Ericsson GC83 сымсыз желілік картасы үшін жаңа антенна: картаңыздың ішінен сынғанына сенімдімін, жаңа антенна жасаңыз. Бұл бұзылмайды және 30 доллар тұрады. Ұят суреттер үшін кешірім сұраймын