Arcanoid 3D

16
Arkanoid 3D Relazione del progetto per il corso di Principi di Computer Graphics Roberto Zandonati mat. 132945 19 gennaio 2008 1

description

The project is inspired by the famous 2D game Arkanoid, extending it in the 3D world.

Transcript of Arcanoid 3D

Page 1: Arcanoid 3D

Arkanoid 3D

Relazione del progetto per il corso di Principi di Computer

Graphics

Roberto Zandonati mat. 132945

19 gennaio 2008

1

Page 2: Arcanoid 3D

Indice

1 Specifiche del progetto 3

2 Funzionamento 32.1 Controllo delle collisioni . . . . . . . . . . . . . . . . . . . . . 42.2 Collisione della sfera con un mattoncino . . . . . . . . . . . . 42.3 Collisione della sfera con un lato del mondo . . . . . . . . . . 42.4 Collisione della sfera con il vaus . . . . . . . . . . . . . . . . . 42.5 Collisione di un mattoncino bonus con il vaus . . . . . . . . . 7

3 Trasformazioni 8

4 Matrici e stack 104.1 Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

5 Geometrie 11

6 Bonus (e malus) 11

7 Aiuti nel gioco 12

8 Gestione eventi 128.1 Eventi della tastiera . . . . . . . . . . . . . . . . . . . . . . . 128.2 Eventi del mouse . . . . . . . . . . . . . . . . . . . . . . . . . 12

9 UML Class Diagram 13

10 Possibili sviluppi 16

2

Page 3: Arcanoid 3D

1 Specifiche del progetto

Il progetto prende spunto dal noto gioco 2D Arkanoid, estendendolo nel mon-do 3D.Per la creazione del progetto, come da specifiche, mi sono basato sulle miegeometrie e sulle mie matrici per effettuare le trasformazioni.L’unica eccezzione per quanto riguarda le matrici di trasformazione riguardail posizionamento del punto di vista. Per spostarlo infatti ho utilizzato infattile trasformazioni di openGl; questo per un fatto di comodita.

2 Funzionamento

La classe principale per la gestione del gioco e la classe GLEventCatcher.Il ruolo di questa classe e quello di aggiornare tutte le geometrie, ossia laposizione della sfera, la posizione del vaus, la posizione dei mattoncini bonuscolpito e la posizione del mondo di gioco.Le operazioni principali che questa classe esegue ad ogni operazioni sono:

• posizionamento del mondo utilizzando le funzioni offerte da openGL;

• creazione di un nuovo gioco, se richiesto;

• aggiunta di una nuova sfera, se richiesta;

• disegnare il mondo;

• aggiornare la posizione del vaus in accordo con gli eventi creati dell’u-tente e mostrarlo a video;

• aggiornare e controllare la posizione delle sfere;

• disegnare i mattoncini;

• eventualmente disegnare il terreno in modo da non far morir le sfere;

• aggiornare il punteggio e le vite;

• aggiornare i valori globali;

• creare un nuovo livello se quello corrente e stato terminato.

All’interno della lista di operazioni sopra elencate, la piu importante esenza dubbio l’operazione che aggiorna la posizione delle sfere, in quanto sidevono anche controllare eventuali collisioni, e gestirle di conseguenza.

3

Page 4: Arcanoid 3D

2.1 Controllo delle collisioni

Le eventuali collisioni delle sfere con gli ostacoli presenti nel mondo vengonocontrollate dalla procedura checkCollisions() implementata della classe GL-Sphere.Le collisioni che possono avvenire sono:

• Collisione della sfera con un mattoncino

• Collisione della sfera con un lato del mondo

• Collisione della sfera con il vaus

L’idea di base per il controllo delle collisioni delle sfere e quella di con-trollare la distanza tra il centro della sfera e l’ostacolo.Inoltre e presente un altro tipo di collisione che e la collisione di un matton-cino bonus con il vaus.

2.2 Collisione della sfera con un mattoncino

Per controllare se la sfera e entrata in collisione con qualche mattoncinoeffettuo i controlli relativi alla distanza del centro della sfera dal centro diogni singola faccia di ogni mattoncino. Affinche una sfera collida con unmattoncino e necessario che la sfera entri nel mattoncino.

2.3 Collisione della sfera con un lato del mondo

Al contrario di quanto avviene nei controlli precedenti, affinche una sferacollida con un lato del mondo basta che quest’ultima vi sia molto vicina.Questo in quanto i movimenti sono dei movimenti discreti e non continui equindi non e possibile far rimbalzare la sfera l’istante esatto in cui questabatte con un ostacolo.Quindi una sfera rimbalza su un lato del mondo quando e molto vicina albordo stesso oppure quando lo supera.

