This repository has been archived by the owner on Jul 30, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrelazione-progetto-programmazione-2020-2021-Iacomino-Mancini.tex
112 lines (85 loc) · 7.36 KB
/
relazione-progetto-programmazione-2020-2021-Iacomino-Mancini.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{graphicx} % Allows you to insert figures
\usepackage{amsmath} % Allows you to do equations
\usepackage{fancyhdr} % Formats the header
\usepackage{geometry} % Formats the paper size, orientation, and margins
\usepackage[english]{babel}
\usepackage{csquotes}
\linespread{1.25} % About 1.5 spacing in Word
\setlength{\parindent}{0pt} % No paragraph indents
\setlength{\parskip}{1em} % Paragraphs separated by one line
\renewcommand{\headrulewidth}{0pt} % Removes line in header
\geometry{legalpaper, portrait, margin=1in}
\setlength{\headheight}{14.49998pt}
\begin{document}
\begin{titlepage}
\begin{center}
\vspace*{5cm}
\Huge{ASCII Adventure}
\vspace{0.5cm}
\LARGE{Relazione del progetto}
\vspace{0.25cm}
\large{Corso di Programmazione (00819) 2020/21}
\vspace{0.25cm}
\large{D. Iacomino, L. Mancini}
\vspace{3 cm}
\Large{30 Gennaio 2022}
\vspace{0.25 cm}
\Large{Università di Bologna}
\vfill
\end{center}
\end{titlepage}
\setcounter{page}{2}
\pagestyle{fancy}
\fancyhf{}
\rhead{\thepage}
\lhead{ASCII Adventure}
\section*{Caratteristiche del progetto}
ASCII Adventure è un videogame platfrom in grafica ASCII con una mappa dinamica di livelli generati proceduralmente scritto in C++.
Il protagonista controllato dall'utente può muoversi lateralmente, saltare e attaccare i nemici piombando su di loro dall'alto o sparando.
L'accesso ai livelli successivi avviene tramite delle porte che sono poste sulle piattaforme più alte del livello, mentre quelle precedenti sono sempre nell'angolo in basso a sinistra.
La mappa contiene bonus che incrementano gli attributi del protagonista o ne migliorano le capacità quali: incremento dei punti vita, incremento delle munizioni dell'arma equipaggiata, incremento della quantità di munizioni trasportabili, capacità di eliminare i nemici con un solo proiettile; contiene anche delle trappole che infliggono danno al protagonista e che sono logorate dal contatto con esso fino a rompersi.
Il punteggio viene aumentato raccogliendo i punti esperienza disseminati nella mappa.
\section*{Divisone del lavoro}
Il lavoro è stato diviso in:
\begin{itemize}
\item Gestione del ciclo di gioco e caratterizzazione degli elementi della mappa (D. Iacomino)
\item Generazione procedurale della mappa e strutture dati (L. Mancini)
\end{itemize}
\section*{Elementi del gioco e loro funzionamento}
\subsection*{Gestione del ciclo di gioco}
\subsubsection{Game}
Il fulcro del gioco è contenuto in Game, che valuta la legalità delle azioni proposte dalla logica di gioco e dall'utente e le mette in atto, disegna e colora gli elementi che compongono la mappa e gestisce la velocità dei movimenti.
\subsubsection{Action}
Le azioni degli oggetti che hanno movimento sono caratterizzate in Action. Ogni azione contiene informazioni su come muovere il personaggio, chi è l'autore del moviemento, qual è la rappresentazione grafica dell'oggetto su cui si è agito, le coordinate in cui è avvenuta l'azione e quanti cicli aspettare prima di rispondere nuovamente alle azioni proposte dall'utente o dalla logica di gioco, così da rendere visibili alcune animazioni.
\pagebreak
\subsection{Caratterizzazione degli elementi della mappa}
La mappa è una Doubly Linked List che contiene i livelli; ogni livello contiene elementi statici o dinamici, contenuti a loro volta in delle Doubly Linked List.
\subsubsection{Elementi statici}
Tra questi figurano le piattaforme e le porte di accesso ai livelli che sono inamovibili, dopodiché ci sono gli elementi raccoglibili dal giocatore quali: gli XP che sono semplici oggetti della classe Object aventi una posizione e una rappresentazione logico-grafica (enum class TileType), gli oggetti bonus e malus delle rispettive classi che hanno un tipo indicante quale bonus/malus attribuire al giocatore e in che quantità.
\subsubsection{Elementi dinamici}
Tra questi i proiettili che si muovono orizzontalmente e interagiscono con gli elementi di gioco statici o dinamici all'imaptto oppure escono dalla visuale.
Ci sono poi i nemici che hanno un pattern di movimento orizzontale, possono danneggiare il protagonista entrando in contatto con esso e possono essere eliminati dai proiettili o da un contatto diretto con il protagonista.
Infine c'è il protagonista che possiede un'arma da fuoco, può muoversi liberamente e interagire con gli elementi dinamici della mappa.
In comune tra i nemici e il protagonista c'è un array che registra le ultime mosse di questi ultimi e che viene consultato da Game::logic() per determinare la prossima azione mostrata a schermo.
\section*{Generazione procedurale della mappa e strutture dati}
\subsection{Generazione procedurale della mappa}
\subsection{Level}
Level si appoggia a cmath, LinkedList, MiscFunctions e le classi che rappresentano elementi del gioco (Hero, Enemy ecc.)
La classe genera randomicamente e contiene un livello del gioco; tutte le operazioni di generazione random vengono chiamate all'interno del costruttore, senza necessitare di manipolazione esterna alla classe.
Tutti gli elementi del livello tranne l'eroe sono memorizzati in delle Linked List all'interno della classe.
I metodi che generano terreno ed entità fanno uso delle funzioni di MiscFunctions, principalmente diceDistribution(), per calcolare, tra altre cose, la lunghezza delle piattaforme, la loro posizione, la probabilità che hanno di essere generate, il numero totale di entità e la loro posizione all'interno del livello.
Il generatore delle piattaforme parte da una piattaforma radice a metà del livello, immediatamente sopra il terreno, e continua a generare figli ricorsivamente accanto alle piattaforme preesistenti; la probabilità che venga generata una piattaforma figlia diminuisce ad ogni iterazione.
I generatori delle entità selezionano randomicamente terreno all'interno del livello sopra il quale posizionare gli oggetti; nel caso in cui lo spazio sopra il terreno selezionato sia ostruito, il generatore procede scorrendo sequenzialmente la lista del terreno finché non viene trovato un luogo adeguato.
\subsubsection{MiscFunctions}
Misc è un namespace di funzioni per generare numeri random che utilizza la libreria <cmath>.
La funzione diceThrows() genera numeri random tra 0 e un reale positivo secondo la distribuzione di probabilità di lanci di dadi; diceDistribution() estende diceThrows() aggiungendo la possibilità di manipolare la moda della distribuzione e di selezionare intervalli con estremo inferiore diverso da 0.
\subsection{Strutture dati}
\subsubsection{LinkedList}
LinkedList è l'implementazione di una linked list con doppi puntatori al nodo precedente e successivo.
Il tipo dei campi data è un template, in modo che, nel momento in cui viene istanziato un oggetto LinkedList, possa essere scelto qualsiasi tipo di dato da memorizzare.
Essendo un template, l'implementazione dei metodi della classe LinkedList deve essere contenuta in un file header, siccome il compilatore deve essere in grado di vedere l'implementazione del metodo che usa un template per generare codice per tutti i casi d'uso.
La lista memorizza il numero di nodi che contiene; inoltre permette la manipolazione dei nodi anche tramite l'operatore [], comportandosi come se fosse un array.
\pagebreak
\end{document}