Space Invaders

Autor: Boantă Dragoș-Petru

Grupa: 334CD

Introducere

Proiectul constă în realizarea unei clone jocului vide Space Invaders. In joc, jucătorul controlează un tanc care se mișcă orizontal în partea de jos a ecranului. Deasupra, extratereștrii sunt aranjați în formații și se deplasează în grup dintr-o parte în alta, coborând treptat către jucător. Scopul este de a distruge toți extratereștrii trăgând proiectile către ei, evitând în același timp focul inamic. Pe ecran există și scuturi (bariere) care pot proteja temporar jucătorul, dar acestea se degradează atât de la focul inamic, cât și de la propriile proiectile. Pe măsură ce elimină extratereștrii, viteza lor de deplasare și frecvența atacurilor cresc, crescând dificultatea jocului.

Mi-am dorit să realizez un joc de tip arcade, care să fie popular și ușor de jucat chiar și pe un ecran mai mic. Am ales Space Invaders deoarece este un joc intuitiv, ușor de înțeles pentru oricine, dar în același timp suficient de provocator încât să-ți mențină interesul și să nu devină plictisitor prea repede.

Descriere generală

Hardware Design

Lista componente

Nume componenta Model Protocol Datasheet
Microcontroller Arduino UNO S3/ATmega328P - ATmega328P Datasheet
Joystick Sensor HW-504 ADC Joystick Datasheet
Display LCD 240xRGBx320 TPM408-2.8 SPI/ST7789V ST7798V Datasheet
Display LCD 16×2 HW-061 I2C LCD Datasheet
2 x Buzzer Buzzer pasiv 5V PWM -
Buton Push Button GPIO -
Rezistori 4×440, 4x1k, 1x10k - -
Breadboard - -

Schema electrică

Detalii componente

  • Arduino UNO/ATmega328P – Reprezintă punctul central al montajului, de unde pleacă toate conexiunile către celelalte componente sau către breadboard. Asigură alimentarea breadboard-ului cu: 5V, 3.3V și GND.
  • Joystick – Trimite semnale de intrare (input) corespunzătoare mișcărilor utilizatorului. Semnalul este transmis prin ADC și este conectat astfel: VCC și GND direct la sursele de pe breadboard, iar cei doi pini de date (câte unul pentru fiecare axă) la breadboard și apoi la placa Arduino: pinul A0/PC0 pentru axa Y și A1/PC1 pentru axa X.
  • Display LCD 240xRGBx320 – Afișează jocul prin comunicare SPI și funcționează la 3.3V, spre deosebire de placa Arduino, care funcționează la 5V. Conexiunile sunt următoarele: GND la GND-ul breadboard-ului, iar VCC, RESET și LED la sursa de 3.3V. Ceilalți pini sunt conectați printr-un divizor de tensiune, care adaptează semnalele de la 5V la 3.3V, fiecare având sursa sa corespondentă de pe placă: CS la D10/PB2, DC la D9/PB1, MOSI la D11/PB3, SCK la D13/PB5. Exceptie face MISO, care e conectat direct la pinul D12/PB4 al plăcii.
  • Display LCD 16×2 – Afișează scorul curent și timpul rămas din joc prin transmitere I2C. Este conectat astfel: GND la GND, VCC la sursa de 5V, iar pentru comunicația I2C, SDA la pinul A4/PC4 și SCL la A5/PC5.
  • Două buzzere – Unul redă muzica jocului, iar celălalt efectele sonore (împușcături, sunete ale extratereștrilor etc.) folosindu-se de PWM. Sunt conectate în mod similar: minusul (–) la GND-ul breadboard-ului, iar plusul (+) la D6/PD6, respectiv D5/PD5.
  • Buton – Utilizat pentru a trage în joc la apăsare prin declansarea unei intreruperi. Are atașată o rezistență de 10kΩ si un condensator de 10uF pentru a realiza debouncing prin RC și este conectat la pinul D3/PD3 al plăcii Arduino.

Software Design

Mediu de Dezvoltare

M-am folosit de PlatformIO pentru dezvoltarea proiectului, codul fiind scris in C++

Librării

Majoritatea funcţiilor de comunicare cu hardware-ul au fost preluate din laborator (Si modificate pentru configuratia mea).

Pentru comunicarea cu Display-ul LCD 240xRGBx320 prin SPI, m-am folosit de librăria Adafruit ST7735 and ST7789V. A trebuit modificată putin, deoarece aceasta folosea in mod normal functia de delay de la un mediu arduino, si a trebuit sa fie schimbata sa o folosesca cea din PltaformIO.

Structura codului

Fiecare componenta hardare are cate un header si un fisier sursa in care se afla codul prin care comunic cu componenta respectiva.

Pe langa aceasta, mai sunt fisierele game.h si game.cpp care contin toate functiile pentru atat logica jocului, cat si cele care se ocupa de desenarea obiectelor jocului pe ecran.

Pentru a putea desena obiectele pe ecran, salvez informatiile despre ce pixeli trebuie desenati intr-o zona in sprites.h, respectiv sprites.cpp.

main.cpp se ocupa de rularea jocului, prin preluarea input-ul utilizatorului si afisand pe ecran rezultatul acestuia, cat si pentru a afisa pe ecran in ce stare este jocul: MENU, GAME, DEAD, OVER sau NEXT. Jocul ruleaza la 30 de cadre pe secunda.

Rezultate Obţinute

Download

Repository Github

Jurnal

  • 16.04.2025 - Alegere tema proiect si confirmare.
  • 29.04.2025 - Creare pagina de documentatie.
  • 30.04.2025 - Completat sectiunile de introducere + descriere generala.
  • 14.04.2025 - Finalizare prima versiune de hardware.
  • 18.05.2025 - Finalizare versiunea finala de hardware.
  • 21.05.2025 - Finalizare scrierea codului pentru comunicarea cu componentele hardware.
  • 22.05.2025 - Creare repository pe github.
  • 24.05.2025 - Finalizare prima versiune de software a jocului.
  • 26.05.2025 - Finalizare versiunea finala de software a jocului.

Bibliografie/Resurse

pm/prj2025/vstoica/dragos_petru.boanta.txt · Last modified: 2025/05/28 03:45 by dragos_petru.boanta
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0