2.4 Collisione della sfera con il vaus

Quando la sfera collide con il vaus, le trasformazioni che devono essere ap-plicate dipendono dal punto in cui la sfera lo collide.Se questo punto e vicino al centro allora viene applicata la riflessione normale,altrimenti se il punto e vicino al bordo destro o sinistro del vaus viene appli-cata una riflessione sulle coordinate X ed Y, mentre se il punto di collisionee vicino al bordo superiore oppure inferiore viene applicata una riflessionesulle coordinate Y e Z.

4

Page 5: Arcanoid 3D

Algoritmo 1 Collisione sfera con un mattoncino

center = coordinate del centro della sferafor all b bricks not yet hit do{Collisione sulla bottom-face di b}∆x = distanza di center.x dalla coordinata x della bottom face di b∆y = distanza di center.y dalla coordinata y della bottom face di b∆z = distanza di center.z dalla coordinata z della bottom face di bif ∆x ≤ brickWidth

2and ∆y ≤ brickHeight

2and ∆z ≤ brickDepth

2then

collisione sulla bottom face di b

{Collisione sulla front-face di b}∆x = distanza di center.x dalla coordinata x della front face di b∆y = distanza di center.y dalla coordinata y della front face di b∆z = distanza di center.z dalla coordinata z della front face di bif ∆x ≤ brickWidth

2and ∆y ≤ brickHeight

2and ∆z ≤ brickDepth

2then

collisione sulla front face di b

{Collisione sulla top-face di b}∆x = distanza di center.x dalla coordinata x della top face di b∆y = distanza di center.y dalla coordinata y della top face di b∆z = distanza di center.z dalla coordinata z della top face di bif ∆x ≤ brickWidth

2and ∆y ≤ brickHeight

2and ∆z ≤ brickDepth

2then

collisione sulla top face di b

{Collisione sulla back-face di b}∆x = distanza di center.x dalla coordinata x della back face di b∆y = distanza di center.y dalla coordinata y della back face di b∆z = distanza di center.z dalla coordinata z della back face di bif ∆x ≤ brickWidth

2and ∆y ≤ brickHeight

2and ∆z ≤ brickDepth

2then

collisione sulla back face di b

{Collisione sulla right-face di b}∆x = distanza di right.x dalla coordinata x della right face di b∆y = distanza di right.y dalla coordinata y della right face di b∆z = distanza di right.z dalla coordinata z della right face di bif ∆x ≤ brickWidth

2and ∆y ≤ brickHeight

2and ∆z ≤ brickDepth

2then

collisione sulla right face di b

{Collisione sulla left-face di b}∆x = distanza di left.x dalla coordinata x della left face di b∆y = distanza di left.y dalla coordinata y della left face di b∆z = distanza di left.z dalla coordinata z della left face di bif ∆x ≤ brickWidth

2and ∆y ≤ brickHeight

2and ∆z ≤ brickDepth

2then

collisione sulla left face di b5

Page 6: Arcanoid 3D

Algoritmo 2 Collisione sfera con un lato del mondo

center = coordinate del centro della sferaif (| center.x + raggio -worldSize

2| ≤ 0.1) or (center.x + raggio ≥ worldSize

2)

thencollisione con la right face del mondo

if (| center.x - raggio +worldSize2| ≤ 0.1) or (center.x - raggio ≤ −worldSize

2)

thencollisione con la right face del mondo

if (| center.y + raggio -worldSize2| ≤ 0.1) or (center.y + raggio ≥ worldSize

2)

thencollisione con la right face del mondo

if (| center.y - raggio -worldSize2| ≤ 0.1) or (center.y - raggio ≤ −worldSize

2)

thencollisione con la right face del mondo

if (| center.z + raggio -worldSize2| ≤ 0.1) or (center.z + raggio ≥ worldSize

2)

thencollisione con la right face del mondo

if (| center.z - raggio -worldSize2| ≤ 0.1) or (center.z - raggio ≤ −worldSize

2)

thencollisione con la right face del mondo

6

Page 7: Arcanoid 3D

Algoritmo 3 Collisione sfera con un il vaus

center = coordinate del centro della sferavaus = coordinate del centro del vausif (center.y-raggio ≤ worldSize

2+ vausHeight) and ((center.x ≥ vaus.x -

vausWidth2

) and (center.x ≤ vaus.x + vausWidth2

)) and ((center.z ≥ vaus.z -vausDepth

2) and (center.z ≤ vaus.z + vausDepth

2)) then

if (|center.x - vaus.x| ≤ vausWidth4

) and (|center.z - vaus.z| ≤ vausDepth4

)then

Collisione con il vaus nel centroelse

if |center.x - vaus.x| ≥ vausWidth4

