Jocul Volfied este un joc arcade clasic, in care jucatorul manuieste o nava care trebuie sa cucereasca cat mai mult dintr-un teritoriu pentru a avansa la nivelul urmator. Se poate juca varianta cea mai complexa online aici:volfied
Pentru a cuceri teritoriu, nava avanseaza in zona inamica, si traseaza in urma ei linia care va delimita noul teritoriu. In momentul in care nava uneste doua puncte din propria zona, aria delimitata de linia trasata va fi cucerita.
Jucatorul trebuie sa se fereasca de inamicii care incearca sa impiedice nava sa castige din teritoriu. Nava este in siguranta cand se afla in propriu teritoriu (nu poate fi omorat de inamici). Atunci cand nava avanseaza in teritoriul inamic devine vulnerabila, si poate fi omorata daca un inamic atinge nava sau linia trasata pentru noul teritoriu.
Jocul implementat de mine are doi inamici care se vor deplasa aleatoriu. Nava este controlata prin 4 butoane, pentru deplasare stanga, dreapta, sus, jos. Jucatorul are 3 sanse sa castige nivelul: daca pierde o viata, revine pe pozitia de start si isi pastreaza teritoriul cucerit. Jocul este castigat cand se reuseste cucerirea a minim 80% din ecran.
Pentru realizarea proiectului am mai creat doua placi suplimentare fata de placuta de baza cu microcontrolerul:
1. o placuta imprimata pentru LCD. Deoarece este riscanta lipirea pinilor lcd-ului cu letconul (se poate arde foarte usor), am ales sa fac o placa imprimata cu circuite doar pentru pinii lcd-ului, pe care fixez ecranul (lipit cu banda, sau fixat cu suruburi).
2. o placuta cu butoanele si celelalte componente:
Piesele le-am cumparat majoritatea de la Syscom, in total m-au costat cam 15 lei (inclusiv placuta de test). LCD-ul l-am cumparat cu 15 lei de la un service GSM din piata Crangasi (l-am comandat dimineata la 11 si la 5 jumate in aceeasi zi puteam sa il iau).
Placuta lcd-ului se conecteaza la 8 pini de pe placuta cu butoane. Placuta cu butoane se leaga prin 13 pini cu placuta de baza:
Am pornit de la driverul de la Quantum Torque: 37. Acesta contine functii pentru initializarea lcd-ului, scrierea de caractere si siruri, pozitionarea cursorului, si are definita o lista de caractere ce pot fi afisate. Trebuie modificat makefile-ul pentru atmega16 (in loc de atmega64 cum este el).
Trebuie modificat in lcd.h portul la care este conectat ecranul si fiecare pin in parte. In cazul meu, conform schemei de mai sus, definitiile sunt:
#define LCD_CLK_PIN (1<<PB1) #define LCD_DATA_PIN (1<<PB2) #define LCD_DC_PIN (1<<PB3) #define LCD_CE_PIN (1<<PB4) #define LCD_RST_PIN (1<<PB7) #define LCD_PORT PORTB #define LCD_DDR DDRB
Pentru a reprezenta nava si inamicii mi-am creat doua caractere speciale, SHIP si ENEMY, cu o forma particulara. Am creat si caracterul DELETE pentru a putea sterge toti cei 5 octeti care formeaza un caracter deodata.
{ 0x10, 0x28, 0x44, 0x28, 0x10 } SHIP
{ 0x54, 0x38, 0x7C, 0x38, 0x54 } ENEMY
{ 0x00, 0x00, 0x00, 0x00, 0x00 } DELETE
Folosind caracterul DELETE, pentru a sterge nava e suficient sa pozitionez cursorul unde se afla nava si sa trimit caracterul la LCD.
lcd_goto_xy_exact(px, py); lcd_chr(DELETE);
Pentru testarea codului, am realizat o schema in Proteus, pe care am simulat programul. Deoarece Proteus nu contine in mod implicit LCD-ul de Nokia 3310, am downloadat o librarie separata. Libraria o gasiti aici: downloads217.html. Dupa cum zice si pe site, nu functioneaza pe toate versiunile de Proteus, eu am instalat 6.9 cu SP5 si a mers.
Schema mea de test in Proteus:
Observatie: In aceasta schema nu mai sunt necesare rezistentele datorita modului in care a fost implementat lcd-ul in librarie. Pe placa trebuie neaparat sa existe divizorul de tensiune pentru ca lcd-ul sa functioneze corect.