-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboxer.h
287 lines (277 loc) · 8.86 KB
/
boxer.h
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
#ifndef BOXER_H
#define BOXER_H
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//auxiliar de mesh
typedef struct
{
//Vertex coordinate
double X;
double Y;
double Z;
//Vertex texture coordinate
double U;
double V;
} VERTICES;
typedef struct
{
VERTICES * VTX;
int qtdV;
}PLANO;
using namespace std;
//Classe que define o objeto boxeador
class Boxer
{
//centro e raio do boxeador
GLfloat cX;
GLfloat cY;
GLfloat cZ;
GLfloat cX_I;
GLfloat cY_I;
GLfloat cZ_I;
GLfloat radiuS;
GLfloat altura;
//raio imaginario
GLfloat radiusImaginary;
//booleano de se o boxeador existe
bool valid = false;
//identificador de cor (jogador ou inimigo)
string color;
//identificador de angulo de direção
GLfloat angle;
//guarda o angulo inicial
GLfloat angleInicial;
//identificadores de angulos iniciais do braço esquerdo
GLfloat anglebraco11_inicial=45;
GLfloat anglebraco12_inicial=-90;
GLfloat anglebraco13_inicial=-20;
GLfloat anglebraco14_inicial=30;
//identificadores de angulos atuais do braço esquerdo
GLfloat anglebraco11=45;
GLfloat anglebraco12=-90;
GLfloat anglebraco13=-20;
GLfloat anglebraco14=30;
//identificadores de angulos iniciais do braço direito
GLfloat anglebraco21_inicial=45;
GLfloat anglebraco22_inicial=-90;
GLfloat anglebraco23_inicial=20;
GLfloat anglebraco24_inicial=-30;
//identificadores de angulo atuais do braço direito
GLfloat anglebraco21=45;
GLfloat anglebraco22=-90;
GLfloat anglebraco23=20;
GLfloat anglebraco24=-30;
//identificadores de angulos iniciais da perna esquerda
GLfloat angleperna11_inicial=-30;
GLfloat angleperna12_inicial=40;
//identificadores de angulos atuais da perna esquerda
GLfloat angleperna11=-30;
GLfloat angleperna12=40;
//identificadores de angulos iniciais da perna direita
GLfloat angleperna21_inicial=-30;
GLfloat angleperna22_inicial=40;
//identificadores de angulo atuais da perna direita
GLfloat angleperna21=-30;
GLfloat angleperna22=40;
//angulo max de inclinação da perna
GLfloat angleMaxp = 60;
//define perna
bool perna = true; //true é perna direita, false é esquerda.
//pontuação
int pontuation = 0;
//se a pontuação é valida de calcular
bool pontuationValid = true;
//se o jogador pode socar
bool socoValid = true;
//apenas um roubo, quero que o soco colida com o personagem
//sem atravessar a cabeça, se eu deixa fluir a posição futura ao menos
//uma vez, o soco colide sem atravessar e sem não encostar
bool avancaUltimaPosixSoco = true;
//head texture
GLuint headText;
//hand texture
GLuint handText;
//body texture;
GLuint bodyText;
//dress texture
GLuint dressText;
private:
//auxiliares de desenho do personagem
PLANO* CreatePlane (float W,float H,float space,int plan,float x,float y,float z);
void DesenhaEsfera(GLfloat radius,GLfloat R,GLfloat G,GLfloat B,GLuint textura);
void DesenhaCone(GLfloat size,GLfloat R,GLfloat G,GLfloat B);
void DesenhaTorax(GLfloat size,GLfloat R,GLfloat G,GLfloat B);
void DesenhaParalepipedo(GLfloat sizex,GLfloat sizey,GLfloat sizez,float space,GLfloat R,GLfloat G,GLfloat B);
void DesenhaBraco(GLfloat x,GLfloat y,GLfloat z,GLfloat size,GLfloat angle1,
GLfloat angle2,GLfloat angle3,GLfloat angle4,GLfloat radius);
void DesenhaPerna(GLfloat x,GLfloat y,GLfloat z,GLfloat size,GLfloat angle1,GLfloat angle2);
void DesenhaNariz(GLfloat x,GLfloat y,GLfloat z,GLfloat radius);
void DesenhaBoxer(GLfloat cx,GLfloat cy,GLfloat cz,
GLfloat radius,string color,GLfloat angle,
GLfloat angleb11,GLfloat angleb12,GLfloat angleb13,GLfloat angleb14,
GLfloat angleb21,GLfloat anlgeb22,GLfloat angleb23,GLfloat angleb24,
GLfloat anglep11,GLfloat anglep12, GLfloat anglep21,GLfloat anglep22
);
public:
Boxer(GLfloat cx,GLfloat cy,GLfloat radius,string cor){
cX = cx;
cZ = cy;
cY = 6.5*radius;
cY_I=cY;
altura = 7.5*radius;
radiuS = radius;
//proporção ao raio definido para o personagem
radiusImaginary = radius*4;
valid = true;
color = cor;
};
//auxiliar para poder criar a classe vazia
Boxer(){};
//chama a função desenha
void Desenha(){
DesenhaBoxer(cX,cY,cZ,radiuS,color,angle,anglebraco11,anglebraco12,anglebraco13,anglebraco14,
anglebraco21,anglebraco22,anglebraco23,anglebraco24,angleperna11,angleperna12,
angleperna21,angleperna22);
};
//retorna validade de existencia
bool validBoxer(){
return valid;
}
bool returnPerna(){
return perna;
}
void trocaPerna(){
perna = !perna;
}
//define a textura da cabeça
void defineHeadT(GLuint text){
headText=text;
}
//define a textura da mão
void defineHandT(GLuint text){
handText=text;
}
//define a textura do vestido
void defineBodyT(GLuint text){
bodyText=text;
}
void defineDressT(GLuint text){
dressText=text;
}
void returnAnglepdireita(float &angle1,float &angle2){
angle1=angleperna21;
angle2=angleperna22;
}
void returnAngleIpdireita(float &angle1,float &angle2){
angle1=angleperna21_inicial;
angle2=angleperna22_inicial;
}
void returnAnglepesquerda(float &angle1,float &angle2){
angle1=angleperna11;
angle2=angleperna12;
}
void returnAngleIpesquerda(float &angle1,float &angle2){
angle1=angleperna11_inicial;
angle2=angleperna12_inicial;
}
//retorna o centro do personagem
void obtemcXcYcZ(GLfloat &cx,GLfloat &cy,GLfloat &cz){
cx = cX;
cy = cY;
cz = cZ;
}
//retorna o raio do personagem
void obtemRaio(GLfloat &r){
r=radiuS;
}
//retorna o raio imaginario do personagem (limitador)
void obtemRaioImaginary(GLfloat &r){
r = radiusImaginary;
}
//retorna altura do personagem
GLfloat retornaAltura(){
return altura;
}
//define o angulo do personagem
void defineAngle(GLfloat theta){
angle = theta;
angleInicial=theta;
}
// retorna angulo inicial do jogador
float returnAngleI(){
return angleInicial;
}
// redefine o cy do personagem para o eixo ideal
void redefinecz(GLdouble altura,GLfloat y){
cZ= cZ-y;
cZ_I=cZ;
}
// redefine o cy do personagem para o eixo ideal
void redefinecx(GLfloat x){
cX= cX-x;
cX_I=cX;
}
//funções de movimento e soco
void Gira(GLdouble inc,GLdouble time);
void Move(GLdouble inc,GLdouble time,GLfloat limesq,GLfloat limdir,GLfloat cima,GLfloat baixo,
GLfloat cxadv,GLfloat cyadv,GLfloat r,bool andando,float incA);
void socoDireito(GLfloat inc,GLfloat raioadversario,GLfloat cx,GLfloat cy,GLfloat cz);
void socoEsquerdo(GLfloat inc,GLfloat raioadversario,GLfloat cx,GLfloat cy,GLfloat cz);
void resetanglebracdir();
void resetanglebracesq();
//retorna posição da luva
void getGlovesPosition(GLfloat &cx,GLfloat &cy,GLfloat &z,GLfloat angle1,GLfloat angle2,GLfloat angle3,GLfloat angle4,bool esq,bool dir);
//obtem posição do olho
void getEyesPosition(GLfloat &x,GLfloat &y,GLfloat &z);
//obtem centro de foco da camera
void getFocusPosition(GLfloat &x,GLfloat &y, GLfloat &z);
//obtem pulso do personagem
void getPulsoPosition(GLfloat &x,GLfloat &y, GLfloat &z);
//obtem foco do pulso
void getPulsoFocusPosition(GLfloat &x,GLfloat &y, GLfloat &z);
//obtem up camera pulso
void getUpPosition(GLfloat &x,GLfloat &y, GLfloat &z);
//obtem costas
void getBackPosition(GLfloat &x,GLfloat &y, GLfloat &z);
//define a validade do soco (pode socar ou não socar)
void defineValidSoco(bool validade){
socoValid = validade;
}
//retorna se o soco é valido
bool returnValidSoco(){
return socoValid;
}
//retorna o angulo de direção do personagem
float returnAngle(){
return angle;
}
//define a validade do personagem
void defineValid(bool validade){
valid = validade;
}
//retorna a pontuação
int returnPontuation(){
return pontuation;
}
//reposiciona o personagem (finalização do jogo)
void reposition(GLfloat cx,GLfloat cy,GLfloat cz){
cX = cx;
cZ = cz;
cY=cy;
angle = 0;
}
void reset(){
cX=cX_I;
cY=cY_I;
cZ=cZ_I;
angle=angleInicial;
pontuation=0;
valid=true;
}
};
#endif /* BOXER_H*/