aboutsummaryrefslogtreecommitdiff
path: root/src/Game.cpp
blob: e74efa56dcc8da87bb4d69934f10903eebe00212 (plain)
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
#include"includes/Global.hpp"
#include"includes/Game.hpp"

void Game::initshapes()
{
    health.setSize(sf::Vector2f(sirina/3.0,50.0));
    health.setFillColor(sf::Color::Red);
    healthblank.setSize(sf::Vector2f(sirina/3.0,50.0));
    healthblank.setFillColor(sf::Color::White);

    stomp.setSize(sf::Vector2f(sirina/3.0,50.0));
    stomp.setFillColor(sf::Color::Blue);
    stomp.setPosition(0,50);
    stompblank.setSize(sf::Vector2f(sirina/3.0,50.0));
    stompblank.setFillColor(sf::Color::White);
    stompblank.setPosition(0,50);
}
void Game::initui()
{
    healthtext.setFont(*font["default"]);
    healthtext.setString("Health");
    healthtext.setCharacterSize(24);
    healthtext.setFillColor(sf::Color::Black);
    stomptext.setFont(*font["default"]);
    stomptext.setString("Stomp");
    stomptext.setCharacterSize(24);
    stomptext.setPosition(0,50);
    stomptext.setFillColor(sf::Color::Black);

    fps.setFont(*font["default"]);
    fps.setCharacterSize(24);
    fps.setFillColor(sf::Color::White);
    fps.setPosition(sirina*5.0/6,0);
    score.setFont(*font["default"]);
    score.setCharacterSize(24);
    score.setFillColor(sf::Color::White);
    score.setPosition(sirina*5.0/6,50);
}
void Game::inittex()
{
    for(size_t i=0;i<pow.size();i++) pow.at(i).telo.setTexture(tex["health"]);
    for(size_t i=0;i<nep1.size();i++) nep1.at(i).telo.setTexture(tex["neprijatelj"]);
    for(size_t i=0;i<nep2.size();i++) nep2.at(i).telo.setTexture(tex["neprijatelj"]);
    for(size_t i=0;i<nep3.size();i++) nep3.at(i).telo.setTexture(tex["neprijatelj"]);
}
void Game::initent()
{
    igrac = Player(sf::Vector2f(sirina/2.0,visina/2.0),sf::Vector2f(100.0f,100.0f),sf::Color::White);
    for(size_t i=0;i<20;i++) nep1.push_back(Enemy1(sf::Vector2f(Global::rng()%sirina,Global::rng()%visina),sf::Vector2f(50.0f,50.0f),sf::Color::Red));
    for(size_t i=0;i<7;i++) nep2.push_back(Enemy2(sf::Vector2f(Global::rng()%sirina,Global::rng()%visina),sf::Vector2f(50.0f,50.0f),sf::Color::Cyan));//(253,106,2)));
    for(size_t i=0;i<4;i++) nep3.push_back(Enemy3(sf::Vector2f(Global::rng()%sirina,Global::rng()%visina),sf::Vector2f(50.0f,50.0f),sf::Color::Yellow));
    pow.push_back(Powerup(sf::Vector2f(Global::rng()%sirina,Global::rng()%visina),sf::Vector2f(50.0f,50.0f),sf::Color::White));
}
void Game::updatewin()
{
    visina=prozor->getSize().y;
    sirina=prozor->getSize().x;
    healthblank.setSize(sf::Vector2f(sirina/3.0,50.0));
    stompblank.setSize(sf::Vector2f(sirina/3.0,50.0));
    fps.setPosition(sirina*5.0/6,0);
    score.setPosition(sirina*5.0/6,50);
    updateui();
}
Game::Game(sf::RenderWindow *glprozor,std::map<std::string,sf::Font*> mainfont,std::map<std::string,sf::Texture*> maintex)
{
    prozor=glprozor;
    font=mainfont;
    tex=maintex;

    updatewin();
    initui();
    initshapes();
    initent();
    inittex();
}
bool Game::gameover()
{
    if(igrac.health<=0) return 1;
    return 0;
}
void Game::updatedt()
{
    dt=sat.restart().asMicroseconds()/1000000.0;
}
void Game::updateui()
{
    health.setSize(sf::Vector2f(sirina*igrac.health/300.0,50.0));
    stomp.setSize(sf::Vector2f(sirina*(5-igrac.stomptime)/15.0,50.0));
    fps.setString("fps: "+std::to_string((int)(1/dt)));
    score.setString("xp: "+std::to_string(igrac.xp));
}
void Game::stompmain()
{
    igrac.stomptime=5;
    igrac.krug.setPosition(igrac.x,igrac.y);
    for(size_t i=0;i<nep1.size();i++) if(nep1.at(i).ziv)
    {
	if(seseku(nep1.at(i).telo,igrac.krug))
	{
	    igrac.xp+=5;
	    nep1.at(i).ziv=0;
	}
    }
    for(size_t i=0;i<nep2.size();i++) if(nep2.at(i).ziv)
    {
	if(seseku(nep2.at(i).telo,igrac.krug))
	{
	    igrac.xp+=10;
	    nep2.at(i).ziv=0;
	}
    }
    for(size_t i=0;i<nep3.size();i++) if(nep3.at(i).ziv)
    {
	if(seseku(nep3.at(i).telo,igrac.krug))
	{
	    igrac.xp+=20;
	    nep3.at(i).ziv=0;
	}
    }
}
void Game::keyboard()
{
    float dist=500.0*dt;
    if((sf::Keyboard::isKeyPressed(sf::Keyboard::W)||sf::Keyboard::isKeyPressed(sf::Keyboard::Up))&&igrac.y>0) igrac.y-=dist;
    if((sf::Keyboard::isKeyPressed(sf::Keyboard::A)||sf::Keyboard::isKeyPressed(sf::Keyboard::Left))&&igrac.x>0) igrac.x-=dist;
    if((sf::Keyboard::isKeyPressed(sf::Keyboard::S)||sf::Keyboard::isKeyPressed(sf::Keyboard::Down))&&igrac.y<visina) igrac.y+=dist;
    if((sf::Keyboard::isKeyPressed(sf::Keyboard::D)||sf::Keyboard::isKeyPressed(sf::Keyboard::Right))&&igrac.x<sirina) igrac.x+=dist;
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space)) if(igrac.stomptime<=0) stompmain();
}
void Game::draw()
{
    if(igrac.stomptime>4.6) prozor->draw(igrac.krug);
    prozor->draw(igrac.telo);
    for(size_t i=0;i<nep1.size();i++) if(nep1.at(i).ziv) prozor->draw(nep1.at(i).telo);
    for(size_t i=0;i<nep2.size();i++) if(nep2.at(i).ziv) prozor->draw(nep2.at(i).telo);
    for(size_t i=0;i<nep3.size();i++) if(nep3.at(i).ziv) prozor->draw(nep3.at(i).telo);
    for(size_t i=0;i<pow.size();i++) if(pow.at(i).ziv) prozor->draw(pow.at(i).telo);

    prozor->draw(healthblank);
    prozor->draw(health);
    prozor->draw(healthtext);
    prozor->draw(stompblank);
    prozor->draw(stomp);
    prozor->draw(stomptext);
    prozor->draw(fps);
    prozor->draw(score);
}
void Game::position()
{
    igrac.telo.setPosition(igrac.x,igrac.y);
    for(size_t i=0;i<nep1.size();i++) if(nep1.at(i).ziv)
    {
	nep1.at(i).izracunajbrzinu(igrac.x,igrac.y);
	nep1.at(i).izracunajpoz(dt);
	nep1.at(i).telo.setPosition(nep1.at(i).x,nep1.at(i).y);
    }
    for(size_t i=0;i<nep2.size();i++) if(nep2.at(i).ziv)
    {
	nep2.at(i).izracunajbrzinu(igrac.x,igrac.y,dt);
	nep2.at(i).izracunajpoz(igrac.x,igrac.y,dt);
	nep2.at(i).telo.setPosition(nep2.at(i).x,nep2.at(i).y);
    }
    for(size_t i=0;i<nep3.size();i++) if(nep3.at(i).ziv)
    {
	nep3.at(i).izracunajbrzinu(sirina,visina);
	nep3.at(i).izracunajpoz(dt);
	nep3.at(i).telo.setPosition(nep3.at(i).x,nep3.at(i).y);
    }
    for(size_t i=0;i<pow.size();i++) if(pow.at(i).ziv)
    {
	pow.at(i).telo.setPosition(pow.at(i).x,pow.at(i).y);
    }
}
void Game::checkcollision()
{
    for(size_t i=0;i<nep1.size();i++) if(nep1.at(i).ziv)
    {
	if(seseku(nep1.at(i).telo,igrac.telo))
	{
	    nep1.at(i).ziv=0;
	    igrac.health-=Global::rng()%4+1; // 1-4 dmg
	}
    }
    for(size_t i=0;i<nep2.size();i++) if(nep2.at(i).ziv)
    {
	if(seseku(nep2.at(i).telo,igrac.telo))
	{
	    nep2.at(i).ziv=0;
	    igrac.health-=Global::rng()%8+1; // 1-8 dmg
	}
    }
    for(size_t i=0;i<nep3.size();i++) if(nep3.at(i).ziv)
    {
	if(seseku(nep3.at(i).telo,igrac.telo))
	{
	    nep3.at(i).ziv=0;
	    igrac.health-=Global::rng()%12+1; // 1-12 dmg
	}
    }
    for(size_t i=0;i<pow.size();i++) if(pow.at(i).ziv)
    {
	if(seseku(pow.at(i).telo,igrac.telo))
	{
	    pow.at(i).ziv=0;
	    igrac.health+=Global::rng()%20+21; // 20-40 heal
	}
    }
}
void Game::respawn()
{
    Enemy1::time-=dt;
    Enemy2::time-=dt;
    Enemy3::time-=dt;
    Powerup::time-=dt;

    if(Enemy1::time<0)
    {
	Enemy1::time=8;
	for(size_t i=0;i<nep1.size();i++) nep1.at(i).respawn(sirina,visina);
    }
    if(Enemy2::time<0)
    {
	Enemy2::time=14;
	for(size_t i=0;i<nep2.size();i++) nep2.at(i).respawn(sirina,visina);
    }
    if(Enemy3::time<0)
    {
	Enemy3::time=10;
	for(size_t i=0;i<nep3.size();i++) nep3.at(i).respawn(sirina,visina);
    }
    if(Powerup::time<0)
    {
	Powerup::time=20;
	for(size_t i=0;i<pow.size();i++) pow.at(i).respawn(sirina,visina);
    }
}
void Game::run()
{
    igrac.updatest(dt);
    respawn();
    position();
    checkcollision();
}
void Game::loop(bool ischanged,bool pause)
{
    if(ischanged) updatewin();
    if(!pause)
    {
	keyboard();
	run();
    }
    updateui();
    updatedt();
}