aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--main.cpp188
2 files changed, 112 insertions, 78 deletions
diff --git a/.gitignore b/.gitignore
index 249eac7..c08a326 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
-a.out
+*.out
*.exe
diff --git a/main.cpp b/main.cpp
index 1d83fc6..657634f 100644
--- a/main.cpp
+++ b/main.cpp
@@ -11,7 +11,7 @@ std::mt19937 Global::rng = std::mt19937(time(0));
class Entity
{
public:
- int ziv=1;
+ bool ziv=1;
float x,y;
sf::RectangleShape telo;
Entity() {} Entity(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja);
@@ -48,23 +48,31 @@ Powerup::Powerup(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Ent
}
class Enemy1:public Entity
{
+ private:
+ float vx,vy;
public:
static float time;
Enemy1():Entity() {}
Enemy1(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja);
- void kaigracu(float igracx,float igracy,float dt);
+ void izracunajbrzinu(float igracx,float igracy);
+ void izracunajpoz(float dt);
};
float Enemy1::time=8;
Enemy1::Enemy1(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Entity(pozicija,velicina,boja) {}
-void Enemy1::kaigracu(float igracx,float igracy,float dt)
+void Enemy1::izracunajbrzinu(float igracx,float igracy)
{
float k=(igracy-y)/(igracx-x);
float r=150.0;
float dx=r/std::sqrt(1+k*k);
if(igracx-x<0) dx=-dx;
float dy=k*dx;
- x+=dx*dt;
- y+=dy*dt;
+ vx=dx;
+ vy=dy;
+}
+void Enemy1::izracunajpoz(float dt)
+{
+ x+=vx*dt;
+ y+=vy*dt;
}
class Enemy2:public Entity
{
@@ -74,7 +82,7 @@ class Enemy2:public Entity
static float time;
Enemy2():Entity() {}
Enemy2(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja);
- void brzina(float igracx,float igracy,float dt);
+ void izracunajbrzinu(float igracx,float igracy,float dt);
void izracunajpoz(float igracx,float igracy,float dt);
};
float Enemy2::time=14;
@@ -82,7 +90,7 @@ Enemy2::Enemy2(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Entit
{
vx=vy=0;
}
-void Enemy2::brzina(float igracx,float igracy,float dt)
+void Enemy2::izracunajbrzinu(float igracx,float igracy,float dt)
{
float k=(igracy-y)/(igracx-x);
float r=200.0*dt;
@@ -113,6 +121,7 @@ class Enemy3:public Entity
Enemy3():Entity() {}
Enemy3(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja);
void izracunajpoz(float dt);
+ void izracunajbrzinu(int sirina,int duzina);
};
float Enemy3::time=10;
Enemy3::Enemy3(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Entity(pozicija,velicina,boja)
@@ -124,6 +133,11 @@ void Enemy3::izracunajpoz(float dt)
x+=vx*dt;
y+=vy*dt;
}
+void Enemy3::izracunajbrzinu(int sirina,int visina)
+{
+ if(x<0||x>sirina) vx=-vx;
+ if(y<0||y>visina) vy=-vy;
+}
class Player:public Entity
{
public:
@@ -175,6 +189,10 @@ class Game
void stompmain();
void updateui();
void updatedt();
+ void position();
+ void checkcollision();
+ void respawn();
+ bool gameover();
public:
Game();
void loop();
@@ -186,9 +204,9 @@ Game::Game()
sirina=prozor.getSize().x;
prozor.setFramerateLimit(60);
igrac = Player(sf::Vector2f((float)sirina/2,(float)visina/2),sf::Vector2f(100.0f,100.0f),sf::Color::White);
- for(int i=0;i<20;i++) nep.push_back(Enemy1(sf::Vector2f(Global::rng()%sirina,Global::rng()%visina),sf::Vector2f(50.0f,50.0f),sf::Color::Red));
- for(int 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(int 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));
+ for(size_t i=0;i<20;i++) nep.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));
igrac.x=(float)prozor.getSize().x/2;
igrac.y=(float)prozor.getSize().y/2;
@@ -243,10 +261,21 @@ Game::Game()
{
std::cout<<"Texture not found\n";
}
- for(int i=0;i<pow.size();i++) pow[i].telo.setTexture(&healthtex);
- for(int i=0;i<nep.size();i++) nep[i].telo.setTexture(&neprijatelj);
- for(int i=0;i<nep2.size();i++) nep2[i].telo.setTexture(&neprijatelj);
- for(int i=0;i<nep3.size();i++) nep3[i].telo.setTexture(&neprijatelj);
+
+ for(size_t i=0;i<pow.size();i++) pow[i].telo.setTexture(&healthtex);
+ for(size_t i=0;i<nep.size();i++) nep[i].telo.setTexture(&neprijatelj);
+ for(size_t i=0;i<nep2.size();i++) nep2[i].telo.setTexture(&neprijatelj);
+ for(size_t i=0;i<nep3.size();i++) nep3[i].telo.setTexture(&neprijatelj);
+}
+bool Game::gameover()
+{
+ if(igrac.health<=0)
+ {
+ prozor.close();
+ std::cout<<"\n\nGame over. Wanna try again?\n";
+ return 1;
+ }
+ return 0;
}
void Game::updatedt()
{
@@ -263,7 +292,7 @@ void Game::stompmain()
{
igrac.stomptime=5;
krug.setPosition(igrac.x,igrac.y);
- for(int i=0;i<nep.size();i++) if(nep[i].ziv)
+ for(size_t i=0;i<nep.size();i++) if(nep[i].ziv)
{
if(seseku(nep[i].telo,krug))
{
@@ -271,7 +300,7 @@ void Game::stompmain()
nep[i].ziv=0;
}
}
- for(int i=0;i<nep2.size();i++) if(nep2[i].ziv)
+ for(size_t i=0;i<nep2.size();i++) if(nep2[i].ziv)
{
if(seseku(nep2[i].telo,krug))
{
@@ -279,7 +308,7 @@ void Game::stompmain()
nep2[i].ziv=0;
}
}
- for(int i=0;i<nep3.size();i++) if(nep3[i].ziv)
+ for(size_t i=0;i<nep3.size();i++) if(nep3[i].ziv)
{
if(seseku(nep3[i].telo,krug))
{
@@ -323,10 +352,10 @@ void Game::draw()
prozor.clear();
if(igrac.stomptime>4.6) prozor.draw(krug);
prozor.draw(igrac.telo);
- for(int i=0;i<nep.size();i++) if(nep[i].ziv) prozor.draw(nep[i].telo);
- for(int i=0;i<nep2.size();i++) if(nep2[i].ziv) prozor.draw(nep2[i].telo);
- for(int i=0;i<nep3.size();i++) if(nep3[i].ziv) prozor.draw(nep3[i].telo);
- for(int i=0;i<pow.size();i++) if(pow[i].ziv) prozor.draw(pow[i].telo);
+ for(size_t i=0;i<nep.size();i++) if(nep[i].ziv) prozor.draw(nep[i].telo);
+ for(size_t i=0;i<nep2.size();i++) if(nep2[i].ziv) prozor.draw(nep2[i].telo);
+ for(size_t i=0;i<nep3.size();i++) if(nep3[i].ziv) prozor.draw(nep3[i].telo);
+ for(size_t i=0;i<pow.size();i++) if(pow[i].ziv) prozor.draw(pow[i].telo);
//UserInterface
prozor.draw(healthblank);
@@ -339,90 +368,55 @@ void Game::draw()
prozor.draw(score);
prozor.display();
}
-void Game::run()
+void Game::position()
{
- //update
- updateui();
- updatedt();
- igrac.updatest(dt);
-
- //game over
- if(igrac.health<=0)
- {
- prozor.close();
- std::cout<<"\n\nGame over. Wanna try again?\n";
- return;
- }
-
- //izracunajpoz
- for(int i=0;i<nep2.size();i++) nep2[i].izracunajpoz(igrac.x,igrac.y,dt);
-
- //izracunaj poz i brzinu
- for(int i=0;i<nep3.size();i++)
- {
- if(nep3[i].x<0||nep3[i].x>sirina) nep3[i].vx=-nep3[i].vx;
- if(nep3[i].y<0||nep3[i].y>visina) nep3[i].vy=-nep3[i].vy;
- nep3[i].izracunajpoz(dt);
- }
-
- //respawn
- Enemy1::time-=dt;
- Enemy2::time-=dt;
- Enemy3::time-=dt;
- Powerup::time-=dt;
- if(Enemy1::time<0)
+ igrac.telo.setPosition(igrac.x,igrac.y);
+ for(size_t i=0;i<nep.size();i++) if(nep[i].ziv)
{
- Enemy1::time=8;
- for(int i=0;i<nep.size();i++) nep[i].respawn(sirina,visina);
+ nep[i].izracunajbrzinu(igrac.x,igrac.y);
+ nep[i].izracunajpoz(dt);
+ nep[i].telo.setPosition(nep[i].x,nep[i].y);
}
- if(Enemy2::time<0)
+ for(size_t i=0;i<nep2.size();i++) if(nep2[i].ziv)
{
- Enemy2::time=14;
- for(int i=0;i<nep2.size();i++) nep2[i].respawn(sirina,visina);
- }
- if(Enemy3::time<0)
- {
- Enemy3::time=10;
- for(int i=0;i<nep3.size();i++) nep3[i].respawn(sirina,visina);
+ nep2[i].izracunajbrzinu(igrac.x,igrac.y,dt);
+ nep2[i].izracunajpoz(igrac.x,igrac.y,dt);
+ nep2[i].telo.setPosition(nep2[i].x,nep2[i].y);
}
- if(Powerup::time<0)
+ for(size_t i=0;i<nep3.size();i++) if(nep3[i].ziv)
{
- Powerup::time=20;
- for(int i=0;i<pow.size();i++) pow[i].respawn(sirina,visina);
+ nep3[i].izracunajbrzinu(sirina,visina);
+ nep3[i].izracunajpoz(dt);
+ nep3[i].telo.setPosition(nep3[i].x,nep3[i].y);
}
- igrac.telo.setPosition(igrac.x,igrac.y);
-
- //colliding with player
- for(int i=0;i<nep.size();i++) if(nep[i].ziv)
+}
+void Game::checkcollision()
+{
+ for(size_t i=0;i<nep.size();i++) if(nep[i].ziv)
{
- nep[i].kaigracu(igrac.x,igrac.y,dt);
- nep[i].telo.setPosition(nep[i].x,nep[i].y);
if(seseku(nep[i].telo,igrac.telo))
{
nep[i].ziv=0;
igrac.health-=Global::rng()%4+1; // 1-4 dmg
}
}
- for(int i=0;i<nep2.size();i++) if(nep2[i].ziv)
+ for(size_t i=0;i<nep2.size();i++) if(nep2[i].ziv)
{
- nep2[i].brzina(igrac.x,igrac.y,dt);
- nep2[i].telo.setPosition(nep2[i].x,nep2[i].y);
if(seseku(nep2[i].telo,igrac.telo))
{
nep2[i].ziv=0;
igrac.health-=Global::rng()%8+1; // 1-8 dmg
}
}
- for(int i=0;i<nep3.size();i++) if(nep3[i].ziv)
+ for(size_t i=0;i<nep3.size();i++) if(nep3[i].ziv)
{
- nep3[i].telo.setPosition(nep3[i].x,nep3[i].y);
if(seseku(nep3[i].telo,igrac.telo))
{
nep3[i].ziv=0;
igrac.health-=Global::rng()%12+1; // 1-12 dmg
}
}
- for(int i=0;i<pow.size();i++) if(pow[i].ziv)
+ for(size_t i=0;i<pow.size();i++) if(pow[i].ziv)
{
pow[i].telo.setPosition(pow[i].x,pow[i].y);
if(seseku(pow[i].telo,igrac.telo))
@@ -432,6 +426,46 @@ void Game::run()
}
}
}
+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<nep.size();i++) nep[i].respawn(sirina,visina);
+ }
+ if(Enemy2::time<0)
+ {
+ Enemy2::time=14;
+ for(size_t i=0;i<nep2.size();i++) nep2[i].respawn(sirina,visina);
+ }
+ if(Enemy3::time<0)
+ {
+ Enemy3::time=10;
+ for(size_t i=0;i<nep3.size();i++) nep3[i].respawn(sirina,visina);
+ }
+ if(Powerup::time<0)
+ {
+ Powerup::time=20;
+ for(size_t i=0;i<pow.size();i++) pow[i].respawn(sirina,visina);
+ }
+}
+void Game::run()
+{
+ if(gameover()) return;
+
+ updateui();
+ updatedt();
+ igrac.updatest(dt);
+
+ respawn();
+ position();
+ checkcollision();
+}
void Game::loop()
{
while(prozor.isOpen())