Table of Contents

Dungeon Explorer

Introducere

Proiectul consta intr-un joc de tip dungeon crawler genre Roguelike RPG, in care jucatorul controleaza un personaj ce exploreaza un labirint, infrunta inamici si colecteaza diferite resurse sau imbunatatiri, la fiecare explorare labirintul va fi diferit camerele vor fi generate procedural pe baza unor reguli astfel fiecare eplorare va aduce o experienta noua pentru jucator . Scopul proiectului este de implementa un joc cu mai multe mecanici precum logica de miscare, gestionarea resurselor, AI basic pentru inamici, interactiunea jucator cu mediul inconjurator si toatea acestea folosind niste resurse limitate. Idea de la care am pornit a fost pasiunea mea pentru jocuri, astfel m-am gandit cum as putea face un proiect care sa fie interesant pentru mine, astfel am ajuns la aceasta idee. Un joc de tip dungeon crawler poate poate fi simplificat pentru a fi adaptat la constrangerile hardware insa raman si o groaza de mecanici pentru a face jocul interant in continuare.

Descriere generală

Sistemul este compus din următoarele componente:

Hardware Design

Ecranul ILI9341 TFT LCD Display Module este conectat în modul 16-bit paralel la un Arduino Mega 2560. Pinii de comunicație ai ecranului funcționează la 3.3V, în timp ce plăcuța oferă semnale la 5V. Pentru a realiza conexiunea dintre ecran și microcontroller am utilizat un TFT Shield V2.2, care realizează conversia nivelurilor de tensiune.

Shield-ul se conectează la plăcuță astfel:

Această mapare a pinilor nu a fost realizată manual, deoarece shield-ul permite un singur mod de conectare la Arduino Mega.

Conexiunile dintre shield și ecran sunt următoarele:

Pentru conectarea joystick-ului am utilizat:

Acești pini au fost aleși deoarece semnalele VRx și VRy sunt citite analogic.

Pentru conectarea keypad-ului am utilizat:

Acești pini au fost aleși deoarece suportă întreruperi de tip PCINT, necesare pentru detectarea apăsării butoanelor.

Buzzer-ul a fost conectat la pinul digital 13, deoarece este necesar un pin cu suport PWM pentru controlul acestuia.

Software Design

Mediu de dezvoltare:
Librarii si surse utilizate:
Functionalitati din laborator:
Flow-ul jocului:

La pornirea jocului se aude un sunet de la buzzer care semnalizeaza inceperea partidei. Apoi se incarca primul nivel, iar jucatorul intra efectiv in joc care poate dura atata timp cat doreste. La final daca hp-ul jucatorului a ajuns la 0 atunci apare un ecran de Game Over care arata cate camere a parcurs si cati inamici a invins. Aceste statistici sunt afisate pentru a permite inregistrarea recordurilor astfel ca player-ul sa aiba motivatia sa joace din nou.

Implementarea jocului:

Pentru a implementa jocul am definit mai multe clase pentru a modulariza codul:

Implementarea clasei Game:

In aceasta sectiune voi descrie functiile principale din cadrul clasei Game

Jocul functioneaza asa cum mi-am propus deoarece am facut mai multe expeditii in care am explorat mai multe camere, inclusiv interactiunea cu inamicii, chest-uri si proiectile.

Optimizari facute:

Desi Arduino Mega are 8 KB de SRAM pentru jocul meu aceasta dimensiune este prea mica. Astfel m-am folosit de memoria flash a microcontrelui. Toate sprite-urile folosite in jocul meu au fost incarcate in memoria flash folosind in cod atributul PROGMEM. Fiecare sprite are in medie dimensiunea 24×24 pixeli. Nivelele tot sunt salvate in memoria flash. Am in total 30 de nivele, initial jucatorul se afla la nivelul 0 care este practic gol, in acest timp urmatorul nivel este deja decis, care va fi nivelul urmator este ales la random.

Miscarea entatilor pe ecran este la fel optimizata. Astfel este redesenat doar dreptunghiul din ecran care se modifica si este marginit de pozitia veche si pozitia noua a entitatii. Apoi sprite-urile sunt reprezentate ca niste vectori de 32×32, 16×16, 24×24 elemente dar au si portiuni care sunt transparente astfel am ales o culoare care va reprezenta ca acel pixel este transparent si astfel el nu va fi desenat. Astfel am incercat sa compensez faptul ca placuta are o frecventa a procesorului mai mica ca un procesor normal si sa nu am ca personajul apare si dispare de pe ecran, dar se modifica doar acei pixeli care trebuie redesenati.

Concluzii, Rezultate

Acest proiect m-a ajutat foarte mult sa inteleg cum sa folosesc mai bine microcontrolerele cum ar fi Arduino si cum sa lucrez cu un ecran care are un refresh rate mai mic Ca rezultate proiectul este finisat si jocul este interesant de jucat in timpul liber.

Link demo: demo

Download

dungeonexplorer.zip

https://github.com/SanduCondorache/DungeonExplorer

Bibliografie/Resurse

Arduino Mega datasheet 1

Arduino Mega datasheet 2

TFT Shield v2.2