From e5ee39e736946dab08545489522ea0624525472a Mon Sep 17 00:00:00 2001 From: Riyyi Date: Sun, 15 Mar 2015 22:33:39 +0100 Subject: [PATCH] Added Input and Enity Added InputManager Added Entity Added EntityManager --- src/{ => data}/gfx/Tilesheet.png | Bin src/data/gfx/test.png | Bin 0 -> 388 bytes src/data/map/level1.csv | 25 ++++++ src/{ => data}/map/level1.json | 0 src/{ => data}/map/level1.tmx | 0 src/entity.h | 74 ++++++++++++++++++ src/entitymanager.h | 98 ++++++++++++++++++++++++ src/include/SFML/lib/libsfml-graphics.a | Bin 0 -> 281694 bytes src/inputmanager.cpp | 98 ++++++++++++++++++++++++ src/inputmanager.h | 39 ++++++++++ src/main.cpp | 41 +++++++++- src/maploader.cpp | 12 --- src/maploader.h | 12 --- src/rpg.pro | 6 +- 14 files changed, 378 insertions(+), 27 deletions(-) rename src/{ => data}/gfx/Tilesheet.png (100%) create mode 100644 src/data/gfx/test.png create mode 100644 src/data/map/level1.csv rename src/{ => data}/map/level1.json (100%) rename src/{ => data}/map/level1.tmx (100%) create mode 100644 src/entity.h create mode 100644 src/entitymanager.h create mode 100644 src/include/SFML/lib/libsfml-graphics.a create mode 100644 src/inputmanager.cpp create mode 100644 src/inputmanager.h delete mode 100644 src/maploader.cpp delete mode 100644 src/maploader.h diff --git a/src/gfx/Tilesheet.png b/src/data/gfx/Tilesheet.png similarity index 100% rename from src/gfx/Tilesheet.png rename to src/data/gfx/Tilesheet.png diff --git a/src/data/gfx/test.png b/src/data/gfx/test.png new file mode 100644 index 0000000000000000000000000000000000000000..6d48b7d4e1ed2cefe3820e48f8b8e0c610ae2ab2 GIT binary patch literal 388 zcmV-~0ek+5P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0U1d|K~zXftCyes{P6YrAN1ZYl@u#Ww5C>^yY~2M|iYHbBN`Ns3Pjo9Add5s_uw?mAX9E z3~8Uck8pt0kQ!1$S`iiQqtb*B<*+ks#Yl+|C9n`zrm4b)bd9-+s3Cs3k;Jn3CMty3 zkfyO_2=ya09f|}NI^_CkC_TCbhCI4>pkTzK^XLNV>dht}3z})>2ZW6@*1X+;g4HKX i&paFuo(ZTouImpVODH>pgH9R%0000 +#include + +class Entity : public sf::Sprite +{ +public: + Entity() { + this->active = 1; + this->texture = new sf::Texture(); + } + + Entity(std::string fileName) { + this->active = 1; + this->texture = new sf::Texture; + this->Load(fileName); + } + + Entity(std::string fileName, sf::IntRect rect) { + this->active = 1; + this->texture = new sf::Texture(); + this->Load(fileName, rect); + } + + void Load(std::string fileName) { + this->texture->loadFromFile(fileName, sf::IntRect()); + this->setTexture(*this->texture); + } + + void Load(std::string fileName, sf::IntRect rect) { + this->texture->loadFromFile(fileName, rect); + this->setTexture(*this->texture); + } + + bool Collision(Entity *entity) { + if(entity != NULL) { + return this->getGlobalBounds().intersects(entity->getGlobalBounds()); + } + + return false; + } + + void SetActive(int active) { + this->active = active; + } + + int Active() { + return this->active; + } + + int Group() { + return this->groupId; + } + + virtual void Update() { + this->move(this->velocity); + } + + ~Entity() { + delete this->texture; + } + + sf::Vector2f velocity; + +protected: + int active, groupId; + +private: + sf::Texture* texture; +}; + +#endif // ENTITY_H diff --git a/src/entitymanager.h b/src/entitymanager.h new file mode 100644 index 0000000..24a46db --- /dev/null +++ b/src/entitymanager.h @@ -0,0 +1,98 @@ +#ifndef ENTITYMANAGER +#define ENTITYMANAGER + +#include +#include + +#include "entity.h" + +typedef void CollisionUpdateEvent(Entity* entityA, Entity* entityB); + +class EntityManager +{ +public: + EntityManager() { + + } + + void SetCollisionMethod(CollisionUpdateEvent collisionsEvent) { + this->collisionsEvent = collisionsEvent; + } + + void AddEntity(std::string name, Entity* entity) { + std::unordered_map::const_iterator found = this->entities.find(name); + while(found != this->entities.end()) { + name += "0"; + found = this->entities.find(name); + } + + this->entities.insert(std::make_pair(name, entity)); + } + + Entity* Get(std::string name) { + std::unordered_map::const_iterator found = this->entities.find(name); + if(found != this->entities.end()) { + return found->second; + } + + return NULL; + } + + void Update() { + std::vector toRemove; + + for (auto& iterator : this->entities) { + if (iterator.second != NULL) { + if (this->collisionsEvent != NULL) { + for (auto& iterator2 : this->entities) { + if (iterator != iterator2) { + if (iterator.second->Collision(iterator2.second)) { + this->collisionsEvent(iterator.second, iterator2.second); + } + } + } + } + + if (iterator.second->Active()) { + iterator.second->Update(); + } + else { + toRemove.push_back(iterator.first); + } + } + } + + while (toRemove.size() > 0) { + this->entities.erase(toRemove[toRemove.size() - 1]); + toRemove.pop_back(); + } + + toRemove.clear(); + } + + + void Render(sf::RenderWindow* window) { + for (auto& iterator : this->entities) { + if (iterator.second != NULL) { + if (iterator.second->Active()) { + window->draw(*iterator.second); + } + } + } + } + + ~EntityManager() { + for (auto& iterator : this->entities) { + delete iterator.second; + } + + this->entities.clear(); + } + +private: + std::unordered_map entities; + CollisionUpdateEvent* collisionsEvent; +}; + +#endif // ENTITYMANAGER + diff --git a/src/include/SFML/lib/libsfml-graphics.a b/src/include/SFML/lib/libsfml-graphics.a new file mode 100644 index 0000000000000000000000000000000000000000..9859e26f23bc739e29f3d606c1cb54222e166677 GIT binary patch literal 281694 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 B=iLAR literal 0 HcmV?d00001 diff --git a/src/inputmanager.cpp b/src/inputmanager.cpp new file mode 100644 index 0000000..c03914d --- /dev/null +++ b/src/inputmanager.cpp @@ -0,0 +1,98 @@ +#include "inputmanager.h" + +InputManager::InputManager() { + +} + +InputManager::~InputManager() { + +} + +sf::Keyboard::Key InputManager::KeyboardConfiguration(Input key) { +// Left = 0, +// Right, +// Up, +// Down, + + if(key == Left) return sf::Keyboard::A; + if(key == Right) return sf::Keyboard::E; + if(key == Up) return sf::Keyboard::Comma; + if(key == Down) return sf::Keyboard::O; + + return sf::Keyboard::Unknown; +} + +int InputManager::JoystickConfiguration(Input key) { +// if(key == Left) return 2; +// if(key == Right) return 1; +// if(key == Up) return 3; +// if(key == Down) return 0; + + return -1; +} + +void InputManager::JoystickAxisConfiguration(Input key, sf::Joystick::Axis& axis, float& position) { + if(key == Left) { + axis = sf::Joystick::PovY; + position = -100; + } + + if(key == Right) { + axis = sf::Joystick::PovY; + position = 100; + } + + if(key == Up) { + axis = sf::Joystick::PovX; + position = 100; + } + + if(key == Down) { + axis = sf::Joystick::PovX; + position = -100; + } +} + +bool InputManager::IsKeyBoardPressed(sf::Keyboard::Key key) { + return sf::Keyboard::isKeyPressed(key); +} + +bool InputManager::IsJoystickPressed(unsigned int joystick, unsigned int button) { + return sf::Joystick::isButtonPressed(joystick, button); +} + +bool InputManager::IsJoystickAxis(unsigned int joystick, sf::Joystick::Axis axis, float position) { + return sf::Joystick::getAxisPosition(joystick, axis) == position; +} + +bool InputManager::IsPressed(Input key, unsigned int joystick) { + sf::Keyboard::Key myKeyboardKey = KeyboardConfiguration(key); + if(myKeyboardKey != sf::Keyboard::Unknown) { + if(IsKeyBoardPressed(myKeyboardKey)) { + return true; + } + } + + + int myJoystickKey = JoystickConfiguration(key); + if(myJoystickKey != -1) { + if(IsJoystickPressed(joystick, myJoystickKey)) { + return true; + } + } + + sf::Joystick::Axis axis; + float position = 0; + JoystickAxisConfiguration(key, axis, position); + if(position != 0) { + if(IsJoystickAxis(joystick, axis, position)) { + return true; + } + } + + return false; +} + +//bool sf::Keyboard::isKeyPressed(sf::Keyboard::Escape) +//bool sf::Joystick::isButtonPressed(0, 1); +//float sf::Joystick::getAxisPosition(0, sf::Joystick::Y); diff --git a/src/inputmanager.h b/src/inputmanager.h new file mode 100644 index 0000000..3a7d47a --- /dev/null +++ b/src/inputmanager.h @@ -0,0 +1,39 @@ +#ifndef INPUTMANAGER_H +#define INPUTMANAGER_H + +#include +#include + +class InputManager +{ +public: + InputManager(); + ~InputManager(); + + enum Input + { + Left = 0, + Right, + Up, + Down, + + KeyCount ///< Keep last -- the total number of inputs + }; + + sf::Keyboard::Key KeyboardConfiguration(Input key); + int JoystickConfiguration(Input key); + void JoystickAxisConfiguration(Input key, sf::Joystick::Axis& axis, float& position); + bool IsKeyBoardPressed(sf::Keyboard::Key); + bool IsJoystickPressed(unsigned int joystick, unsigned int button); + bool IsJoystickAxis(unsigned int joystick, sf::Joystick::Axis axis, float position); + bool IsPressed(Input key, unsigned int joystick = 0); +}; + +extern InputManager inputManager; + +#endif // INPUTMANAGER_H + + +//bool sf::Keyboard::isKeyPressed(sf::Keyboard::Escape) +//bool sf::Joystick::isButtonPressed(0, 1); +//float sf::Joystick::getAxisPosition(0, sf::Joystick::Y); diff --git a/src/main.cpp b/src/main.cpp index b269330..cb203e8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,15 @@ #include #include +#include "inputmanager.h" +#include "entitymanager.h" + +InputManager inputManager; + +void UpdateCollisions(Entity* entityA, Entity* entityB) { + std::cout << "Collisions!" << std::endl; +} + int main() { std::cout << "Hello World!" << std::endl; @@ -17,6 +26,17 @@ int main() sf::Clock timer; sf::Time timeElapsed; + EntityManager entityManager; + entityManager.AddEntity("test", new Entity("data\\gfx\\test.png")); + entityManager.AddEntity("test", new Entity("data\\gfx\\test.png")); + entityManager.SetCollisionMethod(UpdateCollisions); + +// Entity entity; +// entity.Load("data\\gfx\\test.png"); + +// Entity entity2; +// entity2.Load("data\\gfx\\test.png"); + // Run the program as long as the window is open while (window.isOpen()) { @@ -25,8 +45,9 @@ int main() while (window.pollEvent(event)) { // Close window : exit - if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) + if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) { window.close(); + } // Enter fullscreen mode : key combination : Alt+Enter if (event.type == sf::Event::KeyPressed) { @@ -44,9 +65,27 @@ int main() } } } + + if(inputManager.IsPressed(InputManager::Left)) { + std::cout << "LEFT" << std::endl; + } + + if(inputManager.IsPressed(InputManager::Down)) { + std::cout << "DOWN" << std::endl; + } } +// if(entity.Collision(&entity2)) { +// std::cout << "COLLISION!" << std::endl; +// } + window.clear(sf::Color(72, 152, 72)); + +// window.draw(entity); +// window.draw(entity2); + + entityManager.Render(&window); + window.display(); timeElapsed = timer.getElapsedTime(); diff --git a/src/maploader.cpp b/src/maploader.cpp deleted file mode 100644 index 4f582a4..0000000 --- a/src/maploader.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "maploader.h" - -MapLoader::MapLoader() -{ - -} - -MapLoader::~MapLoader() -{ - -} - diff --git a/src/maploader.h b/src/maploader.h deleted file mode 100644 index 30e4193..0000000 --- a/src/maploader.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef MAPLOADER_H -#define MAPLOADER_H - - -class MapLoader -{ -public: - MapLoader(); - ~MapLoader(); -}; - -#endif // MAPLOADER_H diff --git a/src/rpg.pro b/src/rpg.pro index cc91460..295ea39 100644 --- a/src/rpg.pro +++ b/src/rpg.pro @@ -18,8 +18,10 @@ DEPENDPATH += $$PWD/include TEMPLATE = app SOURCES += main.cpp \ - maploader.cpp + inputmanager.cpp HEADERS += \ - maploader.h + inputmanager.h \ + entity.h \ + entitymanager.h