Autorul poate fi contactat la adresa: Login pentru adresa
Proiectul va consta in implementarea unui joc 2D pe un sistem ATMega324, fighting genre, single-player, cu un AI simplist, in care scopul jucatorului este sa invinga un bot in simularea unei lupte. Ideea ce a influentat conceperea proiectului este consola GameBoy. Jucatorul se va putea deplasa stanga-dreapta, ghemui, sari, bloca atacuri, lovi(pana la un combo de 3 lovituri) si efectua un atac special ce necesita acumularea de puncte chakra. Regula de castig este last man standing. Jocul ar trebui sa fie fun to play si sa reprezinte o provocare pentru reflexe, precum si sa tina jucatorul treaz omorandu-si plictiseala.
Jucatorul va controla un personaj prin intermediul unui gamepad. Inputul va fi trimis catre CPU si va trece prin stagiul de validare, ce implica testarea coliziunilor in environment-ul din joc, respectiv jucator↔CPUPlayer, in ce circumstante(attack↔none, attack↔block_attack, invalid_move_1, invalid_move_2, etc.). Aceast pass de validare ruleaza bucla infinita a programului, ulterior executandu-se rendering pass-ul in blocul RenderingEngine. Procesorul va actualiza astfel display-ul in functie de starea obiectelor jocului si va trece la urmatoarea iteratie a buclei infinite asteptand input de la jucator.
Componente de baza:
1x ATMEGA324PA microcontroller
1x DIP40 socket
1x type B USB female connector
port pins
2x push button
2x red leds
2x Zener diode
1x QMIM016 quartz @16Mhz
2x 15pF capacitor
3x 100nF capacitor
1x 10uF capacitor
3x 100R resistor
3x 470R resistor
1x 1K resistor
1x 1.5K resistor
1x 10K resistor
Componente specifice:
1x ST7735 LCD Display
1x board for control buttons
18x female-female connector wires for pins
8x push buttons
Aplicatia deseneaza la sfarsitul buclei principale elementele de pe ecran, stergand inainte doar pixelii desenati ca elemente dinamice. Practic desenez personajele in pozitia anterioara cu culoarea de background in vechea iteratie, apoi cu culoarea aferenta, in noua pozitie. Fac aceasta optimizare deoarece un apel de stergere a ecranului consuma prea mult timp si e inutil sa redesenez pixelii statici. Am un personaj static, rosu, care ar trebui sa fie CPU controlled(nu este) si un personaj controlat de jucator care se poate deplasa si lovi de la butoane. Grafica personajelor este hardcodata in 2 matrici de 10×10: guard stance si fight stance. Am atasat codul. Am utilizat API-ul de desenare pe LCD-ul color ST7735.
Personajul galben poate fi controlat de jucator doar. Din pacate, nu am reusit sa implementez un AI si un algoritm de coliziune datorita din considerente de timp.
https://youtu.be/bEwenk8ENfk
Nu am reusit sa implementez un joc complet functional, ci doar un feature de control al caracterului galben. Am intampinat dificultatea de insuficienta in memorie si in viteza de desenare pe ecran(incercand matrice pentru screen buffer pentru a evita artefacte in desenare, vrand sa apelez o functie in stilul glutSwapBuffers()). De aceea nu am redesenat intreg ecranul ci doar personajele, utilizand matrice de pixeli de 10×10 pentru ele, dar desenand imaginea scalata 2x(4px pentru 1fragment).