Victor-Laurențiu MUNTEANU (78713) - The World's Hardest Game

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

Jocul presupune controlarea, cu ajutorul accelerometrului, catre zona verde a unei buline ce este afisata pe LCD.

Scopul jocului este sa ajungi la finish-ul de la ultimul nivel murind de cat mai putine ori.

M-am gandit .. cat de greu poate fi sa implementezi The World's Hardest Game pe LCD ^_^

E util pentru ca e distractiv si interesant.

Descriere generală

Bila/Patratul, controlat de Player, trebuia sa ajunga in zona verde (iesirea). Dar, in drum pot exista mai multe obstacle: bile/patrate care se misca si pe care, daca le atingi, mori si esti respawnat la inceputul nivelului, sau diverse obiecte statice.

Schema bloc

Hardware Design

Lista piese suplimentare:

  • Cablaj de test Sticlotextolit 90x150mm (luat de la electroniclight)
  • Pentru alimentare la 3.3V:
    • LP2950ACZ-3.3G STABILIZATOR DE TENSIUNE LDO NEREGLABIL 3.3V 0.1A (de la electroniclight)
    • Condensator Electrolitic de 10 uF la 63 V (de la optimus)
  • LCD grafic ILI9341 (de la optimus)
  • 3 butoane (de la optimus)
  • accelerometru ADXL345 (de la optimus)
  • 20 fire mama-mama
  • header de pini

Scheme electrice:

Software Design

ReadMe

Mediu de dezvoltare:

  • Folosind Programmer's Notepad am dat build la program folosind makefile-ul exact ca in laborator,

dar pentru scrierea codului am folosit Visual Studio 2017 + GitHub(in caz ca nu-mi mai mergea ceva sa dau repede Revert).

Librării şi surse 3rd-party:

Am combinat ce am gasit pe GitHub + ce am gasit in proiectele din anii trecuti si am obtinut:

  • ADXL345.h + i2c_master.h - pentru comunicarea cu accelerometrul
  • lcd.h + lcd_regs.h + spi.h - pentru comunicarea cu lcd-ul
  • font.c + levofontas.c - font-uri

Spre exemplu: in lcd.c am modificat afisarea caracterului astfel incat sa-mi scrie pe orizontala (Am aplicat formula de rotire a imaginii)

Algoritmi

Mi-am creat 2 vectori:

  1. de structuri ce retin parametrii unui nivel precum:
    • matrice de block-uri, unde fiecare element reprezinta culoarea unui block.
    • inaltimea si lungimea tileMap-ului precum si dimensiunea unui block (tile)
    • pozitia si dimensiunea start-ului si a finish-ului
    • mesajele de la inceputul fiecarui nivel
  2. de functii care folosesc aceste structuri
    • afiseaza tileMap-ul respectiv
    • initializeaza player-ul, si alte obiecte din joc,
    • citeste datele de la accelerometru
    • muta player-ul, verifica coliziunile si updateaza toate obiectele dinamice din scena

Toate aceste caracteristici pot fi variate. De aceea veti vedea ca fiecare nivel difera de cel precedent.

In aceste functii am loop-ul fiecarui nivel si pot decide cati si ce fel de inamici o sa am, comportamentul acestora ( sa mearga in linie, in cerc, sa se plimbe de la un punct la altul etc. ), forma player-ului, viteza sa, dimensiunea etc.

Deoarece matricile sunt destul de mari, le-am pus in memoria read-only a programului, deoarece nu am nevoie decat sa le accesez, nu sa le si modific.

Surse şi funcţii implementate

Definitie tileMap: matrice de 0 si 1 ( 0 = gol si 1 = block/tile) in care fiecare tile are o anumita lungime Detectarea coliziunilor

  • am implementat functii ce verifica coliziunile dintre
    • cerc si cerc
    • cerc si dreptunghi
    • cerc si tileMap
    • dreptunghi si dreptunghi
    • dreptunghi si tileMap ( mult mai eficienta decat “cerc si tileMap” )

Pentru coliziunea dintre dreptunghi si tileMap m-am uitat intre ce indexi se incadreaza player-ul si daca la acei indexi se afla un block ⇒ coliziune. Spre exemplu: player-ul (dreptunghi) e intre (45, 45) si (55, 55) iar tileSize-ul = 20 ⇒ verific doar perechile (2, 2), (2, 3), (3, 2) si (3, 3). E muuult mai eficient asa decat sa verific coliziunea player-ului cu cele 11 * 16 patrate din matrice.

Rezultate Obţinute

Un joc amuzant si greu de batut.

Watch Beginner's version:

A little harder level: (note: I played bad intentionally)

Concluzii

A fost greu … mai ales partea cu hardware-ul. Gaseam pe net 10 moduri in care sa-mi conectez accelerometrul + libraria pe care sa o downloadez ca sa-mi mearga si niciuna nu mergea. Si debugging-ul, la fel. Dupa ce am facut sa-mi mearga accelerometrul, nu-mi dadeam seama ce date primesc de la el (in ce interval) plus ca mi se bloca intr-una jocul si nu intelegeam de ce.

All in all … a fost greu, dar s-a meritat. Am cu ce ma lauda la cei 2 prieteni.

Download

Jurnal

Luni 14 Mai - cumparat toate piesele

Vineri 18 Mai - terminat in sfarsit tema la SO (si pe Windows)

Sambata 20 Mai - 7 ore de lipit si conectat piesele

Luni 22 Mai - mi-am facut lcd-u sa afiseze ce vreau

Marti 23 Mai - mi-am facut si accelerometrul sa-mi dea valori corecte

23-25 Mai - codat la greu, modularizat cod, facut 3 nivele usoare si 1 hardcore

25 Mai - PM Fair

componente_victor.jpg

componente_asamblate_victor.jpg

Initial player-ul era o pensula pe ecran

Dar dupa ce sterg mereu vechea sa pozitie … It becomes an eraser

Dupa transportul proiectului de la PM Fair inapoi acasa am realizat ca am cam stricat LCD-u …

Bibliografie/Resurse

  • ili9341:
  1. libraria: am folosit libraria gasita la un student din anii trecuti la care doar am schimbat orientarea scrisului (din vertical in orizontal): http://cs.curs.pub.ro/wiki/pm/prj2016/ddragomir/igorparvan?s[]=igor
  • adxl345:

Documentatia

  • Documentația în format PDF
pm/prj2018/ddragomir/victor.txt · Last modified: 2021/04/14 17:07 (external edit)
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