From cebde72729872668fe8ee11d4a0303abeb508ceb Mon Sep 17 00:00:00 2001 From: Ralusama19 Date: Fri, 20 Jan 2017 23:52:42 +0100 Subject: [PATCH 1/3] menu and scenes --- VaporWaveWars/VaporWaveWars.pro | 8 +++++-- VaporWaveWars/button.cpp | 9 ++++---- VaporWaveWars/button.hpp | 4 ++-- VaporWaveWars/commons.hpp | 6 +++-- VaporWaveWars/compas.hpp | 3 +-- VaporWaveWars/game.cpp | 4 ++++ VaporWaveWars/game.hpp | 2 +- VaporWaveWars/main.cpp | 2 +- VaporWaveWars/menu.cpp | 40 +++++++++++++++++++++++++++++++++ VaporWaveWars/menu.hpp | 22 ++++++++++++++++++ VaporWaveWars/mygame.cpp | 36 ++++++++++++++++++++--------- VaporWaveWars/mygame.hpp | 8 +++++-- VaporWaveWars/scene.cpp | 8 +++++++ VaporWaveWars/scene.hpp | 18 +++++++++++++++ 14 files changed, 144 insertions(+), 26 deletions(-) create mode 100644 VaporWaveWars/menu.cpp create mode 100644 VaporWaveWars/menu.hpp create mode 100644 VaporWaveWars/scene.cpp create mode 100644 VaporWaveWars/scene.hpp diff --git a/VaporWaveWars/VaporWaveWars.pro b/VaporWaveWars/VaporWaveWars.pro index 7ff1c56..8515d27 100644 --- a/VaporWaveWars/VaporWaveWars.pro +++ b/VaporWaveWars/VaporWaveWars.pro @@ -9,7 +9,9 @@ SOURCES += main.cpp \ mygame.cpp \ button.cpp \ character.cpp \ - compas.cpp + compas.cpp \ + scene.cpp \ + menu.cpp HEADERS += \ game.hpp \ @@ -17,4 +19,6 @@ HEADERS += \ commons.hpp \ button.hpp \ character.hpp \ - compas.hpp + compas.hpp \ + scene.hpp \ + menu.hpp diff --git a/VaporWaveWars/button.cpp b/VaporWaveWars/button.cpp index b6cd7aa..6d1fdd0 100644 --- a/VaporWaveWars/button.cpp +++ b/VaporWaveWars/button.cpp @@ -25,11 +25,11 @@ int Button::getClicks(){ int c = _clicks; //cout << "popping clicks " << c << endl; _clicks = 0; - //cout << "popclicks = " << _clicks << endl; + if (_clicks > 0) std::cout << "popclicks = " << _clicks << std::endl; return c; } -void Button::update(sf::Vector2i mousePosition){ +void Button::update(sf::Vector2f mousePosition){ //cout << "state = " << _state << endl; if(_state != ButtonState::off){ if(!inside(mousePosition)) _state = 0; @@ -39,7 +39,7 @@ void Button::update(sf::Vector2i mousePosition){ setTextureRect(sf::IntRect(0,_ySize*_state,_xSize,_ySize)); } -bool Button::inside(sf::Vector2i position){ +bool Button::inside(sf::Vector2f position){ sf::FloatRect boundingBox = getGlobalBounds(); if (boundingBox.contains(sf::Vector2f(position.x, position.y))) return true; //cout << "outside!" << endl; @@ -51,13 +51,14 @@ void Button::handleMouseEvent(sf::Event& event){ switch (event.type){ case (sf::Event::MouseButtonPressed): if(_state == ButtonState::active) _state = ButtonState::pressed; + std::cout << "pressed!" << _clicks << std::endl; break; case (sf::Event::MouseButtonReleased): if(_state == ButtonState::pressed){ _state = ButtonState::active; ++_clicks; - //cout << "Click!" << _clicks << endl; + std::cout << "released!" << _clicks << std::endl; } break; diff --git a/VaporWaveWars/button.hpp b/VaporWaveWars/button.hpp index bcebec5..2b23e7c 100644 --- a/VaporWaveWars/button.hpp +++ b/VaporWaveWars/button.hpp @@ -13,13 +13,13 @@ public: int getClicks(); //buttons auto-detect if they are pressed, you just have to passa mouse-event to them void handleMouseEvent(sf::Event& event); - void update(sf::Vector2i mousePosition); + void update(sf::Vector2f mousePosition); protected: int _xSize; int _ySize; sf::Texture _texture; - bool inside(sf::Vector2i position); + bool inside(sf::Vector2f position); private: int _clicks; diff --git a/VaporWaveWars/commons.hpp b/VaporWaveWars/commons.hpp index 1e10a32..370d6fb 100644 --- a/VaporWaveWars/commons.hpp +++ b/VaporWaveWars/commons.hpp @@ -8,6 +8,8 @@ #include #include +const int SCENE_NUM = 4; + #define ASSERT(expression) do \ { \ if(!(expression)) { \ @@ -26,8 +28,8 @@ namespace ButtonState { enum basicState {released, active, pressed, off}; } -namespace GameState { - enum gameState{menu,inGame,help,credits}; +namespace GameScene { + enum gameScene{menu,inGame,help,credits}; } namespace PlayerState { diff --git a/VaporWaveWars/compas.hpp b/VaporWaveWars/compas.hpp index 8067e04..2b4b3e9 100644 --- a/VaporWaveWars/compas.hpp +++ b/VaporWaveWars/compas.hpp @@ -7,8 +7,7 @@ static const float margeErr = 0.80f; -class Compas -{ +class Compas{ private: bool isPress; diff --git a/VaporWaveWars/game.cpp b/VaporWaveWars/game.cpp index f266897..97a80c7 100644 --- a/VaporWaveWars/game.cpp +++ b/VaporWaveWars/game.cpp @@ -13,6 +13,10 @@ Game::~Game() { Game::instance = nullptr; } +Game* Game::i() { + return Game::instance; +} + // Main game loop void Game::run() { sf::Clock c; diff --git a/VaporWaveWars/game.hpp b/VaporWaveWars/game.hpp index 4bcba7a..3b5a682 100644 --- a/VaporWaveWars/game.hpp +++ b/VaporWaveWars/game.hpp @@ -6,7 +6,7 @@ class Game { public: Game(); virtual ~Game(); - static Game* i() { return Game::instance;} + static Game* i(); virtual void run(); diff --git a/VaporWaveWars/main.cpp b/VaporWaveWars/main.cpp index 2b3398f..bf0efb6 100644 --- a/VaporWaveWars/main.cpp +++ b/VaporWaveWars/main.cpp @@ -1,7 +1,7 @@ #include "mygame.hpp" #include "compas.hpp" int main() { - MyGame game = MyGame(); + MyGame game; game.run(); return 0; } diff --git a/VaporWaveWars/menu.cpp b/VaporWaveWars/menu.cpp new file mode 100644 index 0000000..4f40179 --- /dev/null +++ b/VaporWaveWars/menu.cpp @@ -0,0 +1,40 @@ +#include "menu.hpp" +#include "mygame.hpp" + +Menu::Menu() { + _start.setPosition(5,5); + _exit.setPosition(100,100); + _start.turnOn(); + _exit.turnOn(); + _buttons.push_back(&_start); + _buttons.push_back(&_exit); +} + +void Menu::update(float deltaTime, sf::RenderWindow*window){ + //float dx = InputManager::action(InputAction::moveX0); + //_buttons[0]->move(dx,0); + //std::cout << dx << std::endl; + for(unsigned int i = 0; i < _buttons.size(); ++i){ + _buttons[i]->update(window->mapPixelToCoords(sf::Vector2i(sf::Mouse::getPosition(*window)))); + } +} + +void Menu::draw(sf::RenderWindow* window){ + for(unsigned int i = 0; i < _buttons.size(); ++i){ + window->draw(*_buttons[i]); + } +} + +void Menu::updateButtons(sf::Event e){ +// std::cout << "update menu buttons" << std::endl; + for(unsigned int i = 0; i < _buttons.size(); ++i){ + _buttons[i]->handleMouseEvent(e); + } + MyGame* g = static_cast(Game::i()); + if (_start.getClicks() > 0){ +// g->changeScene(GameScene::inGame); + std::cout << "Game not ready to be played. Please Wait." << std::endl; + } + else if(_exit.getClicks() > 0) g->isRunning = false; + +} diff --git a/VaporWaveWars/menu.hpp b/VaporWaveWars/menu.hpp new file mode 100644 index 0000000..ae4cdcb --- /dev/null +++ b/VaporWaveWars/menu.hpp @@ -0,0 +1,22 @@ +#ifndef MENU_HPP +#define MENU_HPP +#include "commons.hpp" +#include "scene.hpp" +#include "button.hpp" +class Menu : public Scene{ + public: + Menu(); + Menu(const Menu& m) = delete; + Menu(const Menu&& m) = delete; + Menu& operator=(Menu& m) = delete; + Menu& operator=(Menu&& m) = delete; + void update(float deltaTime, sf::RenderWindow *window) final override; + void draw(sf::RenderWindow *window) final override; + void updateButtons(sf::Event e) final override; + private: + Button _start = Button("/home/raluca/Projects/WaveGGJ17/build-VaporWaveWars-Desktop-Debug/Resources/buttontejempl.png"); + Button _exit = Button("/home/raluca/Projects/WaveGGJ17/build-VaporWaveWars-Desktop-Debug/Resources/buttontejempl2.png"); + std::vector _buttons; +}; + +#endif // MENU_HPP diff --git a/VaporWaveWars/mygame.cpp b/VaporWaveWars/mygame.cpp index 6fb3bc3..ecbb645 100644 --- a/VaporWaveWars/mygame.cpp +++ b/VaporWaveWars/mygame.cpp @@ -1,48 +1,64 @@ #include "mygame.hpp" MyGame::MyGame() { - _state = GameState::menu; + _scene = GameScene::menu; + _scenes = std::vector(SCENE_NUM); + _scenes[GameScene::menu] = &_menu; std::cout << "in menu" << std::endl; + } MyGame::~MyGame() { } +MyGame* i(){ + return static_cast(Game::i()); +} + +void MyGame::changeScene(GameScene::gameScene n){ + _scene = n; +} + // Main game loop void MyGame::update(float deltaTime, sf::RenderWindow*window) { sf::Event event; while(window->pollEvent(event)){ switch (event.type) { - case (sf::Event::Closed): + case (sf::Event::Closed): Game::i()->isRunning = false; break; - case (sf::Event::KeyPressed): + case (sf::Event::KeyPressed): if(event.key.code == sf::Keyboard::Escape) // Exit the game like this Game::i()->isRunning = false; break; - case (sf::Event::MouseMoved): - case (sf::Event::MouseButtonPressed): - switch(_state){ - case(GameState::menu): - std::cout << "still in menu" << std::endl; + case (sf::Event::MouseMoved): + case (sf::Event::MouseButtonPressed): + case (sf::Event::MouseButtonReleased): + + _scenes[_scene]->updateButtons(event); + switch(_scene){ + case(GameScene::menu): + //std::cout << "still in menu" << std::endl; break; - default: + default: break; } - default: + default: break; } } // do shit + _scenes[_scene]->update(deltaTime,window); } void MyGame::draw(sf::RenderWindow*window) { //a e s t h e t i c s window->clear(sf::Color::Cyan); // draw shit + _scenes[_scene]->draw(window); window->display(); } diff --git a/VaporWaveWars/mygame.hpp b/VaporWaveWars/mygame.hpp index 0b544fe..c6c9236 100644 --- a/VaporWaveWars/mygame.hpp +++ b/VaporWaveWars/mygame.hpp @@ -1,14 +1,18 @@ #ifndef MYGAME_HPP #define MYGAME_HPP #include "game.hpp" - +#include "menu.hpp" class MyGame : public Game{ public: MyGame(); virtual ~MyGame(); + static MyGame* i(); + void changeScene(GameScene::gameScene n); private: - GameState::gameState _state; + GameScene::gameScene _scene; + std::vector _scenes; + Menu _menu; virtual void update(float deltaTime, sf::RenderWindow *window) final override; virtual void draw(sf::RenderWindow *window) final override; }; diff --git a/VaporWaveWars/scene.cpp b/VaporWaveWars/scene.cpp new file mode 100644 index 0000000..1848f21 --- /dev/null +++ b/VaporWaveWars/scene.cpp @@ -0,0 +1,8 @@ +#include "scene.hpp" + +Scene::Scene(){ +} + +Scene::~Scene(){ + +} diff --git a/VaporWaveWars/scene.hpp b/VaporWaveWars/scene.hpp new file mode 100644 index 0000000..a4d4bb7 --- /dev/null +++ b/VaporWaveWars/scene.hpp @@ -0,0 +1,18 @@ +#ifndef SCENE_HPP +#define SCENE_HPP + +#include "commons.hpp" +#include "game.hpp" +class Scene +{ + public: + Scene(); + virtual ~Scene(); + virtual void update(float deltaTime, sf::RenderWindow *window) = 0; + virtual void draw(sf::RenderWindow *window) = 0; + virtual void updateButtons(sf::Event) = 0; + protected: + Game* parent; +}; + +#endif // SCENE_HPP From 9319bbf7839c45eb702318c6b47a2a378bc9ac58 Mon Sep 17 00:00:00 2001 From: Ralusama19 Date: Sat, 21 Jan 2017 01:30:46 +0100 Subject: [PATCH 2/3] renamed stuff --- VaporWaveWars/button.cpp | 6 +++--- VaporWaveWars/menu.cpp | 2 +- VaporWaveWars/menu.hpp | 2 +- VaporWaveWars/mygame.cpp | 2 +- VaporWaveWars/scene.hpp | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/VaporWaveWars/button.cpp b/VaporWaveWars/button.cpp index 6d1fdd0..9acc450 100644 --- a/VaporWaveWars/button.cpp +++ b/VaporWaveWars/button.cpp @@ -25,7 +25,7 @@ int Button::getClicks(){ int c = _clicks; //cout << "popping clicks " << c << endl; _clicks = 0; - if (_clicks > 0) std::cout << "popclicks = " << _clicks << std::endl; + //if (_clicks > 0) std::cout << "popclicks = " << _clicks << std::endl; return c; } @@ -51,14 +51,14 @@ void Button::handleMouseEvent(sf::Event& event){ switch (event.type){ case (sf::Event::MouseButtonPressed): if(_state == ButtonState::active) _state = ButtonState::pressed; - std::cout << "pressed!" << _clicks << std::endl; + //std::cout << "pressed!" << _clicks << std::endl; break; case (sf::Event::MouseButtonReleased): if(_state == ButtonState::pressed){ _state = ButtonState::active; ++_clicks; - std::cout << "released!" << _clicks << std::endl; + //std::cout << "released!" << _clicks << std::endl; } break; diff --git a/VaporWaveWars/menu.cpp b/VaporWaveWars/menu.cpp index 4f40179..e41b0c2 100644 --- a/VaporWaveWars/menu.cpp +++ b/VaporWaveWars/menu.cpp @@ -25,7 +25,7 @@ void Menu::draw(sf::RenderWindow* window){ } } -void Menu::updateButtons(sf::Event e){ +void Menu::updateEvents(sf::Event e){ // std::cout << "update menu buttons" << std::endl; for(unsigned int i = 0; i < _buttons.size(); ++i){ _buttons[i]->handleMouseEvent(e); diff --git a/VaporWaveWars/menu.hpp b/VaporWaveWars/menu.hpp index ae4cdcb..7b10b1a 100644 --- a/VaporWaveWars/menu.hpp +++ b/VaporWaveWars/menu.hpp @@ -12,7 +12,7 @@ class Menu : public Scene{ Menu& operator=(Menu&& m) = delete; void update(float deltaTime, sf::RenderWindow *window) final override; void draw(sf::RenderWindow *window) final override; - void updateButtons(sf::Event e) final override; + void updateEvents(sf::Event e) final override; private: Button _start = Button("/home/raluca/Projects/WaveGGJ17/build-VaporWaveWars-Desktop-Debug/Resources/buttontejempl.png"); Button _exit = Button("/home/raluca/Projects/WaveGGJ17/build-VaporWaveWars-Desktop-Debug/Resources/buttontejempl2.png"); diff --git a/VaporWaveWars/mygame.cpp b/VaporWaveWars/mygame.cpp index 29df3e6..40319a0 100644 --- a/VaporWaveWars/mygame.cpp +++ b/VaporWaveWars/mygame.cpp @@ -36,7 +36,7 @@ void MyGame::update(float deltaTime, sf::RenderWindow*window) { case (sf::Event::MouseButtonPressed): case (sf::Event::MouseButtonReleased): - _scenes[_scene]->updateButtons(event); + _scenes[_scene]->updateEvents(event); switch(_scene){ case(GameScene::menu): //std::cout << "still in menu" << std::endl; diff --git a/VaporWaveWars/scene.hpp b/VaporWaveWars/scene.hpp index a4d4bb7..2e4de31 100644 --- a/VaporWaveWars/scene.hpp +++ b/VaporWaveWars/scene.hpp @@ -10,7 +10,7 @@ class Scene virtual ~Scene(); virtual void update(float deltaTime, sf::RenderWindow *window) = 0; virtual void draw(sf::RenderWindow *window) = 0; - virtual void updateButtons(sf::Event) = 0; + virtual void updateEvents(sf::Event) = 0; protected: Game* parent; }; From 3e03825124de7f8dba483246c1268e2f19a6ff01 Mon Sep 17 00:00:00 2001 From: vylion Date: Sat, 21 Jan 2017 01:47:13 +0100 Subject: [PATCH 3/3] Added spreadsheet --- Resources/spreadsheet.png | Bin 0 -> 22138 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Resources/spreadsheet.png diff --git a/Resources/spreadsheet.png b/Resources/spreadsheet.png new file mode 100644 index 0000000000000000000000000000000000000000..98ba71f30f5b8de507dd3dc927d2ed37f3635df0 GIT binary patch literal 22138 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ϛV__?Ca29sd)-_TnmDuFmZ!GvG? zas8R$6q5@UmLE#ZWRGtY6lkdaPqW(Jkb+=@h{~;rPK(9C(U&qpc}{2_FFD?K<$J+M zK0+G~*)U^Bp(=R0hg-W9SjHP%j+hLv));v9WN2JEMuj0(qn1b=kZejD*NFms3YJ^% zOO9)pe_leiCKW1={!sM@#Gec{^W)fKRNc!LTqKAw+mXxXlo zs%51%V+AVmO_fCqkO*>T`vj?)4kZ)sO_qGj@O?Kg0hg`UyrKKJ0mw zR&QO9OOAuP(4C}u_!}l+KTx#h;|W+?Zij;HP_P{ewnM>oC;&CE9SZ(Up@7WjDrP$fYBcOD zy@Rr9B=L_2y=Qj*{jj{FK^XWZ_|p2vskcbt%;pjD6_aRF@m2>2BN+wo#Mb^^fmIs!g=v%RKnCkFtqog8c@2VkcBUy}py8)E?mgAG9J W;w!I57pQKe(}ou=oi8}&81Ww?oe-V? literal 0 HcmV?d00001