forked from lechienn/BTL-LTNC
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGame.h
166 lines (142 loc) · 3.75 KB
/
Game.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
#ifndef GAME_H_
#define GAME_H_
#include "library.h"
// #include "TextureManager.h"
#include "GameObject.h"
#include "Map.h"
#include "Weapon.h"
#include "barProgress.h"
GameObject *player1;
GameObject *player2;
Map *map;
Weapon *weapon;
barProgress *player1HP;
barProgress *player2HP;
barProgress *powerBar;
Uint32 startFire = 0;
class Game
{
private:
bool isFire;
bool player1Turn;
bool isRunning;
SDL_Window *window;
SDL_Renderer *renderer;
public:
Game();
~Game();
void init();
void handleEvent();
void update();
void render();
void clean();
bool running() { return isRunning; }
};
Game::Game() {}
Game::~Game() {}
void Game::init()
{
window = SDL_CreateWindow(WINDOW_TITLE.c_str(), SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, -1, 0);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
TTF_Init();
font = TTF_OpenFont("font/FS-Angry-Birds.ttf", 30);
isRunning = true;
player1Turn = true;
isFire = false;
player1 = new GameObject("img/girl.png", renderer, true, 200, 450, 50, 40);
player2 = new GameObject("img/boy.png", renderer, false, 800, 450, 690, 40);
map = new Map("img/bg.png", renderer);
weapon = new Weapon("img/rocktest.png", renderer);
player1HP = new barProgress(renderer, "img/hpBar.png", 50, 40, 540, 40);
player2HP = new barProgress(renderer, "img/hpBar.png", 690, 40, 540, 40);
powerBar = new barProgress(renderer, "img/ruler-nobg.png", 140, 650, 1000, 50);
}
void Game::handleEvent()
{
SDL_Event event;
SDL_PollEvent(&event);
switch (event.type)
{
case SDL_QUIT:
isRunning = false;
break;
default:
if (player1Turn)
{
player1->handleEvent(event, isFire, player1Turn);
break;
}
else
{
player2->handleEvent(event, isFire, player1Turn);
break;
}
}
}
void Game::update()
{
if (isFire)
{
if (startFire == 0)
startFire = SDL_GetTicks();
if (player1Turn)
weapon->move(startFire, player1Turn, isFire, player1, player2);
else
weapon->move(startFire, player1Turn, isFire, player2, player1);
weapon->update();
}
player1->update();
player2->update();
player1HP->update(player1->getHP(), true);
player2HP->update(player2->getHP(), false);
powerBar->update(player1Turn ? player1->getPower() : player2->getPower(), false);
if (player1->getHP() == 0 || player2->getHP() == 0)
{
isRunning = false;
}
}
void Game::render()
{
SDL_RenderClear(renderer);
map->render();
if (isFire)
{
weapon->render();
}
player1->render();
player2->render();
player1HP->render();
player2HP->render();
if (!isFire)
player1Turn ? player1->renderAngle() : player2->renderAngle();
powerBar->render();
weapon->renderWinSpeed();
SDL_RenderPresent(renderer);
if (player1->getHP() == 0 || player2->getHP() == 0)
{
SDL_Color color = {60, 60, 150, 0};
SDL_Rect rect = {540, 200, 200, 100};
SDL_Texture *notice = TextureManager::LoadTextureFromText(player1->getHP() == 0 ? "Player 2 WIN!" : "Player 1 WIN!", font, color, renderer);
SDL_RenderCopy(renderer, notice, NULL, &rect);
SDL_RenderPresent(renderer);
SDL_Delay(3000);
}
}
void Game::clean()
{
SDL_DestroyWindow(window);
window = NULL;
SDL_DestroyRenderer(renderer);
renderer = NULL;
delete player1;
delete player2;
delete weapon;
delete powerBar;
delete player1HP;
delete player2HP;
delete map;
// IMG_Quit();
}
#endif