diff options
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | src/Enemy1.cpp | 19 | ||||
| -rw-r--r-- | src/Enemy2.cpp | 30 | ||||
| -rw-r--r-- | src/Enemy3.cpp | 17 | ||||
| -rw-r--r-- | src/Entity.cpp | 19 | ||||
| -rw-r--r-- | src/Game.cpp (renamed from main.cpp) | 287 | ||||
| -rw-r--r-- | src/Global.cpp | 2 | ||||
| -rw-r--r-- | src/Makefile | 15 | ||||
| -rw-r--r-- | src/Player.cpp | 13 | ||||
| -rw-r--r-- | src/Powerup.cpp | 7 | ||||
| -rw-r--r-- | src/State.cpp | 59 | ||||
| -rw-r--r-- | src/includes/Enemy1.hpp | 17 | ||||
| -rw-r--r-- | src/includes/Enemy2.hpp | 17 | ||||
| -rw-r--r-- | src/includes/Enemy3.hpp | 17 | ||||
| -rw-r--r-- | src/includes/Entity.hpp | 15 | ||||
| -rw-r--r-- | src/includes/Game.hpp | 54 | ||||
| -rw-r--r-- | src/includes/Global.hpp | 12 | ||||
| -rw-r--r-- | src/includes/Player.hpp | 17 | ||||
| -rw-r--r-- | src/includes/Powerup.hpp | 13 | ||||
| -rw-r--r-- | src/includes/State.hpp | 19 | ||||
| -rw-r--r-- | src/main.cpp | 8 |
21 files changed, 378 insertions, 281 deletions
@@ -1,2 +1,4 @@ +sfml-rpg +*.o *.out *.exe diff --git a/src/Enemy1.cpp b/src/Enemy1.cpp new file mode 100644 index 0000000..fc1e87d --- /dev/null +++ b/src/Enemy1.cpp @@ -0,0 +1,19 @@ +#include"includes/Global.hpp" +#include"includes/Enemy1.hpp" +float Enemy1::time=8; +Enemy1::Enemy1(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Entity(pozicija,velicina,boja) {} +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; + vx=dx; + vy=dy; +} +void Enemy1::izracunajpoz(float dt) +{ + x+=vx*dt; + y+=vy*dt; +} diff --git a/src/Enemy2.cpp b/src/Enemy2.cpp new file mode 100644 index 0000000..fc65942 --- /dev/null +++ b/src/Enemy2.cpp @@ -0,0 +1,30 @@ +#include"includes/Global.hpp" +#include"includes/Enemy2.hpp" +float Enemy2::time=14; +Enemy2::Enemy2(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Entity(pozicija,velicina,boja) +{ + vx=vy=0; +} +void Enemy2::izracunajbrzinu(float igracx,float igracy,float dt) +{ + float k=(igracy-y)/(igracx-x); + float r=200.0*dt; + float dx=r/std::sqrt(1+k*k); + if(igracx-x<0) dx=-dx; + float dy=k*dx; + vx+=dx; + vy+=dy; +} +void Enemy2::izracunajpoz(float igracx,float igracy,float dt) +{ + if((x+vx-igracx)*(x+vx-igracx)+(y+vy-igracy)*(y+vy-igracy)<(x-igracx)*(x-igracx)+(y-igracy)*(y-igracy)) + { + x+=vx*dt*3; + y+=vy*dt*3; + } + else + { + x+=vx*dt; + y+=vy*dt; + } +} diff --git a/src/Enemy3.cpp b/src/Enemy3.cpp new file mode 100644 index 0000000..0ed8726 --- /dev/null +++ b/src/Enemy3.cpp @@ -0,0 +1,17 @@ +#include"includes/Global.hpp" +#include"includes/Enemy3.hpp" +float Enemy3::time=10; +Enemy3::Enemy3(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Entity(pozicija,velicina,boja) +{ + vx=vy=500.0; +} +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; +} diff --git a/src/Entity.cpp b/src/Entity.cpp new file mode 100644 index 0000000..cc9f418 --- /dev/null +++ b/src/Entity.cpp @@ -0,0 +1,19 @@ +#include"includes/Global.hpp" +#include"includes/Entity.hpp" +Entity::Entity(sf::Vector2f pozicija, sf::Vector2f velicina,sf::Color boja) +{ + telo.setSize(velicina); + telo.setFillColor(boja); + telo.setOrigin(sf::Vector2f(telo.getSize().x/2,telo.getSize().y/2)); + x=pozicija.x; + y=pozicija.y; +} +void Entity::respawn(int sirina,int visina) +{ + if(!ziv) + { + x=Global::rng()%sirina; + y=Global::rng()%visina; + ziv=1; + } +} @@ -1,209 +1,7 @@ -#include<iostream> -#include<SFML/Graphics.hpp> -#include<random> -#define seseku(a,b) a.getGlobalBounds().intersects(b.getGlobalBounds()) -class Global -{ - public: - static std::mt19937 rng; -}; -std::mt19937 Global::rng = std::mt19937(time(0)); -class Entity -{ - public: - bool ziv=1; - float x,y; - sf::RectangleShape telo; - Entity() {} Entity(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja); - void respawn(int sirina,int visina); -}; -Entity::Entity(sf::Vector2f pozicija, sf::Vector2f velicina,sf::Color boja) -{ - telo.setSize(velicina); - telo.setFillColor(boja); - telo.setOrigin(sf::Vector2f(telo.getSize().x/2,telo.getSize().y/2)); - x=pozicija.x; - y=pozicija.y; -} -void Entity::respawn(int sirina,int visina) -{ - if(!ziv) - { - x=Global::rng()%sirina; - y=Global::rng()%visina; - ziv=1; - } -} -class Powerup:public Entity -{ - public: - static float time; - Powerup():Entity() {} - Powerup(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja); -}; -float Powerup::time=20; -Powerup::Powerup(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Entity(pozicija,velicina,boja) -{ +#include"includes/Global.hpp" +#include"includes/Game.hpp" -} -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 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::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; - vx=dx; - vy=dy; -} -void Enemy1::izracunajpoz(float dt) -{ - x+=vx*dt; - y+=vy*dt; -} -class Enemy2:public Entity -{ - private: - float vx,vy; - public: - static float time; - Enemy2():Entity() {} - Enemy2(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja); - void izracunajbrzinu(float igracx,float igracy,float dt); - void izracunajpoz(float igracx,float igracy,float dt); -}; -float Enemy2::time=14; -Enemy2::Enemy2(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Entity(pozicija,velicina,boja) -{ - vx=vy=0; -} -void Enemy2::izracunajbrzinu(float igracx,float igracy,float dt) -{ - float k=(igracy-y)/(igracx-x); - float r=200.0*dt; - float dx=r/std::sqrt(1+k*k); - if(igracx-x<0) dx=-dx; - float dy=k*dx; - vx+=dx; - vy+=dy; -} -void Enemy2::izracunajpoz(float igracx,float igracy,float dt) -{ - if((x+vx-igracx)*(x+vx-igracx)+(y+vy-igracy)*(y+vy-igracy)<(x-igracx)*(x-igracx)+(y-igracy)*(y-igracy)) - { - x+=vx*dt*3; - y+=vy*dt*3; - } - else - { - x+=vx*dt; - y+=vy*dt; - } -} -class Enemy3:public Entity -{ - private: - float vx,vy; - public: - static float time; - 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) -{ - vx=vy=500.0; -} -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: - int health,xp; - int stomprad=270; - float stomptime; - - Player():Entity() {} - Player(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja); - void updatest(float dt); -}; -Player::Player(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Entity(pozicija,velicina,boja) -{ - health=100; - stomptime=0; - xp=0; -} -void Player::updatest(float dt) -{ - if(stomptime>0) stomptime-=dt; - else stomptime=0; -} -class Game -{ - private: - sf::Font font; - sf::Texture healthtex,neprijateljtex; - float dt; - sf::Clock sat,time; - - Player igrac; - std::vector<Enemy1> nep1; - std::vector<Enemy2> nep2; - std::vector<Enemy3> nep3; - std::vector<Powerup> pow; - - int visina,sirina; - sf::RenderWindow *prozor; - - sf::CircleShape krug; - sf::RectangleShape health,healthblank,stomp,stompblank; - sf::Text healthtext,stomptext,fps,score; - - void keyboard(); - void run(); - void draw(); - void stompmain(); - - void updateui(); - void updatedt(); - bool gameover(); - void respawn(); - void position(); - void checkcollision(); - - void initshapes(); - void initui(); - void inittex(); - void initent(); - void updatewin(); - public: - Game() {} - Game(sf::RenderWindow *glprozor); - void loop(bool ischanged,bool pause); -}; +#include<iostream> void Game::initshapes() { krug.setRadius(igrac.stomprad); @@ -226,7 +24,7 @@ void Game::initshapes() } void Game::initui() { - if(!font.loadFromFile("assets/fonts/LiberationMono-Regular.ttf")) + if(!font.loadFromFile("../assets/fonts/LiberationMono-Regular.ttf")) { std::cerr<<"Font not found\n"; } @@ -251,11 +49,11 @@ void Game::initui() } void Game::inittex() { - if(!healthtex.loadFromFile("assets/images/healing.png")) + if(!healthtex.loadFromFile("../assets/images/healing.png")) { std::cerr<<"Texture not found\n"; } - if(!neprijateljtex.loadFromFile("assets/images/nep.png")) + if(!neprijateljtex.loadFromFile("../assets/images/nep.png")) { std::cerr<<"Texture not found\n"; } @@ -482,76 +280,3 @@ void Game::loop(bool ischanged,bool pause) updatedt(); draw(); } -class State -{ - private: - sf::RenderWindow prozor; - int visina,sirina; - bool ischanged=0,pause=0; - - void events(); - void keyboard(); - public: - State(); - void loop(); -}; -State::State() -{ - prozor.create(sf::VideoMode::getFullscreenModes()[0],"RPG igra"); - prozor.setFramerateLimit(60); - visina=prozor.getSize().y; - sirina=prozor.getSize().x; -} -void State::events() -{ - sf::Event evnt; - while(prozor.pollEvent(evnt)) - { - switch(evnt.type) - { - case sf::Event::EventType::Closed: - prozor.close(); - break; - case sf::Event::EventType::Resized: - std::cout<<"Nova velicina prozora je:"<<prozor.getSize().x<<'x'<<prozor.getSize().y<<std::endl; - ischanged=1; - visina=prozor.getSize().y; - sirina=prozor.getSize().x; - prozor.setView(sf::View(sf::FloatRect(0,0,sirina,visina))); - break; - case sf::Event::EventType::KeyPressed: - keyboard(); - break; - default: - break; - } - } -} -void State::keyboard() -{ - if(sf::Keyboard::isKeyPressed(sf::Keyboard::P)) - { - pause=true; - } - if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) - { - pause=false; - ischanged=1; - } -} -void State::loop() -{ - Game *igra=new Game(&prozor); - while(prozor.isOpen()) - { - events(); - igra->loop(ischanged,pause); - if(ischanged) ischanged=0; - } -} -int main() -{ - State program; - program.loop(); - return 0; -} diff --git a/src/Global.cpp b/src/Global.cpp new file mode 100644 index 0000000..e95f785 --- /dev/null +++ b/src/Global.cpp @@ -0,0 +1,2 @@ +#include"includes/Global.hpp" +std::mt19937 Global::rng = std::mt19937(time(0)); diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..b4ed4bd --- /dev/null +++ b/src/Makefile @@ -0,0 +1,15 @@ +CXX = g++ +CXXFLAGS = --std=c++14 -g -O2 -Wall +SRC_DIR = src/ +OBJECTS = main.o State.o Game.o Global.o Enemy1.o Enemy2.o Enemy3.o Powerup.o Entity.o Player.o + +all: sfml-rpg + +sfml-rpg: $(OBJECTS) + $(CXX) $(CXXFLAGS) $(OBJECTS) -o sfml-rpg -lsfml-graphics -lsfml-window -lsfml-system + +%.o : %.cpp + $(CXX) $(CXXFLAGS) -c $< + +clean: + rm -f $(OBJECTS) sfml-rpg diff --git a/src/Player.cpp b/src/Player.cpp new file mode 100644 index 0000000..d73ead1 --- /dev/null +++ b/src/Player.cpp @@ -0,0 +1,13 @@ +#include"includes/Global.hpp" +#include"includes/Player.hpp" +Player::Player(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Entity(pozicija,velicina,boja) +{ + health=100; + stomptime=0; + xp=0; +} +void Player::updatest(float dt) +{ + if(stomptime>0) stomptime-=dt; + else stomptime=0; +} diff --git a/src/Powerup.cpp b/src/Powerup.cpp new file mode 100644 index 0000000..53bbb57 --- /dev/null +++ b/src/Powerup.cpp @@ -0,0 +1,7 @@ +#include"includes/Global.hpp" +#include"includes/Powerup.hpp" +float Powerup::time=20; +Powerup::Powerup(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja):Entity(pozicija,velicina,boja) +{ + +} diff --git a/src/State.cpp b/src/State.cpp new file mode 100644 index 0000000..510e8ca --- /dev/null +++ b/src/State.cpp @@ -0,0 +1,59 @@ +#include"includes/Global.hpp" +#include"includes/State.hpp" + +#include"includes/Game.hpp" +#include<iostream> +State::State() +{ + prozor.create(sf::VideoMode::getFullscreenModes()[0],"RPG igra"); + prozor.setFramerateLimit(60); + visina=prozor.getSize().y; + sirina=prozor.getSize().x; +} +void State::events() +{ + sf::Event evnt; + while(prozor.pollEvent(evnt)) + { + switch(evnt.type) + { + case sf::Event::EventType::Closed: + prozor.close(); + break; + case sf::Event::EventType::Resized: + std::cout<<"Nova velicina prozora je:"<<prozor.getSize().x<<'x'<<prozor.getSize().y<<std::endl; + ischanged=1; + visina=prozor.getSize().y; + sirina=prozor.getSize().x; + prozor.setView(sf::View(sf::FloatRect(0,0,sirina,visina))); + break; + case sf::Event::EventType::KeyPressed: + keyboard(); + break; + default: + break; + } + } +} +void State::keyboard() +{ + if(sf::Keyboard::isKeyPressed(sf::Keyboard::P)) + { + pause=1; + } + if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) + { + pause=0; + ischanged=1; + } +} +void State::loop() +{ + Game *igra=new Game(&prozor); + while(prozor.isOpen()) + { + events(); + igra->loop(ischanged,pause); + if(ischanged) ischanged=0; + } +} diff --git a/src/includes/Enemy1.hpp b/src/includes/Enemy1.hpp new file mode 100644 index 0000000..0405365 --- /dev/null +++ b/src/includes/Enemy1.hpp @@ -0,0 +1,17 @@ +#ifndef ENEMY1_H +#define ENEMY1_H + +#include"Entity.hpp" +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 izracunajbrzinu(float igracx,float igracy); + void izracunajpoz(float dt); +}; + +#endif diff --git a/src/includes/Enemy2.hpp b/src/includes/Enemy2.hpp new file mode 100644 index 0000000..25555a4 --- /dev/null +++ b/src/includes/Enemy2.hpp @@ -0,0 +1,17 @@ +#ifndef ENEMY2_H +#define ENEMY2_H + +#include"Entity.hpp" +class Enemy2:public Entity +{ + private: + float vx,vy; + public: + static float time; + Enemy2():Entity() {} + Enemy2(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja); + void izracunajbrzinu(float igracx,float igracy,float dt); + void izracunajpoz(float igracx,float igracy,float dt); +}; + +#endif diff --git a/src/includes/Enemy3.hpp b/src/includes/Enemy3.hpp new file mode 100644 index 0000000..e1498bf --- /dev/null +++ b/src/includes/Enemy3.hpp @@ -0,0 +1,17 @@ +#ifndef ENEMY3_H +#define ENEMY3_H + +#include"Entity.hpp" +class Enemy3:public Entity +{ + private: + float vx,vy; + public: + static float time; + Enemy3():Entity() {} + Enemy3(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja); + void izracunajpoz(float dt); + void izracunajbrzinu(int sirina,int duzina); +}; + +#endif diff --git a/src/includes/Entity.hpp b/src/includes/Entity.hpp new file mode 100644 index 0000000..7f83c98 --- /dev/null +++ b/src/includes/Entity.hpp @@ -0,0 +1,15 @@ +#ifndef ENTITY_H +#define ENTITY_H + +#include<SFML/Graphics.hpp> +class Entity +{ + public: + bool ziv=1; + float x,y; + sf::RectangleShape telo; + Entity() {} Entity(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja); + void respawn(int sirina,int visina); +}; + +#endif diff --git a/src/includes/Game.hpp b/src/includes/Game.hpp new file mode 100644 index 0000000..4418ab3 --- /dev/null +++ b/src/includes/Game.hpp @@ -0,0 +1,54 @@ +#ifndef GAME_H +#define GAME_H + +#include"Player.hpp" +#include"Enemy1.hpp" +#include"Enemy2.hpp" +#include"Enemy3.hpp" +#include"Powerup.hpp" + +class Game +{ + private: + sf::Font font; + sf::Texture healthtex,neprijateljtex; + float dt; + sf::Clock sat,time; + + Player igrac; + std::vector<Enemy1> nep1; + std::vector<Enemy2> nep2; + std::vector<Enemy3> nep3; + std::vector<Powerup> pow; + + int visina,sirina; + sf::RenderWindow *prozor; + + sf::CircleShape krug; + sf::RectangleShape health,healthblank,stomp,stompblank; + sf::Text healthtext,stomptext,fps,score; + + void keyboard(); + void run(); + void draw(); + void stompmain(); + + void updateui(); + void updatedt(); + bool gameover(); + void respawn(); + void position(); + void checkcollision(); + + void initshapes(); + void initui(); + void inittex(); + void initent(); + void updatewin(); + public: + Game() {} + Game(sf::RenderWindow *glprozor); + void loop(bool ischanged,bool pause); +}; + +#endif diff --git a/src/includes/Global.hpp b/src/includes/Global.hpp new file mode 100644 index 0000000..bfb808a --- /dev/null +++ b/src/includes/Global.hpp @@ -0,0 +1,12 @@ +#ifndef GLOBAL_H +#define GLOBAL_H + +#include<random> +#define seseku(a,b) a.getGlobalBounds().intersects(b.getGlobalBounds()) +class Global +{ + public: + static std::mt19937 rng; +}; + +#endif diff --git a/src/includes/Player.hpp b/src/includes/Player.hpp new file mode 100644 index 0000000..3a2a040 --- /dev/null +++ b/src/includes/Player.hpp @@ -0,0 +1,17 @@ +#ifndef PLAYER_H +#define PLAYER_H + +#include"Entity.hpp" +class Player:public Entity +{ + public: + int health,xp; + int stomprad=270; + float stomptime; + + Player():Entity() {} + Player(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja); + void updatest(float dt); +}; + +#endif diff --git a/src/includes/Powerup.hpp b/src/includes/Powerup.hpp new file mode 100644 index 0000000..2b6ec72 --- /dev/null +++ b/src/includes/Powerup.hpp @@ -0,0 +1,13 @@ +#ifndef POWRUP_H +#define POWERUP_H + +#include"Entity.hpp" +class Powerup:public Entity +{ + public: + static float time; + Powerup():Entity() {} + Powerup(sf::Vector2f pozicija,sf::Vector2f velicina,sf::Color boja); +}; + +#endif diff --git a/src/includes/State.hpp b/src/includes/State.hpp new file mode 100644 index 0000000..fdde7b8 --- /dev/null +++ b/src/includes/State.hpp @@ -0,0 +1,19 @@ +#ifndef STATE_H +#define STATE_H + +#include<SFML/Graphics.hpp> +class State +{ + private: + sf::RenderWindow prozor; + int visina,sirina; + bool ischanged=0,pause=0; + + void events(); + void keyboard(); + public: + State(); + void loop(); +}; + +#endif diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..dbb1610 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,8 @@ +#include"includes/Global.hpp" +#include"includes/State.hpp" +int main() +{ + State program; + program.loop(); + return 0; +} |
