- Spēles plāns:
- Ķēdes shēma:
- Priekšnosacījumi:
- Arduino programmēšana kosmosa sacīkšu spēlei:
- Arduino Space Racer spēle darbojas:
Programmēšana vienmēr ir bijusi jautra, un tā vienkārši kļuva daudz labāka ar tādām attīstības platformām kā Arduino. Gandrīz katrs programmētājs šeit būtu mēģinājis izstrādāt kaut kādu spēli, izmantojot valodu, kuru viņi mācās / praktizē. Tas viņiem palīdz izklaidēt, taču produktīvi, programmēšanas prasmes. Esmu bijis liels Arduino fans kopš tā laika, kad ar to iepazinos un vienmēr gribēju ar to izmēģināt kaut ko foršu, kad uzzināju, cik forši tas var iegūt, izmantojot grafisko LCD, piemēram, Nokia 5110, kā arī Arduino, mana ideja attīstīt spēli Tas bija interesants veids, kā noskaņot dažas programmēšanas prasmes un vienlaikus izklaidēties, tāpēc, lai arī jūs, puiši, varētu būt ieinteresēti attīstīt arī savu spēli. Tādējādi šajā apmācībā mēs uzzināsim, kā mēs varam izveidot pienācīgu spēli, izmantojot Arduino un grafiskos LCD.
Mēs jau esam izveidojuši šo vecmodīgo Snake spēli, izmantojot Arduino, tāpēc šoreiz mēs izmēģinām kaut ko jaunu, un mēs šo spēli nosaucām par Space Race Game, kur jums ir jāaizsargā jūsu kuģis no ienaidnieka kuģiem, izmantojot kursorsviru.
Spēles plāns:
Pirms mēs sākam darbu, ir ļoti svarīgi plānot, kā jūsu spēle faktiski darbotos. Aparatūras izvēlei es devos ar Nokia5110 grafisko LCD un vadības sviru. Šajā apmācībā es pieņemu, ka arī jūs esat atlasījis to pašu. Tā kā Nokia 5110 nav daudz vietas, mēs visu savu spēli esam plānojuši 84 * 48 pikseļu izšķirtspējā. Mēs jau esam izveidojuši konsultācijas par to, kā saskarni Nokia 5110 LCD ar Arduino un kursorsviru ar Arduino.
Šajā telpā mums ir cieši jāiekļaujas spēļu laukumā un tablo zonā, kurā būs redzamas tādas lietas kā rezultāts un citas lietas. Ir ļoti svarīgi zināt pikseļu atrašanās vietu, kur ievietojat saturu, lai sekotu pikseļu atrašanās vietām un atjauninātu tās ekrānā.
Kad spēles ekrāna izskats ir izlemts, mums jāizlemj par spēles varoņiem. Manai spēlei mums ir tikai divi - spēlētāja raksturs, kas ir kosmosa kuģis, un ienaidnieka raksturs, kuram vajadzētu izskatīties kā citplanētiešu kosmosa kuģim. Nokia LCD var parādīt bitkartes attēlus, tāpēc es nolēmu izmantot šo opciju, lai parādītu savu kosmosa kuģi un ienaidniekus.
Tātad mums būs kosmosa kuģis, kas sacenšas pa ārvalstnieku kosmosa kuģiem, šim kosmosa kuģim būs trīs joslu maiņas, lai izvairītos no trāpījuma ar citplanētiešiem. Vienmēr ārvalstnieki var aizņemt tikai divas trases, un spēlētājam vajadzētu būt iespējai izbraukt pa brīvo trasi. Kad šīs idejas ir pabeigtas, mēs varam turpināt aparatūru un pēc tam programmēšanu.
Ķēdes shēma:
Šīs Arduino spēles shēma ir ļoti vienkārša; mums vienkārši ir jāsaskaņo Nokia 5110 LCD modulis un kursorsviru ar Arduino. Pilna shēma ir parādīta zemāk
Nokia 5110 LCD darbojas ar 3.3V un Joystick moduļa darba dēlu 5V, tāpēc noteikti pievienojiet LCD tikai 3.3V, jo 5V to var neatgriezeniski sabojāt. LCD ar Arduino sazinās, izmantojot SPI protokolu, un kursorsvira ADC lasa tikai, lai nolasītu sprieguma izmaiņas. Savienojuma iestatīšana zemāk izskatīsies apmēram tā
Priekšnosacījumi:
Pirms mēs ienirstam programmēšanas daļā, jums, cilvēkiem, ir svarīgi ērti izmantot displeja moduli un kursorsviru, tāpēc varat izmantot šīs apmācības, lai uzzinātu vairāk par tām, un pēc tam atgriezieties šeit, lai pārliecinātos, ka lietas darbojas tā, kā mēs vajag to!
- Nokia 5110 LCD saskarne ar Arduino
- Sviras moduļa saskarne ar Arduino
Arduino programmēšana kosmosa sacīkšu spēlei:
Pilnīga programma spēli var atrast beigās šīs lapas; jūs varat to izmantot tieši savā Arduino IDE un augšupielādēt savā Board. Bet, ja vēlaties uzzināt, kas patiesībā notiek kodā, lasiet tālāk.
Kā vienmēr, mēs sākam programmu, pievienojot mūsu bibliotēkas galvenes failus, mums šim projektam ir nepieciešamas trīs bibliotēkas, no kurām SPI bibliotēka pēc noklusējuma tiek pievienota jūsu IDE. Divas pārējās bibliotēkas ir jālejupielādē no Adafruit Github lapas. Izpildiet LCD saskarnes apmācību, kas minēta sadaļā Priekšnosacījumi, ja neesat pārliecināts, kā pievienot bibliotēku.
# iekļaut
Ja esat sekojis apmācībai, jums jāzina, ka bitkartes attēlus ir iespējams parādīt LCD. Tāpēc mums ir jāpārvērš nepieciešamais attēls bitkartes kodā, izmantojot apmācībā minēto programmatūru, jūs varat izvēlēties jebkuru attēlu no interneta un izmantot to, pārveidojot tos par bitkartes kodu. Pārliecinieties, vai attēls ir pietiekami vienkāršs, lai to varētu parādīt mūsu LCD ekrānā, pārbaudiet priekšskatījumu, pirms faktiski mēģināt uz LCD ekrāna. Mūsu programmā mēs esam izmantojuši divas bitkartes rakstzīmes, viena ir kosmosa kuģis, bet otra - ienaidnieka kuģis. Abiem bitkartes kods tiek pievienots mūsu kodā, kā parādīts zemāk.
// Bitmap Dati par kosmosa statisku const neparakstīts char PROGMEM kuģa = { B00000000, B00000000, B00000001, B00000000, B00000011, B10000000, B00000010, B10000000, B00000010, B11000000, B00000111, B11000000, B00001101, B11100000, B00011111, B11110000, B00111111, B11111000, B01111111, B11111100, B01111111, B11111100, B01111111, B11111100, B00011111, B11110000, B00000111, B11100000, B00000000, B00000000, }; // Bitmap dati par ienaidnieka statisko konst neparakstīto simbolu PROGMEM ienaidnieks = { B00000101, B11000000, B00001011, B11100000, B00000011, B11100000, B00110011, B11111000, B01111111, B11111100, B10111111, B11111010, B01110111, B11011100, B01111110, B11111100, B00111111, B11111100, B11101111, B11101110, B11000001, B00000110, B10000001, B00000010, B10000000, B00000010, B00000000, B00000000, };
Mums ir jānorāda tapas, ar kurām ir savienots Nokia LCD 5110 displejs. Displejs tiek sazināts, izmantojot SPI sakarus. Ja esat ievērojis iepriekšējo shēmu, LCD inicializācijas kods būs šāds, jums tas nav jāmaina.
Adafruit_PCD8544 displejs = Adafruit_PCD8544 (7, 6, 5, 4, 3); // Norādiet tapas, kurām ir pievienots LCD
Inside iestatīšanas funkciju, mēs vienkārši sākt sērijas monitoru 9600 datu pārraides ātrumu, lai mēs varētu atkļūdot stuff, un tad sāktu LCD displeju. Mums ir jāiestata arī LCD displeja kontrasts, katrs displejs darbosies vislabāk citā kontrasta līmenī, tāpēc spēlējiet ar vērtību, lai pārbaudītu, kas jums vislabāk atbilst. Visbeidzot mēs arī notīrām displeja ekrānu, lai sāktu no jauna.
void setup () { Sērijas.sākt (9600); // Seriālais monitors monitora atkļūdošanai.begin (); // Sāciet LCD sakaru displeju.setContrast (30); // Iestatiet displeja displeja kontrastu.clearDisplay (); // notīra ekrānu un sāk jaunu }
Tiklīdz ekrāns ir notīrīts, mēs pārietam uz cilpas funkciju un tur parādām spēles ekrānu. Spēles ekrāns ir nekas cits kā tas, kas parāda spēles pamata skeletu, kā arī rezultātu un ātruma līmeni. Mēs izmantojām līnijas funkciju, lai uzzīmētu trīs līnijas kā apmales, un pa labi mēs parādām teksta rezultātu un ātrumu tāpat kā vecās retro rokas spēļu ierīces.
void gamescreen () { // Uzzīmējiet robežu ekrānam display.drawLine (0, 0, 0, 47, BLACK); display.drawLine (50, 0, 50, 47, MELNA); display.drawLine (0, 47, 50, 47, MELNA); // Ievadiet noklusējuma tekstus display.setTextSize (1); display.setTextColor (BLACK); display.setCursor (52,2); display.println ("Ātrums"); display.setCursor (54,12); display.println (spēles ātrums); display.setCursor (52,25); display.println ("Rezultāts"); display.setCursor (54,35); display.println (rezultāts); }
Tālāk mums ir jāsaņem ievads no lietotāja, lai viņš / viņa varētu kontrolēt kosmosa kuģi. Ieeja tiks saņemta no kursorsviras moduļa, kas ir savienots ar tapu A1. Sensora analogā vērtība būs 512, ja tā netiks pārvietota, un palielināsies un samazināsies, pārvietojoties pa X asi. Mēs izmantojam šīs vērtības, lai noteiktu, vai lietotājs vēlas pārvietoties pa kreisi vai pa labi. Jums ir jāizlasa priekšnosacījumos minētā kursorsviru saskarne ar Arduino apmācību, ja jums ir grūti saprast zemāk esošo programmu.
// Iegūt ievadi no lietotāja Joy_X = analogRead (A1); // Izlasiet X vaue no kursorsviras, ja (Joy_X <312 && POS! = 1 && control == true) // Ja prieka nūja virzās pa labi {POS--; control = false;} // Kosmosa kuģa stāvokļa samazināšana, ja (Joy_X> 712 && POS! = 3 && control == true) // Ja prieka nūja virzās pa labi {POS ++; control = false;} // Kosmosa kuģa stāvokļa palielināšana, ja (Joy_X> 502 && Joy_X <522) // Ja kursorsviru atpakaļ sākotnējā stāvokļa kontrolē = true; // Sagatavojiet to nākamajai kustībai // Ieeja no lietotāja saņemta
Pēc tam, kad no lietotāja esam saņēmuši kosmosa kuģa atrašanās vietu, mums ir jānovieto kosmosa kuģis konkrētajā vietā. Mēs izmantojam zemāk esošo funkciju un kā parametru nododam pozīcijas vērtību, pēc tam, pamatojoties uz pozīciju, kosmosa kuģis tiek ievietots attiecīgajā sliedē.
void player_car (char pos) // Novietojiet kosmosa kuģi, pamatojoties uz lietotāja izvēlēto pozīciju { if (pos == 1) display.drawBitmap (2, 32, ship, 15, 15, BLACK); if (pos == 2) display.drawBitmap (18, 32, kuģis, 15, 15, BLACK); if (pos == 3) display.drawBitmap (34, 32, kuģis, 15, 15, BLACK); }
Tagad, kad mūsu kosmosa kuģis ir novietots uz ekrāna un ir gatavs sacīkstēm, mums jāiepazīstina ar ienaidnieka kuģiem, kuri sacentīsies kopā ar spēlētāju. Katru reizi, kad ienaidnieka kuģis šķērsojis ekrānu, mēs pieņemam, ka viņš ir miris, un, kad viņš ir miris, mums ir jāizveido jauns kosmosa kuģis. Tālāk norādītā funkcija darbojas tieši tāpat. Tas rada jaunu pozīciju diviem ienaidnieka kuģiem un novieto tos ekrāna augšdaļā.
ja (ienaidnieka_nāvis) // Ienaidnieka kuģu pārbaude ir mirusi {// Ja tie ir miruši ienaidnieks_0_pos = POS; // izveidot pirmo ienaidnieku virs kosmosa kuģa ienaidnieks_1_pos = nejaušs (0,4); // izveidot slepenu ienaidnieku kādā citā nejaušā vietā ienaidnieka_fāze = 0; // Ienesiet ienaidnieku no augšējā ienaidnieka_nāves = nepatiesa; // Ienaidnieks ir izveidots, tāpēc viņi vairs nav miruši }
Pēc ienaidnieka kuģu novietošanas uz ekrāna augšdaļas mums tas jānolaiž, lai tas šķēps it kā mūsu spēlētājs sacenstos uz augšu, lai to izdarītu, mums vienkārši jāpaaugstina fāze (vieta, kur attēls tiek parādīts), lai tas nāk lēnām. Tas pats tiek darīts abiem ienaidnieka kuģiem, kā parādīts zemāk
ienaidnieka_kuģis (ienaidnieka_0_pozīcija, ienaidnieka_fāze); ienaidnieka_fāze ++; // Novietojiet pirmo ienaidnieku uz ekrāna un izdzeniet viņu uz leju ienaidnieka kuģis (ienaidnieka_1_posms, ienaidnieka_fāze); ienaidnieka_fāze ++; // Novietojiet atdalīto ienaidnieku uz ekrāna un nobrauciet viņu
Funkcija enem_ship ir parādīta zemāk, tā ir ļoti līdzīga spēlētāja automašīnas funkcijai, bet šeit mums ir divi parametri. Viens ir paredzēts ienaidnieka novietošanai uz sliežu ceļa, bet otrs - ienaidnieka virzīšanai uz apakšu.
void ienaidnieka_kuģis (int vietā, int fāzē) // Novietojiet ienaidnieka_kuģi jaunajā vietā un fāzē { if (vieta == 1) display.drawBitmap (2, fāze, ienaidnieks, 15, 15, MELNA); if (vieta == 2) display.drawBitmap (18, fāze, ienaidnieks, 15, 15, MELNA); if (vieta == 3) display.drawBitmap (34, fāze, ienaidnieks, 15, 15, MELNA); }
Nākamajam koda fragmentam jāpārbauda, vai kosmosa kuģis ir izvairījies no ienaidnieka kuģa. Lai to pārbaudītu, mums jāzina ienaidnieka kuģu stāvoklis un spēlētāja kosmosa kuģis. Tā kā mēs visu zinām, mums vienkārši jāpārbauda, vai kosmosa kuģa stāvoklis ir tāds pats kā ienaidnieka kuģim. Mēs to pārbaudām tikai tad, ja ienaidnieka kuģis ir sasniedzis kosmosa kuģa tuvumā. Ja spēlētājs nav izvairījies no ienaidnieka, tas nozīmē, ka spēle ir beigusies.
if (ienaidnieka_fāze> 22 && ((ienaidnieka_0_pos == POS) - (ienaidnieka_1_pos == POS))) // // Ja Kosmosa kuģis pieskaras kādam no ienaidnieka game_over (); // Displeja spēle beigusies
Ja spēlētājs ir veiksmīgi izvairījies no ienaidnieka, mums ir jānogalina ienaidnieks un jādod spēlētājam punkts. Lai to izdarītu, mēs vienkārši pārbaudām, vai ienaidnieks ir sasniedzis ekrāna apakšdaļu un vai mēs to nogalinām, izmantojot zemāk esošo kodu
ja (ienaidnieka_fāze> 40) // Ja kosmosa kuģis aizbēg no ienaidniekiem {ienaidnieks_nāvējs = patiess; rezultāts ++;} // Palieliniet rezultātu un nogaliniet ienaidniekus
Cik jautri tas būtu, ja mēs nepalielinātu spēles grūtības, jo mēs saņemam augstus rezultātus. Tāpēc mēs izmantojam citu funkciju, kas pēc tam uzrauga spēlētāja rezultātu, un, pamatojoties uz rezultātu, tas palielinās spēles ātrumu. Ātrumu faktiski kontrolē, izmantojot kavēšanās funkciju, kas kontrolēs spēles atsvaidzināšanas intervālu, padarot to ātru vai lēnu.
void Level_Controller () // Palieliniet spēles ātrumu, pamatojoties uz rezultātu. { if (rezultāts> = 0 && rezultāts <= 10) // Ja rezultāts 0-10 { game_speed = 0; kavēšanās (80); // palēnināt spēli par 80ms } ja (rezultāts> 10 && rezultāts <= 20) // Ja rezultāts ir 10-40 { game_speed = 1; kavēšanās (70); // palēnināt spēli par 70ms } ja (rezultāts> 20 && rezultāts <= 30) // Ja rezultāts 20-40 { game_speed = 2; kavēšanās (60); // palēnināt spēli par 60ms } ja (rezultāts> 30 && rezultāts <= 40) // Ja rezultāts 30-40 { game_speed = 3; kavēšanās (50); // palēnināt spēli par 50 ms } }
Arduino Space Racer spēle darbojas:
Pēc tam, kad esat pārliecinājies par aparatūras un programmas izpratni, vienkārši izveidojiet ķēdi un augšupielādējiet kodu Arduino padomē. Jums vajadzētu pamanīt spēles sākumu, kā parādīts zemāk
Izmantojiet kursorsviru, lai izvairītos no ienaidnieka kuģa, pārvietojoties pa kreisi vai pa labi. Lai izvairītos no katra ienaidnieka, jūs saņemsiet savu rezultātu par vienu. Kad rezultāts būs augsts, palielināsies arī spēles ātrums, tas ir, ātruma pieaugums par 10ms par katriem 10 gūtajiem punktiem. Jūs varat turpināt darbu un izmantot šo spēli, lai ieviestu jaunus līmeņus, vai arī veikt dažas aparatūras izmaiņas, lai to kontrolētu kustībā, izmantojot akselerometru. Radošums ir vienīgā robeža. Šeit jūs uzzināsiet, kā lietot akselerometru ar Arduino.
Ceru, ka sapratāt projektu un patika to veidot. Ja jums ir radušās problēmas, lai tas darbotos, lūdzu, nekautrējieties publicēt problēmu zemāk esošajā komentāru sadaļā vai izmantot forumus tehniskai palīdzībai. Priecīgu spēli !!
Pārbaudiet pilnu kodu un zemāk redzamo demonstrācijas video.