thenCollisione sul bordo sinistro o destro

elseCollisione sul bordo superiore o inferiore

2.5 Collisione di un mattoncino bonus con il vaus

In Arkanoid3D per prendere un bonus si deve, una volta colpito, prenderecol il vaus il mattoncino che scendera. Inoltre non e sufficiente intersecare ilmattoncino bonus con il vaus, ma lo si deve intersecare nel centro, altrimentinon si avranno i vantatti (o svantaggi) portati dal bonus/malus.

Algoritmo 4 Collisione bonus con il vaus

for all hit bonus brick b docenter = centro di bvaus = centro del vausif ((center.x ≥ vaus.x - vausWidth

2) and (center.x ≤ vaus.x + vausWidth

2))

and ((center.y ≥ vaus.y) and (center.y ≤ vaus.y + vausHeight)) and((center.z ≥ vaus.z - vausDepth

2) and (center.z ≤ vaus.z - vausDepth

2)) then

colpito bonus brick brimuovi b dalla lista dei mattoncini colpiti

7

Page 8: Arcanoid 3D

3 Trasformazioni

La funzione checkCollision() restituisce il lato sul quale e stata affettuata lacollisione ed i valori che restituisce sono ripostati in tabella 1

X, -X Collisione sulle faccia sinistra/destra di un mattoncinoY, -Y Collisione sulla faccia in alto/in basso di un mattoncinoZ, -Z Collisione sulla faccia in alto/in basso di un mattoncinoBX, -BX Collisione sulle faccia sinistra/destra del mondoBY, -BY Collisione sulla faccia in alto/in basso del mondoBZ, -BZ Collisione sulla faccia posteriore/anteriore del mondoVAUSMIDDLE Collisione con il vaus nel centroVAUSBORDERX Collisione con il vaus su lbordo superiore o inferioreVAUSBORDERZ Collisione con il vaus sul vordo destro o sinistroDIE Collisione con la faccia inferiore del mondo, senza la

presenza del terrenoNONE Nessuna collisione

Tabella 1: Tabella delle collisioni

In base al tipo di collisione devono essere apportate le opputune trasfor-mazioni, come e possibile notare nello pseudocodice 5

8

Page 9: Arcanoid 3D

Algoritmo 5 Riflessioni

collision = checkCollision()if collision = NONE then

returnstack.pushMatrix(rotationMatrixZ(-angleZ))stack.pushMatrix(rotationMatrixY(-angleY))if (| collision | = X) or ((| collision | = BX) and (lastCollision 6= collision))then

lastCollision = collisionstack.puskMatrix(scaleMatrix(-1, 1, 1))

if (| collision | = Y) or ((| collision | = BY) and (lastCollision 6= collision))then

lastCollision = collisionstack.puskMatrix(scaleMatrix(1, -1, 1))

if (| collision | = Z) or ((| collision | = BZ) and (lastCollision 6= collision))then

lastCollision = collisionstack.puskMatrix(scaleMatrix(1, 1, -1))

stack.pushMatrix(rotationMatrixZ(angleZ))stack.pushMatrix(rotationMatrixY(angleY))

9

Page 10: Arcanoid 3D

4 Matrici e stack

Tutte le classi per la gestione delle matrici si trovano nel package math; e nel-lo specifico nel package math.matrix2D sono presenti le classi per la gestionedelle matrici e dei vertici nel mondo 2D, mentre nel package math.matrix3Dsono presenti le classi per la gestione delle matrici e dei vertici nel mondo3D.Infine la classe GLMath, contenente tutti metodi statici, si occupa della ge-stione della moltiplicazione di matrici.

4.1 Stack

Lo stack per le geometrie e implementato nella classe GLMatrixStack, laquale contiene una variabile di tipo java.util.Stack di GLMatrix3D, e tutti imetodi principali per operare sullo stack, che sono:

• pushMatrix : incerisce una matrice in testa allo stack;

• popMatrix : estrae e restituisce la matrice in testa allo stack;

• getCurrentStateMatrix : restituisce lo stato corrente moltiplicando lematrici presenti nello stack;

• clearStack : pulisce lo stack.

La funzione principale dello stack e la funzione getCurrentStateMatrix laquale moltiplica tra loro le matrici nello stack, in un ordine ben specifico.Se per esempio nell stack sono presenti, partendo dal basso, le matrici m1,m2, m3 lo stato corrente e dato da m3(m2*m1).Cio permette di avere l’ultima trasformazione che si vuole eseguire in ci-ma allo stack, inserendo quindi le trasformazioni nello stack nell’ordine diesecuzione e non nell’ordine inverso.

10

Page 11: Arcanoid 3D

5 Geometrie

