- План игре:
- Кружни дијаграм:
- Предуслови:
- Програмирање Ардуина за свемирске трке:
- Ардуино Спаце Рацер игра ради:
Програмирање је увек било забавно и само је постало много боље са развојним платформама попут Ардуина. Готово сваки програмер овде би покушао да развије неку врсту игре користећи језик који учи / вежба. То им помаже да своје вештине програмирања подесе на забаван, али продуктиван начин. Велики сам обожавалац Ардуина откад сам га упознао и увек сам желео да испробам нешто цоол с њим, када сам сазнао како кул може да добије графички ЛЦД попут Нокиа 5110 заједно са Ардуином, моју идеју о развоју игре То је био занимљив начин да се истовремено усаврше неке вештине програмирања и да се забавите, мада бисте и ви можда желели да развијете своју игру. Стога ћемо у овом упутству научити како можемо створити пристојну игру користећи Ардуино и графичке ЛЦД екране.
Већ смо направили ту старомодну змијску игру користећи Ардуино, па овог пута покушавамо нешто ново и назвали смо је овом игром Спаце Раце Гаме где требате да заштитите свој брод од непријатељских бродова помоћу џојстика.
План игре:
Пре него што започнемо, веома је важно испланирати како би ваша игра заправо функционисала. За избор хардвера одабрао сам графички ЛЦД и џојстик Нокиа5110. Претпостављам у овом упутству да сте и ви изабрали исто. С обзиром да Нокиа 5110 нема пуно простора, планирамо целокупну игру у резолуцији екрана од 84 * 48 пиксела. Већ смо направили упутства о томе како повезати Нокиа 5110 ЛЦД са Ардуином и џојстик са Ардуином.
Унутар овог простора морамо се чврсто уклопити у простор за игре и подручје таблице резултата који ће приказивати ствари попут резултата и осталог. Веома је важно знати локацију пиксела на коју постављате ствари да бисте пратили локације пиксела и ажурирали их на екрану.
Једном када се одлучи за изглед екрана игре, морамо да одлучимо о ликовима у нашој игри. За моју игру имамо само два, лик играча који је свемирски брод и непријатељски лик који би некако требао изгледати као ванземаљски свемирски брод. Нокиа ЛЦД може приказивати битмап слике, па сам одлучио да користим ту опцију за приказ свог свемирског брода и непријатеља.
Тако ћемо имати свемирски брод који се утркује кроз свемирске бродове ванземаљаца, овај свемирски брод ће имати три траке за промене како би се избегао погодак ванземаљаца. Све време ванземаљци могу заузети само две стазе и играч би требао бити у могућности да се вози кроз бесплатну стазу. Када се ове идеје закључе, можемо наставити са хардвером, а затим са програмирањем.
Кружни дијаграм:
Круг за ову Ардуино игру је врло једноставан; само треба да повежемо Нокиа 5110 ЛЦД модул и џојстик са Ардуином. Комплетна шема кола приказана је доле
ЛЦД Нокиа 5110 ради са 3.3В, а модул џојстика 5В, зато будите сигурни да сте ЛЦД повезали само са 3.3В, јер га 5В може трајно оштетити. ЛЦД комуницира са Ардуином путем СПИ протокола, а џојстик чита АДЦ само да би очитао промену напона. Подешавање везе ће изгледати отприлике овако у наставку
Предуслови:
Пре него што уђемо у програмски део, за вас је важно да вам буде на располагању приказни модул и џојстик, тако да можете да користите следеће водиче да бисте сазнали више о њима, а затим се вратите овде да бисте били сигурни да ствари функционишу онако како ми радимо треба!
- Нокиа 5110 ЛЦД интерфејс са Ардуином
- Модул џојстика повезан са Ардуином
Програмирање Ардуина за свемирске трке:
Комплетан програм за игре можете наћи на крају ове странице; можете га користити директно на вашем Ардуино ИДЕ-у и отпремити га на вашу плочу. Али ако желите да знате шта се заправо догађа у коду, прочитајте даље.
Као и увек свој програм започињемо додавањем датотека заглавља наше библиотеке, за овај пројекат су нам потребне три библиотеке од којих се СПИ библиотека подразумевано додаје у ваш ИДЕ. Преостале две библиотеке треба преузети са странице Адафруит Гитхуб. Следите упутства за ЛЦД повезивање поменута у одељку са предусловима ако нисте сигурни како да додате библиотеку.
#инцлуде
Ако сте следили упутства, требали бисте знати да је могуће приказати битмап слике на ЛЦД-у. Дакле, потребну слику морамо претворити у битмап код помоћу софтвера поменутог у водичу, можете одабрати било коју слику са Интернета и користити је претварањем у битмап код. Уверите се да је слика довољно једноставна за приказивање на нашем ЛЦД екрану, проверите преглед пре него што стварно покушате на ЛЦД екрану. У нашем програму користили смо два битмап знака, један је свемирски брод, а други непријатељски брод, битмап код за оба додат је у наш код, као што је приказано доле.
// Битмап подаци за СпацеСхип статиц цонст унсигнед цхар ПРОГМЕМ брод = { Б00000000, Б00000000, Б00000001, Б00000000, Б00000011, Б10000000, Б00000010, Б10000000, Б00000010, Б11000000, Б00000111, Б11000000, Б00001101, Б11100000, Б0001111, Б111111, Б11 Б01111111, Б11111100, Б01111111, Б11111100, Б01111111, Б11111100, Б00011111, Б11110000, Б00000111, Б11100000, Б00000000, Б00000000, }; // Битмап подаци за непријатељски статички цонст непотписани знак ПРОГМЕМ непријатељ = { Б00000101, Б11000000, Б00001011, Б11100000, Б00000011, Б11100000, Б00110011, Б11111000, Б01111111, Б11111100, Б10111111, Б11111010, Б01110111, Б11011100, Б01111110, Б11111100, Б00111111, Б11111100, Б11101111, Б11101110, Б11000001, Б00000110, Б10000001, Б00000010, Б10000000, Б00000010, Б00000000, Б00000000, };
Морамо да одредимо игле на које је повезан екран Нокиа ЛЦД 5110. Екран се комуницира помоћу СПИ комуникације, ако сте следили горњу шему кола, код за иницијализацију ЛЦД-а биће следећи: не морате га мењати.
Адафруит_ПЦД8544 дисплаи = Адафруит_ПЦД8544 (7, 6, 5, 4, 3); // Наведите пинове на које је повезан ЛЦД
Унутар функције подешавања само покрећемо серијски монитор брзином од 9600 бауд-ова како бисмо могли да отклонимо грешке у стварима, а затим иницијализујемо ЛЦД екран. Такође морамо да подесимо контраст ЛЦД екрана, сваки екран ће радити најбоље у различитим нивоима контраста, па се поиграјте са вредношћу да бисте проверили која вам највише одговара. Коначно такође очистимо екран да би се покренуо изнова.
воид сетуп () { Сериал.бегин (9600); // Серијски монитор за отклањање грешака дисплаи.бегин (); // Почиње ЛЦД комуникацијски приказ.сетЦонтраст (30); // Подесимо контраст екрана дисплаи.цлеарДисплаи (); // брише екран и започиње ново }
Чим се екран очисти, прелазимо у функцију петље и тамо приказујемо екран игре. Екран игре није ништа друго доли приказује основни костур игре заједно са резултатом и нивоом брзине. Функцију црте користили смо за цртање три линије као границе, а десно приказујемо резултат текста и брзину баш као и стари ретро ручни уређаји за игре.
воид гамесцреен () { // Нацртај границу за приказ екрана.дравЛине (0, 0, 0, 47, ЦРНА); дисплаи.дравЛине (50, 0, 50, 47, ЦРНА); дисплаи.дравЛине (0, 47, 50, 47, ЦРНА); // Унос задатих текстова дисплаи.сетТектСизе (1); дисплаи.сетТектЦолор (ЦРНА); дисплаи.сетЦурсор (52,2); дисплаи.принтлн ("Брзина"); дисплаи.сетЦурсор (54,12); дисплаи.принтлн (спеед_спеед); дисплаи.сетЦурсор (52,25); дисплаи.принтлн ("Оцена"); дисплаи.сетЦурсор (54,35); дисплаи.принтлн (резултат); }
Даље морамо добити улаз од корисника како бисмо му / јој омогућили контролу свемирског брода. Улаз ће се добити од модула џојстика који је повезан на пин А1. Аналогна вредност сензора биће 512 ако се не помери и повећава се и смањује када се помера дуж Кс-осе. Користимо ове вредности да одредимо да ли корисник жели да се помери улево или удесно. Требали бисте прочитати Јоистицк повезивање са упутством за Ардуино поменуто у предусловима ако вам је тешко да разумете доњи програм.
// Добијање података од корисника Јои_Кс = аналогРеад (А1); // Прочитајте Кс вредност из џојстика иф (Јои_Кс <312 && ПОС! = 1 && цонтрол == труе) // Ако се јои стицк помери удесно {ПОС--; цонтрол = фалсе;} // Смањи положај свемирског брода елсе иф (Јои_Кс> 712 && ПОС! = 3 && цонтрол == труе) // Ако се јои стицк креће удесно {ПОС ++; цонтрол = фалсе;} // Повећај положај свемирског брода елсе иф (Јои_Кс> 502 && Јои_Кс <522) // Ако се џојстик врати у почетни положај цонтрол = труе; // Припремите за следећи потез // Улаз од корисника примљен
Након што од корисника добијемо положај свемирског брода, свемирски брод морамо поставити на то одређено место. Користимо доњу функцију и преносимо вредност положаја као параметар, а затим на основу положаја свемирски брод се поставља на своју одговарајућу стазу.
воид плаиер_цар (цхар пос) // Поставите свемирски брод на основу одабране позиције корисника { иф (пос == 1) дисплаи.дравБитмап (2, 32, брод, 15, 15, ЦРНА); иф (пос == 2) дисплаи.дравБитмап (18, 32, брод, 15, 15, ЦРНИ); иф (пос == 3) дисплаи.дравБитмап (34, 32, брод, 15, 15, ЦРНИ); }
Сада када је наш свемирски брод постављен на екран и спреман за трке, морамо представити непријатељске бродове који ће се такмичити заједно са играчем. Сваки пут када непријатељски брод пређе заслон, претпостављамо да је мртав, а када умре морамо створити нови свемирски брод. Доле наведена функција ради исто. Ствара нову позицију за два непријатељска брода и поставља их на врх екрана.
иф (непријатељ_деад) // Провера непријатељских бродова је мртва {// Ако су мртви непријатељ_0_пос = ПОС; // креирамо првог непријатеља изнад свемирског брода непријатељ_1_пос = рандом (0,4); // креирамо секундарног непријатеља на неком другом случајном месту непријатељ_фаза = 0; // Доведите непријатеља из врха непријатељ_деад = фалсе; // Непријатељ је створен тако да више нису мртви }
Након постављања непријатељских бродова на врх екрана, морамо га срушити тако да се копље копка као да се наш играч јури према горе, да бисмо то урадили, морамо само повећати фазу (место на којем се слика приказује) тако да спушта се полако. Исто се ради за оба непријатељска брода као што је приказано доле
непријатељски_брод (непријатељски_0_пос, непријатељска_фаза); непријатељска_фаза ++; // Поставите првог непријатеља на екран и спустите га према непријатељском броду (непријатељ_1_пос, непријатељ_фаза); непријатељска_фаза ++; // Ставите прикривеног непријатеља на екран и срушите га
Функција непријатељски брод је приказана доле, врло је слична функцији аутомобила играча, али овде имамо два параметра. Један је за постављање непријатеља на колосек, а други за померање непријатеља према дну.
неважећи непријатељски брод (инт место, инт фаза) // Поставите непријатељски брод на ново место и фазу { иф (место == 1) дисплаи.дравБитмап (2, фаза, непријатељ, 15, 15, ЦРНА); иф (плаце == 2) дисплаи.дравБитмап (18, фаза, непријатељ, 15, 15, ЦРНА); иф (плаце == 3) дисплаи.дравБитмап (34, фаза, непријатељ, 15, 15, ЦРНА); }
Следећи комад кода треба да провери да ли је свемирски брод избегао непријатељски брод. Да бисмо то проверили, морамо знати положај непријатељских бродова и свемирски брод играча. Пошто све то знамо, само морамо да проверимо да ли је положај свемирског брода исти као и непријатељски брод. Ово проверавамо само ако је непријатељски брод стигао у близини свемирског брода. Ако играч није избегао непријатеља, то значи да је игра готова.
иф (непријатељска_фаза> 22 && ((непријатељска_0_пос == ПОС) - (непријатељска_послика == ПОС))) // Ако свемирски брод додирне било који непријатељски гаме_овер (); // Приказ игре завршен
Ако је играч успешно избегао непријатеља, требали бисмо га убити и дати му поен. Да бисмо то урадили, само проверавамо да ли је непријатељ доспео до дна екрана и да ли га убијамо помоћу доњег кода
иф (непријатељ_фаза> 40) // Ако свемирски брод побегне непријатељима {непријатељ_деад = истина; сцоре ++;} // Повећајте резултат и убијте непријатеље
Каква би забава била, ако не повећавамо тежину игре док постижемо високе оцене. Дакле, користимо другу функцију која затим прати резултат играча и на основу резултата ће повећати брзину игре. Брзина се заправо контролише помоћу функције одлагања која ће контролисати интервал освежавања игре, чинећи је брзом или спором.
воид Левел_Цонтроллер () // Повећајте брзину игре на основу резултата. { иф (резултат> = 0 && резултат <= 10) // Ако је резултат 0-10 { гаме_спеед = 0; кашњење (80); // успоримо игру за 80мс } ако (резултат> 10 && резултат <= 20) // Ако резултат 10-40 { гаме_спеед = 1; кашњење (70); // успоримо игру за 70мс } ако (резултат> 20 && резултат <= 30) // Ако резултат 20-40 { гаме_спеед = 2; кашњење (60); // успоримо игру за 60мс } ако (резултат> 30 && резултат <= 40) // Ако резултат 30-40 { гаме_спеед = 3; кашњење (50); // успоримо игру за 50мс } }
Ардуино Спаце Рацер игра ради:
Након што се уверите да се хардвер и програм разумеју, само направите коло и отпремите код на Ардуино плочу. Требали бисте приметити да је игра започела како је приказано доле
Помоћу џојстика побегните непријатељском броду померајући се лево или десно. Да бисте избегли сваког непријатеља, постићи ћете да се ваш резултат повећа за један. Када резултат постане висок, брзина игре ће се такође повећати, то је повећање брзине за 10 мс за сваких 10 постигнутих бодова. Можете наставити и надоградити ову игру да бисте увели нове нивое или унели неке хардверске промене да бисте је контролисали покретом помоћу акцелерометара. Креативност је једина граница. За вашу референцу овде научите да користите акцелерометар са Ардуином.
Надам се да сте разумели пројекат и уживали сте у његовој изради. Ако сте наишли на било какав проблем у постизању овог резултата, слободно објавите проблем у одељку за коментаре испод или користите форуме за техничку помоћ. Хаппи гаминг !!
Проверите комплетан код и демонстрациони видео испод.