-
Notifications
You must be signed in to change notification settings - Fork 2
/
util.c
157 lines (137 loc) · 3.97 KB
/
util.c
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
#include <GL/glut.h>
#include <math.h>
#include <stdlib.h>
#define NUM_TIROS 4
#define LIXO 20.0
#define pi (3.14159265 / 360.0)
typedef struct Tiros{
float x;
float y;
int naTela;
} Tiros;
typedef struct Aeronave{
GLfloat x;
GLfloat y;
GLfloat rotX;
GLfloat rotY;
Tiros tiros[NUM_TIROS];
GLint combustivel;
GLint pontuacao;
} Aeronave;
typedef struct Objeto{
GLfloat posX;
GLfloat posY;
GLfloat specialMov;
GLfloat movDist;
GLint TTL;
int id;
int tipo;
struct Objeto *prox, *ant;
} Objeto;
typedef struct Lista{
struct Objeto *inicio, *fim;
} Lista;
// Inicializa a lista com NULL
void inicializarLista(Lista *lista){
lista->inicio = NULL;
lista->fim = NULL;
}
// Calcula a distância entre dois pontos (px, py) e (qx, qy)
float dist(GLfloat px, GLfloat py, GLfloat qx, GLfloat qy){
return sqrt(pow((px - qx), 2) + pow((py - qy), 2));
}
// Verifica se o mesmo objeto nao esta sendo colocado no mesmo lugar que outro já existente
int verificarUnicidadeCoordenadas(Lista *lista, float x, float y){
if (lista->inicio != NULL){
Objeto *p = lista->inicio;
while (p != NULL){
if (dist(p->posX, p->posY, x, y)<5.0){
return 0; // Já existe objeto com a mesma posição
}
p = p->prox;
}
}
return 1; // Posição é unica
}
// Insere um novo objeto na lista
void inserir(Lista *lista, int winX, int winY, int tipo, int width_wall){
struct Objeto *novo = malloc(sizeof(Objeto));
novo->prox = NULL;
novo->tipo = tipo;
do{
novo->posX = (rand() % ( (2 * winX) - (2 * width_wall) - 8) ) - winX + width_wall + 4.0; // Calcula pra setar uma posição x aleatória dentro da parte azul
novo->posY = winY+13.0;
novo -> specialMov = 0.0;
novo -> movDist = 0.0;
novo -> TTL = -1;
if(tipo == 4) novo -> TTL = 18;
} while (!verificarUnicidadeCoordenadas(lista, novo->posX, novo->posY));
if (lista->inicio == NULL){
novo->ant = NULL;
lista->inicio = novo;
}
else{
novo->ant = lista->fim;
lista->fim->prox = novo;
}
lista->fim = novo;
}
// Insere um novo objeto na lista em uma posicao Fixa
void inserirPos(Lista *lista, GLfloat X, GLfloat Y, int tipo, int width_wall){
struct Objeto *novo = malloc(sizeof(Objeto));
novo->prox = NULL;
novo->tipo = tipo;
novo->posX = X;
novo->posY = Y;
novo -> specialMov = 0.0;
novo -> movDist = 0.0;
novo -> TTL = -1;
if(tipo == 4) novo -> TTL = 18;
if (lista->inicio == NULL){
novo->ant = NULL;
lista->inicio = novo;
}
else{
novo->ant = lista->fim;
lista->fim->prox = novo;
}
lista->fim = novo;
}
// Remove o objeto que tem as posições enviadas por parâmetro da lista de objetos
void remover(Lista *lista, GLfloat posX, int winY){
if (lista->inicio != NULL){
Objeto *p = lista->inicio;
while (p != NULL){ // Procura o objeto para remoção
if ((p->posX == posX) && (p->posY == winY+LIXO)){
printf("remover %2f %2f \n", posX, p->posX);
if (p->ant != NULL){
p->ant->prox = p->prox;
}
if(p->prox != NULL){
p->prox->ant = p->ant;
}
if (p == lista->inicio){
if(p->prox != NULL)
lista->inicio = p->prox;
else{
lista->inicio = NULL;
lista->fim = NULL;
}
}
free(p);
return;
}
p = p->prox;
}
}
}
void removerTudo(Lista *lista, int winY){
Objeto *p = lista->inicio;
while (p != NULL){
p->posY = winY + LIXO;
remover(lista, p->posX, winY);
p = p->prox;
}
lista->inicio = NULL;
lista->fim = NULL;
}