Le geometrie implementate sono tutte nel package geometry.La classe principale e l’interfaccia GLBasicGeometry in quanto in questainterfaccia sono presenti i metodi base che tutte le interfaccie devono avere,che sono:

• display : metodo utilizzato per la visualizzazione a video;

• setCurrentState: metodo per impostare lo stato corrente del mondoall’oggetto.

Un’altra classe importante per le geometrie e la classe GLColor la quale hacome compito quello di gestire i colori di una geometria. Questa classe hatre variabili, r, g, b che sono rispettivamente i colori rosso, verde e blu.Importante e anche la classe GLVertex che ha come compito la gestione diun vertice nel mondo 3D. Questa classe ha un ruolo di primaria importanzanelle geometrie in quanto tutte le geometrie piu complesse altro non sono chepunti (e nello specifico GLVertex ) collegati tra loro in un determinato modo.Inoltre la classe GLVertex estende la classe GLColor, questo fa si che il colorenon sia associato ad una superficie ma ad un singolo vertice, in modo tale daottenere degli effetti grafici piacevoli.

6 Bonus (e malus)

Nel gioco sono anche presenti dei bonus e dei malus.Quando un mattoncino contenente un bonus oppure un malus viene colpito,questo cade verso il basso e solamente quando, e se, colpira il vaus l’effettodel mattoncino avra luogo.Sia i bonus che i malus sono delle classi che devono essere implementateestendendo la classe GLBrickBonus e devono essere messe nel package geo-metry.glBrick.bonusBrick.Se si vuole implementare un bonus e necessario semplicemente che la clas-se sovrascriva il metodo updateValues nel quale scrivere le operazioni chedevono essere eseguite se il bonus viene preso, e nel costruttore impostare,eventualmente, il percorso della texture.La cosa interessante e che il programma si accorge automaticamente, al suoavvio, della presenza di un nuovo bonus e quindi allo sviluppatore del nuovobonus e richiesto solamente la creazione di una nuova classe senza che ne-cessiti di metter mano ad altro codice, aumentanto cosı anche il livello disicurezza.

11

Page 12: Arcanoid 3D

7 Aiuti nel gioco

Per aiutare l’utente finale nel gioco sono stati inseriti come aiuti delle circon-ferenze di raggio variabile sui lati del mondo, escluso su quello superiore.Il raggio di queste circonferenze aumenta se la pallina si allontana, mentrediminuisce se la pallina si avvicina.Sulla circonferenza disegnata sul lato inveriore del mondo e presente ancheuna linea che indica la direzione della pallina, e questa linea e tanto piu cortaquanto maggiore e l’angolo di rotazione sull’asse Z. Cio permette di avere unaidea migliore dello spostamento della sfera.Inoltre e presente un piccolo trucco che consiste nel riuscire a muovere il vausanche quando il gioco e‘ in pausa.

8 Gestione eventi

In questa sezione verranno riportate le liste degli eventi che il programmagestisce.

8.1 Eventi della tastiera

La tabella seguente mostra gli eventi della tastiera che sono gestiti dal gioco:

Pulsante EventoSpazio Nuovo giocoA ruota il mondo in senso antiorarioD ruota il mondo in senso orarioW ruota il mondo in avantiS ruota il monto in indietroR ripristina il punto di vistaT ricomincia il giocoFreccia destra muove il vaus a destraFreccia sinistra muove il vaus a sinistraFreccia in alto muove il vaus in avantiFreccia in basso muove il vaus indietro

8.2 Eventi del mouse

Gli eventi del mouse gestiti dal gioco sono invece i seguenti:

• Mouse dragged con il tasto sinistro del mouse: ruota il mondo a destra,sinistra, avanti, indietro a seconda del delta dello spostamento;

12

Page 13: Arcanoid 3D

Figura 1: Class-diagram generico

• Mouse dragged con il tasto destro del mouse: zoom-in se il mouse sisposta verso il basso, zoom-out se invece si sposta verso l’alto.

9 UML Class Diagram

In figura 1 e riportato il class diagram generico, mentre in figura 2 e riportatoil class diagram relativo alle matrici (o trasformazioni) ed in figura 3 quellorelativo alle geometrie implementate.

13

Page 14: Arcanoid 3D

Figura 2: Class-diagram delle trasformazioni

14

Page 15: Arcanoid 3D

Figura 3: Class diagram delle geometrie

15

Page 16: Arcanoid 3D

10 Possibili sviluppi

I possibili sviluppi futuri di questo progetto riguardano principalmente lacollision-detection che deve essere raffinata.Mentre come sviluppi secondari vi e quella di migliorare l’interfaccia grafica,inserendo delle texture migliori e migliorare l’estetica delle sfere.

16