~alessandro-bruni/+junk/infografica

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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include "Game.h"
#include <cstdlib>

/**
 * Costruttore, crea le pedine del gioco
 */
Game::Game(int n_players, Terrain *t, int humanSpeed, int computerSpeed) : n_players(n_players),
	terrain(t), adv(new Computer*[n_players])
{
	u = v = 0;

	flag = new Flag(terrain);
	human = new Human(terrain, humanSpeed, flag);
	for (int i=0; i<n_players; i++)
		adv[i] = new Computer(terrain, computerSpeed, human);
}

/**
 * Dealloca la memoria occupata
 */
Game::~Game()
{
	delete flag;
	delete human;
	for (int i=0; i<n_players; i++)
		delete adv[i];
	delete []adv;
}

void Game::setU(int u)
{
	this->u = u;
}

void Game::setV(int v)
{
	this->v = v;
}

/**
 * Calcola il tempo trascorso in ms
 */
double Game::deltaT()
{
	long newT = glutGet(GLUT_ELAPSED_TIME);
	float delta = static_cast<float>(newT - lastT)/1000.0;
	lastT = newT;
	return delta;
}

void Game::start()
{
	lastT = glutGet(GLUT_ELAPSED_TIME);
}

void Game::resume()
{
	lastT = glutGet(GLUT_ELAPSED_TIME);
}

/**
 * Disegna l'intera scena, chiamando le funzioni di disegno delle varie parti
 */
void Game::draw()
{
	// ripulisco la scena
	glClearColor(0.23921568627450981f, 0.396078431372549f, 0.62745098039215685f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();

	glEnable(GL_DEPTH_TEST);
	glEnable(GL_CULL_FACE);
	glCullFace(GL_BACK);
	glShadeModel(GL_SMOOTH);

	glRotatef(alpha - 90, 0, 1, 0);

	// luci
	GLfloat black[4] = { 0, 0, 0, 1 };

	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, black);
	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);

	glEnable(GL_LIGHT0);
	glEnable(GL_LIGHT1);

	GLfloat aLite0[4] = { 0.1f, 0.1f, 0.1f, 1.0f };
	GLfloat dLite0[4] = { 1.1f, 0.9f, 0.9f, 1.0f };
	GLfloat sLite0[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
	GLfloat posLite0[4] = { -1024.0f, 1024.0f, -1024.0f, 1.0f };
	glLightfv(GL_LIGHT0, GL_AMBIENT, aLite0);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, dLite0);
	glLightfv(GL_LIGHT0, GL_SPECULAR, sLite0);
	glLightfv(GL_LIGHT0, GL_POSITION, posLite0);

	GLfloat aLite1[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
	GLfloat dLite1[4] = { 0.3f, 0.3f, 0.3f, 1.0f };
	GLfloat sLite1[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
	GLfloat posLite1[4] = { 2048.0f, 1024.0f, 2048.0f, 1.0f };
	glLightfv(GL_LIGHT1, GL_AMBIENT, aLite1);
	glLightfv(GL_LIGHT1, GL_DIFFUSE, dLite1);
	glLightfv(GL_LIGHT1, GL_SPECULAR, sLite1);
	glLightfv(GL_LIGHT1, GL_POSITION, posLite1);

	// Oggetti di scena
	human->display();
	terrain->drawTerrain(human->getX(), human->getZ());
	
	for (int i = 0; i< n_players; i++)
		adv[i]->display();
	flag->display();
}

/**
 * Calcola un frame del gioco, muovendo i giocatori e ritornando lo stato
 * risultante.
 */
enum Game::Status Game::frame()
{
	float dT = deltaT();
	flag->update(dT);
	if (human->move(v, u, dT, alpha))
		return Won;
	for (int i = 0; i< n_players; i++)
		if (adv[i]->update(dT))
			return Lost;
	draw();
	return Started;
}

void Game::dAlpha(float dAlpha) {
	alpha += dAlpha;
}