-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
138 lines (119 loc) · 2.98 KB
/
main.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
/*
* Castle Break
*
* Autores: Henrique Vermelho, Lucca Martins, Pedro Vitor
*
* Descrição: Este programa escrito em C com a biblioteca gŕafica SDL simula o jogo
* Breakout
*
*/
#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_ttf.h>
#include <SDL2/SDL_mixer.h>
#include <math.h>
#include <time.h>
#include "defs.h"
#include "globais.h"
#include "func.h"
int main(int argc, char* args[]){
int quit = false;
SDL_Event e;
//Variáveis essenciais
BLOCK Blocks[3];
BALL Ball;
PAD Pad;
GAMESTATS Game;
PLAYERSTATS Player;
//Atribuições iniciais
Game.level = 0;
Player.score = 0;
Player.lives = 3;
Player.incremento = 0;
trash.topo = 0;
//Alguns elementos extras
TTF_Font *fonteScore;
clock_t tempo_i, tempo_f;
double tempo_gasto;
if(!init()){
printf("Failed to initialize!\n");
}
else {
logoTela();
quit = menuPrincipal(&Game, &Player);
if (!quit) {telaLevel(&Game);}//Se fechar o jogo no menu, nao printa a telaLevel
if(!createBlock(Blocks) || !createBall(&Ball) || !createPad(&Pad) || !createBackground(BACKGROUND_ADDRESS1) ){
quit=false;
}
//Fonte padrão do código
fonteScore = preparaFonte(FONT_ADDRESS, 35);
while(!quit){
tempo_i = clock();
while(SDL_PollEvent(&e) != 0 ){
switch(e.type){
case SDL_QUIT:
quit = true;
break;
case SDL_KEYDOWN:
switch(e.key.keysym.sym){
case SDLK_ESCAPE:
quit = menuPause();
tempo_i=clock();
break;
case SDLK_SPACE:
Game.moving_ball = true;
playSound(gLaunch);
break;
case SDLK_r:
quit = telaRanking();
tempo_i = clock();
break;
}
break;
}
}
if (quit){
closing();
return 0;
}
//Detecta se deve modificar a componente vetorial do PAD
acceleratePad(&Pad);
//Preenche a superfície
SDL_FillRect(gScreenSurface, NULL, SDL_MapRGB(gScreenSurface->format, 0, 0, 0));
//Imprime gameobjects na tela
if (!blitBackground()){
quit = false;
puts("Problemas ao imprimir o fundo.\n");
}
if(!moveBall(&Ball, &Pad, &Game)){
quit = false;
puts("Problemas ao imprimir a bola.\n");
}
//Detecta colisão
colisao(&Ball, &Pad, &Game, &Player);
if(!imprimeMapa(&Game, Blocks)){
quit = false;
puts("Problemas ao imprimir um bloco.\n");
}
if(!movePad(&Pad)){
quit = false;
puts("Problemas ao imprimir o pad.\n");
}
//Imprime dados do jogador na tela
printPlayerStats(Player,fonteScore, Game);
//Detecta tempo de execução até o momento
tempo_f = clock();
//Atualiza informações do Player e do Jogo
quit = updatePlayer(&Player, &Game, &Pad);
//Atualiza a janela
SDL_UpdateWindowSurface(gWindow);
//Calcula o tempo gasto para execução
tempo_gasto = (double)(tempo_f-tempo_i)/CLOCKS_PER_SEC;
//Calcula quanto deve esperar neste frame para o jogo rodar a 60fps
SDL_Delay((int)(1000/FPS - 1000*tempo_gasto)) ;
}
}
closing();
return 0;
}