From 55c8a14a7e2b2dadf0def3e09f970818164366f5 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Thu, 18 Jun 2015 12:14:05 -0400 Subject: Now displaying player character --- src/system.h | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/system.h (limited to 'src/system.h') diff --git a/src/system.h b/src/system.h new file mode 100644 index 0000000..85415f0 --- /dev/null +++ b/src/system.h @@ -0,0 +1,11 @@ +#ifndef SYSTEM_H_B61A8CEA +#define SYSTEM_H_B61A8CEA + +class EntityManager; + +class System { + public: + virtual void tick(EntityManager& manager, float dt) = 0; +}; + +#endif /* end of include guard: SYSTEM_H_B61A8CEA */ -- cgit 1.4.1 From 428c401f9c1053f7e13ffe641758dfb72791d8dc Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Fri, 26 Jun 2015 19:59:28 -0400 Subject: Player now moves --- CMakeLists.txt | 8 +- src/components/animatable.cpp | 27 ++++++ src/components/animatable.h | 31 +++++++ src/components/controllable.cpp | 71 +++++++++++++++ src/components/controllable.h | 36 ++++++++ src/components/droppable.cpp | 11 +++ src/components/droppable.h | 15 ++++ src/components/ponderable.cpp | 41 +++++++++ src/components/ponderable.h | 24 +++++ src/components/sprite_renderable.cpp | 27 ------ src/components/sprite_renderable.h | 25 ------ src/consts.h | 3 + src/direction.h | 11 +++ src/game.cpp | 75 ++++++++++++++++ src/game.h | 24 +++++ src/main.cpp | 25 +----- src/system.h | 10 ++- src/system_manager.h | 37 ++++++++ src/systems/controlling.cpp | 168 +++++++++++++++++++++++++++++++++++ src/systems/controlling.h | 26 ++++++ src/systems/pondering.cpp | 23 +++++ src/systems/pondering.h | 14 +++ src/systems/rendering.cpp | 12 +-- src/systems/rendering.h | 5 +- 24 files changed, 665 insertions(+), 84 deletions(-) create mode 100644 src/components/animatable.cpp create mode 100644 src/components/animatable.h create mode 100644 src/components/controllable.cpp create mode 100644 src/components/controllable.h create mode 100644 src/components/droppable.cpp create mode 100644 src/components/droppable.h create mode 100644 src/components/ponderable.cpp create mode 100644 src/components/ponderable.h delete mode 100644 src/components/sprite_renderable.cpp delete mode 100644 src/components/sprite_renderable.h create mode 100644 src/direction.h create mode 100644 src/game.cpp create mode 100644 src/game.h create mode 100644 src/system_manager.h create mode 100644 src/systems/controlling.cpp create mode 100644 src/systems/controlling.h create mode 100644 src/systems/pondering.cpp create mode 100644 src/systems/pondering.h (limited to 'src/system.h') diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bfde77..9e4ac25 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,9 +50,15 @@ add_executable(Aromatherapy src/renderer.cpp src/muxer.cpp src/entity_manager.cpp - src/components/sprite_renderable.cpp + src/game.cpp src/components/transformable.cpp + src/components/droppable.cpp + src/components/controllable.cpp + src/components/ponderable.cpp + src/components/animatable.cpp src/systems/rendering.cpp + src/systems/controlling.cpp + src/systems/pondering.cpp ) target_link_libraries(Aromatherapy ${ALL_LIBS}) install(TARGETS Aromatherapy RUNTIME DESTINATION ${BIN_DIR}) diff --git a/src/components/animatable.cpp b/src/components/animatable.cpp new file mode 100644 index 0000000..fcd277c --- /dev/null +++ b/src/components/animatable.cpp @@ -0,0 +1,27 @@ +#include "animatable.h" + +AnimatableComponent::AnimatableComponent(const char* filename, int frame_width, int frame_height, int frames_across) + : texture(filename), frame_width(frame_width), frame_height(frame_height), frames_across(frames_across) +{ + +} + +int AnimatableComponent::getFrame() const +{ + return frame; +} + +void AnimatableComponent::setFrame(int frame) +{ + this->frame = frame; +} + +const Texture& AnimatableComponent::getTexture() const +{ + return texture; +} + +Rectangle AnimatableComponent::getFrameRect() const +{ + return {frame_width * (frame % frames_across), frame_height * (frame / frames_across), frame_width, frame_height}; +} diff --git a/src/components/animatable.h b/src/components/animatable.h new file mode 100644 index 0000000..cf6ee54 --- /dev/null +++ b/src/components/animatable.h @@ -0,0 +1,31 @@ +#ifndef SPRITE_RENDERABLE_H_D3AACBBF +#define SPRITE_RENDERABLE_H_D3AACBBF + +#include "component.h" +#include "renderer.h" +#include "direction.h" + +class AnimatableComponent : public Component { + public: + AnimatableComponent(const char* filename, int frame_width, int frame_height, int frames_across); + + int getFrame() const; + void setFrame(int frame); + + const Texture& getTexture() const; + Rectangle getFrameRect() const; + + void setDirection(Direction dir) {}; + void setWalking(bool w) {}; + void setJumping(bool w) {}; + void setCrouching(bool w) {}; + + private: + Texture texture; + int frame_width; + int frame_height; + int frames_across; + int frame = 0; +}; + +#endif /* end of include guard: SPRITE_RENDERABLE_H_D3AACBBF */ diff --git a/src/components/controllable.cpp b/src/components/controllable.cpp new file mode 100644 index 0000000..a4d45f2 --- /dev/null +++ b/src/components/controllable.cpp @@ -0,0 +1,71 @@ +#include "controllable.h" + +int ControllableComponent::getLeftKey() const +{ + return leftKey; +} + +void ControllableComponent::setLeftKey(int k) +{ + leftKey = k; +} + +int ControllableComponent::getRightKey() const +{ + return rightKey; +} + +void ControllableComponent::setRightKey(int k) +{ + rightKey = k; +} + +int ControllableComponent::getJumpKey() const +{ + return jumpKey; +} + +void ControllableComponent::setJumpKey(int k) +{ + jumpKey = k; +} + +int ControllableComponent::getDropKey() const +{ + return dropKey; +} + +void ControllableComponent::setDropKey(int k) +{ + dropKey = k; +} + +bool ControllableComponent::isFrozen() const +{ + return frozen; +} + +void ControllableComponent::setFrozen(bool f) +{ + frozen = f; +} + +bool ControllableComponent::isHoldingLeft() const +{ + return holdingLeft; +} + +void ControllableComponent::setHoldingLeft(bool f) +{ + holdingLeft = f; +} + +bool ControllableComponent::isHoldingRight() const +{ + return holdingRight; +} + +void ControllableComponent::setHoldingRight(bool f) +{ + holdingRight = f; +} diff --git a/src/components/controllable.h b/src/components/controllable.h new file mode 100644 index 0000000..317d68d --- /dev/null +++ b/src/components/controllable.h @@ -0,0 +1,36 @@ +#ifndef CONTROLLABLE_H_4E0B85B4 +#define CONTROLLABLE_H_4E0B85B4 + +#include "component.h" +#include "renderer.h" + +class ControllableComponent : public Component { + public: + int getLeftKey() const; + void setLeftKey(int k); + int getRightKey() const; + void setRightKey(int k); + int getJumpKey() const; + void setJumpKey(int k); + int getDropKey() const; + void setDropKey(int k); + + bool isFrozen() const; + void setFrozen(bool f); + bool isHoldingLeft() const; + void setHoldingLeft(bool f); + bool isHoldingRight() const; + void setHoldingRight(bool f); + + private: + int leftKey = GLFW_KEY_LEFT; + int rightKey = GLFW_KEY_RIGHT; + int jumpKey = GLFW_KEY_UP; + int dropKey = GLFW_KEY_DOWN; + + bool frozen = false; + bool holdingLeft = false; + bool holdingRight = false; +}; + +#endif /* end of include guard: CONTROLLABLE_H_4E0B85B4 */ diff --git a/src/components/droppable.cpp b/src/components/droppable.cpp new file mode 100644 index 0000000..534fd9a --- /dev/null +++ b/src/components/droppable.cpp @@ -0,0 +1,11 @@ +#include "droppable.h" + +void DroppableComponent::setDroppable(bool can) +{ + droppable = can; +} + +bool DroppableComponent::isDroppable() const +{ + return droppable; +} diff --git a/src/components/droppable.h b/src/components/droppable.h new file mode 100644 index 0000000..1f5608b --- /dev/null +++ b/src/components/droppable.h @@ -0,0 +1,15 @@ +#ifndef DROPPABLE_H_5DB254EF +#define DROPPABLE_H_5DB254EF + +#include "component.h" + +class DroppableComponent : public Component { + public: + void setDroppable(bool can); + bool isDroppable() const; + + private: + bool droppable = false; +}; + +#endif /* end of include guard: DROPPABLE_H_5DB254EF */ diff --git a/src/components/ponderable.cpp b/src/components/ponderable.cpp new file mode 100644 index 0000000..2cfa6a6 --- /dev/null +++ b/src/components/ponderable.cpp @@ -0,0 +1,41 @@ +#include "ponderable.h" + +double PonderableComponent::getVelocityX() const +{ + return velocityX; +} + +void PonderableComponent::setVelocityX(double v) +{ + velocityX = v; +} + +double PonderableComponent::getVelocityY() const +{ + return velocityY; +} + +void PonderableComponent::setVelocityY(double v) +{ + velocityY = v; +} + +double PonderableComponent::getAccelX() const +{ + return accelX; +} + +void PonderableComponent::setAccelX(double v) +{ + accelX = v; +} + +double PonderableComponent::getAccelY() const +{ + return accelY; +} + +void PonderableComponent::setAccelY(double v) +{ + accelY = v; +} diff --git a/src/components/ponderable.h b/src/components/ponderable.h new file mode 100644 index 0000000..5aab4b3 --- /dev/null +++ b/src/components/ponderable.h @@ -0,0 +1,24 @@ +#ifndef TANGIBLE_H_746DB3EE +#define TANGIBLE_H_746DB3EE + +#include "component.h" + +class PonderableComponent : public Component { + public: + double getVelocityX() const; + void setVelocityX(double v); + double getVelocityY() const; + void setVelocityY(double v); + double getAccelX() const; + void setAccelX(double v); + double getAccelY() const; + void setAccelY(double v); + + private: + double velocityX = 0.0; + double velocityY = 0.0; + double accelX = 0.0; + double accelY = 0.0; +}; + +#endif /* end of include guard: TANGIBLE_H_746DB3EE */ diff --git a/src/components/sprite_renderable.cpp b/src/components/sprite_renderable.cpp deleted file mode 100644 index 4c61111..0000000 --- a/src/components/sprite_renderable.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "sprite_renderable.h" - -SpriteRenderableComponent::SpriteRenderableComponent(const char* filename, int frame_width, int frame_height, int frames_across) - : texture(filename), frame_width(frame_width), frame_height(frame_height), frames_across(frames_across) -{ - -} - -int SpriteRenderableComponent::getFrame() const -{ - return frame; -} - -void SpriteRenderableComponent::setFrame(int frame) -{ - this->frame = frame; -} - -const Texture& SpriteRenderableComponent::getTexture() const -{ - return texture; -} - -Rectangle SpriteRenderableComponent::getFrameRect() const -{ - return {frame_width * (frame % frames_across), frame_height * (frame / frames_across), frame_width, frame_height}; -} diff --git a/src/components/sprite_renderable.h b/src/components/sprite_renderable.h deleted file mode 100644 index b4465c3..0000000 --- a/src/components/sprite_renderable.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef SPRITE_RENDERABLE_H_D3AACBBF -#define SPRITE_RENDERABLE_H_D3AACBBF - -#include "component.h" -#include "renderer.h" - -class SpriteRenderableComponent : public Component { - public: - SpriteRenderableComponent(const char* filename, int frame_width, int frame_height, int frames_across); - - int getFrame() const; - void setFrame(int frame); - - const Texture& getTexture() const; - Rectangle getFrameRect() const; - - private: - Texture texture; - int frame_width; - int frame_height; - int frames_across; - int frame = 0; -}; - -#endif /* end of include guard: SPRITE_RENDERABLE_H_D3AACBBF */ diff --git a/src/consts.h b/src/consts.h index 804c761..4595719 100644 --- a/src/consts.h +++ b/src/consts.h @@ -11,4 +11,7 @@ const int MAP_HEIGHT = GAME_HEIGHT/TILE_HEIGHT - 1; const int FRAMES_PER_SECOND = 60; const double SECONDS_PER_FRAME = 1.0 / FRAMES_PER_SECOND; +#define JUMP_VELOCITY(h, l) (-2 * (h) / (l)) +#define JUMP_GRAVITY(h, l) (2 * ((h) / (l)) / (l)) + #endif diff --git a/src/direction.h b/src/direction.h new file mode 100644 index 0000000..32d6b41 --- /dev/null +++ b/src/direction.h @@ -0,0 +1,11 @@ +#ifndef DIRECTION_H_9C49EAFD +#define DIRECTION_H_9C49EAFD + +enum class Direction { + Left, + Right, + Up, + Down +}; + +#endif /* end of include guard: DIRECTION_H_9C49EAFD */ diff --git a/src/game.cpp b/src/game.cpp new file mode 100644 index 0000000..b3fa9a8 --- /dev/null +++ b/src/game.cpp @@ -0,0 +1,75 @@ +#include "game.h" +#include "components/animatable.h" +#include "components/transformable.h" +#include "components/controllable.h" +#include "components/droppable.h" +#include "components/ponderable.h" +#include "systems/rendering.h" +#include "systems/controlling.h" +#include "systems/pondering.h" + +void key_callback(GLFWwindow* window, int key, int, int action, int) +{ + Game& game = *((Game*) glfwGetWindowUserPointer(window)); + + if ((action == GLFW_PRESS) && (key == GLFW_KEY_ESCAPE)) + { + game.shouldQuit = true; + + return; + } + + game.systemManager.getSystem().input(key, action); +} + +Game::Game(GLFWwindow* window) : window(window) +{ + systemManager.emplaceSystem(*this); + systemManager.emplaceSystem(*this); + systemManager.emplaceSystem(*this); + + int player = entityManager.emplaceEntity(); + entityManager.emplaceComponent(player, "res/Starla.png", 10, 12, 6); + entityManager.emplaceComponent(player, 203, 44, 10, 12); + entityManager.emplaceComponent(player); + entityManager.emplaceComponent(player); + entityManager.emplaceComponent(player); + + glfwSwapInterval(1); + glfwSetWindowUserPointer(window, this); + glfwSetKeyCallback(window, key_callback); +} + +void Game::execute() +{ + double lastTime = glfwGetTime(); + const double dt = 0.01; + double accumulator = 0.0; + + while (!(shouldQuit || glfwWindowShouldClose(window))) + { + double currentTime = glfwGetTime(); + double frameTime = currentTime - lastTime; + lastTime = currentTime; + + glfwPollEvents(); + + accumulator += frameTime; + while (accumulator >= dt) + { + systemManager.getSystem().tick(dt); + systemManager.getSystem().tick(dt); + + accumulator -= dt; + } + + systemManager.getSystem().tick(frameTime); + } +} + +EntityManager& Game::getEntityManager() +{ + return entityManager; +} + + diff --git a/src/game.h b/src/game.h new file mode 100644 index 0000000..3822700 --- /dev/null +++ b/src/game.h @@ -0,0 +1,24 @@ +#ifndef GAME_H_1014DDC9 +#define GAME_H_1014DDC9 + +#include "renderer.h" +#include "entity_manager.h" +#include "system_manager.h" + +class Game { + public: + Game(GLFWwindow* window); + + void execute(); + EntityManager& getEntityManager(); + + friend void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods); + + private: + EntityManager entityManager; + SystemManager systemManager; + GLFWwindow* const window; + bool shouldQuit = false; +}; + +#endif /* end of include guard: GAME_H_1014DDC9 */ diff --git a/src/main.cpp b/src/main.cpp index dcf8d87..35749f5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,10 +3,7 @@ #include #include "renderer.h" #include "muxer.h" -#include "entity_manager.h" -#include "components/sprite_renderable.h" -#include "components/transformable.h" -#include "systems/rendering.h" +#include "game.h" int main() { @@ -19,24 +16,8 @@ int main() // Put this in a block so game goes out of scope before we destroy the renderer { - EntityManager manager; - - int player = manager.emplaceEntity(); - manager.emplaceComponent(player, "res/Starla.png", 10, 12, 6); - manager.emplaceComponent(player, 203, 44, 10, 12); - - std::list> loop; - loop.push_back(std::unique_ptr(new RenderingSystem())); - - while (!glfwWindowShouldClose(window)) - { - for (auto& sys : loop) - { - sys->tick(manager, 1.0); - } - - glfwPollEvents(); - } + Game game {window}; + game.execute(); } destroyMuxer(); diff --git a/src/system.h b/src/system.h index 85415f0..e08db0a 100644 --- a/src/system.h +++ b/src/system.h @@ -1,11 +1,17 @@ #ifndef SYSTEM_H_B61A8CEA #define SYSTEM_H_B61A8CEA -class EntityManager; +class Game; class System { public: - virtual void tick(EntityManager& manager, float dt) = 0; + System(Game& game) + : game(game) {} + + virtual void tick(double dt) = 0; + + protected: + Game& game; }; #endif /* end of include guard: SYSTEM_H_B61A8CEA */ diff --git a/src/system_manager.h b/src/system_manager.h new file mode 100644 index 0000000..8f76db2 --- /dev/null +++ b/src/system_manager.h @@ -0,0 +1,37 @@ +#ifndef SYSTEM_MANAGER_H_544E6056 +#define SYSTEM_MANAGER_H_544E6056 + +#include +#include +#include +#include +#include "system.h" + +class SystemManager { + private: + std::list> loop; + std::map systems; + + public: + template + void emplaceSystem(Game& game, Args&&... args) + { + std::unique_ptr ptr = std::unique_ptr(new T(game, std::forward(args)...)); + std::type_index systemType = typeid(T); + + systems[systemType] = ptr.get(); + loop.push_back(std::move(ptr)); + } + + template + T& getSystem() + { + std::type_index systemType = typeid(T); + + assert(systems.count(systemType) == 1); + + return *((T*)systems[systemType]); + } +}; + +#endif /* end of include guard: SYSTEM_MANAGER_H_544E6056 */ diff --git a/src/systems/controlling.cpp b/src/systems/controlling.cpp new file mode 100644 index 0000000..b1e73ad --- /dev/null +++ b/src/systems/controlling.cpp @@ -0,0 +1,168 @@ +#include "controlling.h" +#include "game.h" +#include "components/controllable.h" +#include "components/ponderable.h" +#include "components/animatable.h" +#include "components/droppable.h" +#include "direction.h" +#include "muxer.h" +#include "consts.h" + +void ControllingSystem::tick(double dt) +{ + while (!actions.empty()) + { + int key = actions.front().first; + int action = actions.front().second; + + auto entities = game.getEntityManager().getEntitiesWithComponents(); + for (auto entity : entities) + { + auto& controllable = game.getEntityManager().getComponent(entity); + + if (action == GLFW_PRESS) + { + if (key == controllable.getLeftKey()) + { + controllable.setHoldingLeft(true); + + if (!controllable.isFrozen()) + { + walkLeft(entity); + } + } else if (key == controllable.getRightKey()) + { + controllable.setHoldingRight(true); + + if (!controllable.isFrozen()) + { + walkRight(entity); + } + } else if (key == controllable.getJumpKey()) + { + if (!controllable.isFrozen()) + { + jump(entity); + } + } else if (key == controllable.getDropKey()) + { + if (!controllable.isFrozen()) + { + drop(entity, true); + } + } + } else if (action == GLFW_RELEASE) + { + if (key == controllable.getLeftKey()) + { + controllable.setHoldingLeft(false); + + if (!controllable.isFrozen()) + { + if (controllable.isHoldingRight()) + { + walkRight(entity); + } else { + stopWalking(entity); + } + } + } else if (key == controllable.getRightKey()) + { + controllable.setHoldingRight(false); + + if (!controllable.isFrozen()) + { + if (controllable.isHoldingRight()) + { + walkLeft(entity); + } else { + stopWalking(entity); + } + } + } else if (key == controllable.getDropKey()) + { + if (!controllable.isFrozen()) + { + drop(entity, false); + } + } else if (key == controllable.getJumpKey()) + { + if (!controllable.isFrozen()) + { + stopJumping(entity); + } + } + } + } + + actions.pop(); + } +} + +void ControllingSystem::input(int key, int action) +{ + actions.push(std::make_pair(key, action)); +} + +void ControllingSystem::walkLeft(int entity) +{ + auto& ponderable = game.getEntityManager().getComponent(entity); + auto& animatable = game.getEntityManager().getComponent(entity); + + ponderable.setVelocityX(-90); + + animatable.setDirection(Direction::Left); + animatable.setWalking(true); +} + +void ControllingSystem::walkRight(int entity) +{ + auto& ponderable = game.getEntityManager().getComponent(entity); + auto& animatable = game.getEntityManager().getComponent(entity); + + ponderable.setVelocityX(90); + + animatable.setDirection(Direction::Right); + animatable.setWalking(true); +} + +void ControllingSystem::stopWalking(int entity) +{ + auto& ponderable = game.getEntityManager().getComponent(entity); + auto& animatable = game.getEntityManager().getComponent(entity); + + ponderable.setVelocityX(0); + + animatable.setWalking(false); +} + +void ControllingSystem::jump(int entity) +{ + auto& ponderable = game.getEntityManager().getComponent(entity); + auto& animatable = game.getEntityManager().getComponent(entity); + + playSound("res/Randomize87.wav", 0.25); + + ponderable.setVelocityY(JUMP_VELOCITY(TILE_HEIGHT*4.5, 0.3)); + ponderable.setAccelY(JUMP_GRAVITY(TILE_HEIGHT*4.5, 0.3)); + + animatable.setJumping(true); +} + +void ControllingSystem::stopJumping(int entity) +{ + auto& ponderable = game.getEntityManager().getComponent(entity); + auto& animatable = game.getEntityManager().getComponent(entity); + + ponderable.setAccelY(JUMP_GRAVITY(TILE_HEIGHT*3.5, 0.233)); + animatable.setJumping(false); +} + +void ControllingSystem::drop(int entity, bool start) +{ + auto& animatable = game.getEntityManager().getComponent(entity); + auto& droppable = game.getEntityManager().getComponent(entity); + + droppable.setDroppable(start); + animatable.setCrouching(start); +} diff --git a/src/systems/controlling.h b/src/systems/controlling.h new file mode 100644 index 0000000..61f86eb --- /dev/null +++ b/src/systems/controlling.h @@ -0,0 +1,26 @@ +#ifndef CONTROLLING_H_80B1BB8D +#define CONTROLLING_H_80B1BB8D + +#include "system.h" +#include + +class ControllingSystem : public System { + public: + ControllingSystem(Game& game) + : System(game) {} + + void tick(double dt); + void input(int key, int action); + + private: + void walkLeft(int entity); + void walkRight(int entity); + void stopWalking(int entity); + void jump(int entity); + void stopJumping(int entity); + void drop(int entity, bool start); + + std::queue> actions; +}; + +#endif /* end of include guard: CONTROLLING_H_80B1BB8D */ diff --git a/src/systems/pondering.cpp b/src/systems/pondering.cpp new file mode 100644 index 0000000..96775d0 --- /dev/null +++ b/src/systems/pondering.cpp @@ -0,0 +1,23 @@ +#include "pondering.h" +#include "game.h" +#include "components/ponderable.h" +#include "components/transformable.h" + +void PonderingSystem::tick(double dt) +{ + auto entities = game.getEntityManager().getEntitiesWithComponents(); + + for (auto entity : entities) + { + auto& transformable = game.getEntityManager().getComponent(entity); + auto& ponderable = game.getEntityManager().getComponent(entity); + + // Accelerate + ponderable.setVelocityX(ponderable.getVelocityX() + ponderable.getAccelX() * dt); + ponderable.setVelocityY(ponderable.getVelocityY() + ponderable.getAccelY() * dt); + + // Move + transformable.setX(transformable.getX() + ponderable.getVelocityX() * dt); + transformable.setY(transformable.getY() + ponderable.getVelocityY() * dt); + } +} diff --git a/src/systems/pondering.h b/src/systems/pondering.h new file mode 100644 index 0000000..ad01a22 --- /dev/null +++ b/src/systems/pondering.h @@ -0,0 +1,14 @@ +#ifndef PONDERING_H_F2530E0E +#define PONDERING_H_F2530E0E + +#include "system.h" + +class PonderingSystem : public System { + public: + PonderingSystem(Game& game) + : System(game) {} + + void tick(double dt); +}; + +#endif /* end of include guard: PONDERING_H_F2530E0E */ diff --git a/src/systems/rendering.cpp b/src/systems/rendering.cpp index 0034dc3..251c2bc 100644 --- a/src/systems/rendering.cpp +++ b/src/systems/rendering.cpp @@ -1,17 +1,17 @@ #include "rendering.h" -#include "entity_manager.h" -#include "components/sprite_renderable.h" +#include "game.h" +#include "components/animatable.h" #include "components/transformable.h" -void RenderingSystem::tick(EntityManager& manager, float dt) +void RenderingSystem::tick(double dt) { texture.fill(texture.entirety(), 0, 0, 0); - std::set spriteEntities = manager.getEntitiesWithComponents(); + std::set spriteEntities = game.getEntityManager().getEntitiesWithComponents(); for (int entity : spriteEntities) { - auto& sprite = manager.getComponent(entity); - auto& transform = manager.getComponent(entity); + auto& sprite = game.getEntityManager().getComponent(entity); + auto& transform = game.getEntityManager().getComponent(entity); Rectangle dstrect {(int) transform.getX(), (int) transform.getY(), transform.getW(), transform.getH()}; texture.blit(sprite.getTexture(), sprite.getFrameRect(), dstrect); diff --git a/src/systems/rendering.h b/src/systems/rendering.h index 80ea79e..9b6e27e 100644 --- a/src/systems/rendering.h +++ b/src/systems/rendering.h @@ -7,7 +7,10 @@ class RenderingSystem : public System { public: - void tick(EntityManager& manager, float dt); + RenderingSystem(Game& game) + : System(game) {} + + void tick(double dt); private: Texture texture {GAME_WIDTH, GAME_HEIGHT}; -- cgit 1.4.1 From da3df061699203eccc9a0c98becaee3ce8050a4f Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Mon, 5 Feb 2018 11:51:24 -0500 Subject: Whitespace changes --- src/components/controllable.h | 6 +- src/components/droppable.h | 2 +- src/components/ponderable.h | 2 +- src/components/transformable.cpp | 2 +- src/components/transformable.h | 6 +- src/entity_manager.cpp | 8 +- src/entity_manager.h | 64 +++++------ src/game.cpp | 10 +- src/game.h | 6 +- src/main.cpp | 10 +- src/renderer.cpp | 228 +++++++++++++++++++-------------------- src/renderer.h | 2 +- src/system.h | 4 +- src/system_manager.h | 8 +- src/systems/controlling.cpp | 12 +-- src/systems/controlling.h | 6 +- src/systems/pondering.cpp | 6 +- src/systems/pondering.h | 2 +- src/systems/rendering.h | 4 +- 19 files changed, 194 insertions(+), 194 deletions(-) (limited to 'src/system.h') diff --git a/src/components/controllable.h b/src/components/controllable.h index 317d68d..baccf13 100644 --- a/src/components/controllable.h +++ b/src/components/controllable.h @@ -14,20 +14,20 @@ class ControllableComponent : public Component { void setJumpKey(int k); int getDropKey() const; void setDropKey(int k); - + bool isFrozen() const; void setFrozen(bool f); bool isHoldingLeft() const; void setHoldingLeft(bool f); bool isHoldingRight() const; void setHoldingRight(bool f); - + private: int leftKey = GLFW_KEY_LEFT; int rightKey = GLFW_KEY_RIGHT; int jumpKey = GLFW_KEY_UP; int dropKey = GLFW_KEY_DOWN; - + bool frozen = false; bool holdingLeft = false; bool holdingRight = false; diff --git a/src/components/droppable.h b/src/components/droppable.h index 1f5608b..83fcb9d 100644 --- a/src/components/droppable.h +++ b/src/components/droppable.h @@ -7,7 +7,7 @@ class DroppableComponent : public Component { public: void setDroppable(bool can); bool isDroppable() const; - + private: bool droppable = false; }; diff --git a/src/components/ponderable.h b/src/components/ponderable.h index 5aab4b3..c836d2a 100644 --- a/src/components/ponderable.h +++ b/src/components/ponderable.h @@ -13,7 +13,7 @@ class PonderableComponent : public Component { void setAccelX(double v); double getAccelY() const; void setAccelY(double v); - + private: double velocityX = 0.0; double velocityY = 0.0; diff --git a/src/components/transformable.cpp b/src/components/transformable.cpp index 0d6b67e..89b1e5d 100644 --- a/src/components/transformable.cpp +++ b/src/components/transformable.cpp @@ -3,7 +3,7 @@ TransformableComponent::TransformableComponent(double x, double y, int w, int h) : x(x), y(y), w(w), h(h) { - + } double TransformableComponent::getX() const diff --git a/src/components/transformable.h b/src/components/transformable.h index 87ba84d..69f4f0e 100644 --- a/src/components/transformable.h +++ b/src/components/transformable.h @@ -6,17 +6,17 @@ class TransformableComponent : public Component { public: TransformableComponent(double x, double y, int w, int h); - + double getX() const; double getY() const; int getW() const; int getH() const; - + void setX(double v); void setY(double v); void setW(int v); void setH(int v); - + private: double x; double y; diff --git a/src/entity_manager.cpp b/src/entity_manager.cpp index 4bdfe8a..9ad758b 100644 --- a/src/entity_manager.cpp +++ b/src/entity_manager.cpp @@ -10,13 +10,13 @@ std::set EntityManager::getEntitiesWithComponents<>(std::set& cache = cachedComponents[componentTypes]; for (auto& entity : entities) { EntityData& data = entity.second; bool cacheEntity = true; - + for (auto& componentType : componentTypes) { if (data.components.count(componentType) == 0) @@ -25,13 +25,13 @@ std::set EntityManager::getEntitiesWithComponents<>(std::set> components; }; - + std::map entities; std::map, std::set> cachedComponents; - + int nextEntityID = 0; - + template std::set getEntitiesWithComponentsHelper(std::set& componentTypes) { componentTypes.insert(typeid(T)); - + return getEntitiesWithComponents(componentTypes); } - + template std::set getEntitiesWithComponents(std::set& componentTypes) { return getEntitiesWithComponentsHelper(componentTypes); } - + public: EntityManager() = default; EntityManager(const EntityManager& copy) = delete; - + int emplaceEntity() { // Find a suitable entity ID @@ -44,76 +44,76 @@ class EntityManager { { nextEntityID++; } - + if (nextEntityID < 0) { nextEntityID = 0; - + while ((entities.count(nextEntityID) == 1) && (nextEntityID >= 0)) { nextEntityID++; } - + assert(nextEntityID >= 0); } - + // Initialize the data int id = nextEntityID++; entities[id]; - + return id; } - + void deleteEntity(int entity) { assert(entities.count(entity) == 1); - + // Uncache components for (auto& cache : cachedComponents) { cache.second.erase(entity); } - + // Destroy the data entities.erase(entity); } - + template T& emplaceComponent(int entity, Args&&... args) { assert(entities.count(entity) == 1); - + EntityData& data = entities[entity]; std::type_index componentType = typeid(T); - + assert(data.components.count(componentType) == 0); - + // Initialize the component std::unique_ptr ptr = std::unique_ptr(new T(std::forward(args)...)); T& component = *ptr; data.components[componentType] = std::move(ptr); - + // Invalidate related caches erase_if(cachedComponents, [&componentType] (std::pair, std::set>& cache) { return cache.first.count(componentType) == 1; }); - + return component; } - + template void removeComponent(int entity) { assert(entities.count(entity) == 1); - + EntityData& data = entities[entity]; std::type_index componentType = typeid(T); - + assert(data.components.count(componentType) == 1); - + // Destroy the component data.components.erase(componentType); - + // Uncache the component for (auto& cache : cachedComponents) { @@ -123,25 +123,25 @@ class EntityManager { } } } - + template T& getComponent(int entity) { assert(entities.count(entity) == 1); - + EntityData& data = entities[entity]; std::type_index componentType = typeid(T); - + assert(data.components.count(componentType) == 1); - + return *((T*)data.components[componentType].get()); } - + template std::set getEntitiesWithComponents() { std::set componentTypes; - + return getEntitiesWithComponentsHelper(componentTypes); } }; diff --git a/src/game.cpp b/src/game.cpp index b3fa9a8..5d1ec18 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -45,24 +45,24 @@ void Game::execute() double lastTime = glfwGetTime(); const double dt = 0.01; double accumulator = 0.0; - + while (!(shouldQuit || glfwWindowShouldClose(window))) { double currentTime = glfwGetTime(); double frameTime = currentTime - lastTime; lastTime = currentTime; - + glfwPollEvents(); - + accumulator += frameTime; while (accumulator >= dt) { systemManager.getSystem().tick(dt); systemManager.getSystem().tick(dt); - + accumulator -= dt; } - + systemManager.getSystem().tick(frameTime); } } diff --git a/src/game.h b/src/game.h index 3822700..ec667c8 100644 --- a/src/game.h +++ b/src/game.h @@ -8,12 +8,12 @@ class Game { public: Game(GLFWwindow* window); - + void execute(); EntityManager& getEntityManager(); - + friend void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods); - + private: EntityManager entityManager; SystemManager systemManager; diff --git a/src/main.cpp b/src/main.cpp index 35749f5..d51da7d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,20 +8,20 @@ int main() { srand(time(NULL)); - + GLFWwindow* window = initRenderer(); glfwSwapInterval(1); - + initMuxer(); - + // Put this in a block so game goes out of scope before we destroy the renderer { Game game {window}; game.execute(); } - + destroyMuxer(); destroyRenderer(); - + return 0; } diff --git a/src/renderer.cpp b/src/renderer.cpp index 99d5389..d0d2b75 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -56,11 +56,11 @@ static GLuint mesh_normalbuffer; static int mesh_numvertices; GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) -{ +{ // Create the shaders GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); - + // Read the Vertex Shader code from the file std::string VertexShaderCode; std::ifstream VertexShaderStream(vertex_file_path, std::ios::in); @@ -71,7 +71,7 @@ GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) VertexShaderCode += "\n" + Line; VertexShaderStream.close(); } - + // Read the Fragment Shader code from the file std::string FragmentShaderCode; std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in); @@ -81,53 +81,53 @@ GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) FragmentShaderCode += "\n" + Line; FragmentShaderStream.close(); } - + GLint Result = GL_FALSE; int InfoLogLength; - + // Compile Vertex Shader printf("Compiling shader : %s\n", vertex_file_path); char const * VertexSourcePointer = VertexShaderCode.c_str(); glShaderSource(VertexShaderID, 1, &VertexSourcePointer , nullptr); glCompileShader(VertexShaderID); - + // Check Vertex Shader glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector VertexShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(VertexShaderID, InfoLogLength, nullptr, &VertexShaderErrorMessage[0]); fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]); - + // Compile Fragment Shader printf("Compiling shader : %s\n", fragment_file_path); char const * FragmentSourcePointer = FragmentShaderCode.c_str(); glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , nullptr); glCompileShader(FragmentShaderID); - + // Check Fragment Shader glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector FragmentShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(FragmentShaderID, InfoLogLength, nullptr, &FragmentShaderErrorMessage[0]); fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]); - + // Link the program fprintf(stdout, "Linking program\n"); GLuint ProgramID = glCreateProgram(); glAttachShader(ProgramID, VertexShaderID); glAttachShader(ProgramID, FragmentShaderID); glLinkProgram(ProgramID); - + // Check the program glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector ProgramErrorMessage( glm::max(InfoLogLength, int(1)) ); glGetProgramInfoLog(ProgramID, InfoLogLength, nullptr, &ProgramErrorMessage[0]); fprintf(stdout, "%s\n", &ProgramErrorMessage[0]); - + glDeleteShader(VertexShaderID); glDeleteShader(FragmentShaderID); - + return ProgramID; } @@ -135,14 +135,14 @@ void flipImageData(unsigned char* data, int width, int height, int comps) { unsigned char* data_copy = (unsigned char*) malloc(width*height*comps*sizeof(unsigned char)); memcpy(data_copy, data, width*height*comps); - + int row_size = width * comps; - + for (int i=0;i& out_vertices, std::v fprintf(stderr, "Could not open mesh file %s\n", filename); exit(1); } - + std::vector temp_vertices; std::vector temp_uvs; std::vector temp_normals; - + for (;;) { char lineHeader[256]; @@ -167,7 +167,7 @@ void loadMesh(const char* filename, std::vector& out_vertices, std::v { break; } - + if (!strncmp(lineHeader, "v", 2)) { glm::vec3 vertex; @@ -187,7 +187,7 @@ void loadMesh(const char* filename, std::vector& out_vertices, std::v { int vertexIDs[3], uvIDs[3], normalIDs[3]; fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIDs[0], &uvIDs[0], &normalIDs[0], &vertexIDs[1], &uvIDs[1], &normalIDs[1], &vertexIDs[2], &uvIDs[2], &normalIDs[2]); - + for (int i=0; i<3; i++) { out_vertices.push_back(temp_vertices[vertexIDs[i] - 1]); @@ -202,24 +202,24 @@ void setFramebufferSize(GLFWwindow* w, int width, int height) { buffer_width = width; buffer_height = height; - + glDeleteFramebuffers(1, &bloom_framebuffer); glDeleteRenderbuffers(1, &bloom_depthbuffer); - + glGenFramebuffers(1, &bloom_framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer); GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT1}; glDrawBuffers(1, DrawBuffers); - + glGenRenderbuffers(1, &bloom_depthbuffer); glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer); - + glDeleteTextures(1, &preBloomTex); glDeleteTextures(1, &bloomPassTex1); glDeleteTextures(1, &bloomPassTex2); - + glGenTextures(1, &preBloomTex); glBindTexture(GL_TEXTURE_2D, preBloomTex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -227,7 +227,7 @@ void setFramebufferSize(GLFWwindow* w, int width, int height) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + glGenTextures(1, &bloomPassTex1); glBindTexture(GL_TEXTURE_2D, bloomPassTex1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -235,7 +235,7 @@ void setFramebufferSize(GLFWwindow* w, int width, int height) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + glGenTextures(1, &bloomPassTex2); glBindTexture(GL_TEXTURE_2D, bloomPassTex2); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -252,20 +252,20 @@ GLFWwindow* initRenderer() fprintf(stderr, "Renderer already initialized\n"); exit(-1); } - + // Initialize GLFW if (!glfwInit()) { fprintf(stderr, "Failed to initialize GLFW\n"); exit(-1); } - + glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want version 3.3 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Mac requires this glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - + // Create a window window = glfwCreateWindow(1024, 768, "Aromatherapy", nullptr, nullptr); if (window == nullptr) @@ -274,7 +274,7 @@ GLFWwindow* initRenderer() glfwTerminate(); exit(-1); } - + glfwMakeContextCurrent(window); glewExperimental = true; // Needed in core profile if (glewInit() != GLEW_OK) @@ -282,37 +282,37 @@ GLFWwindow* initRenderer() fprintf(stderr, "Failed to initialize GLEW\n"); exit(-1); } - + glfwSetFramebufferSizeCallback(window, &setFramebufferSize); - + // Set up vertex array object glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); - + // Enable depth testing glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); - + // Enable blending glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - + // Set up the framebuffer glGenFramebuffers(1, &generic_framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; glDrawBuffers(1, DrawBuffers); - + glGenFramebuffers(1, &bloom_framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer); GLenum DrawBuffers2[1] = {GL_COLOR_ATTACHMENT1}; glDrawBuffers(1, DrawBuffers2); - + glGenRenderbuffers(1, &bloom_depthbuffer); glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1024, 768); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer); - + // Set up the NTSC rendering buffers glGenTextures(1, &renderedTex1); glBindTexture(GL_TEXTURE_2D, renderedTex1); @@ -322,7 +322,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); renderedTexBufs[0] = renderedTex1; - + glGenTextures(1, &renderedTex2); glBindTexture(GL_TEXTURE_2D, renderedTex2); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, GAME_WIDTH, GAME_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -331,7 +331,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); renderedTexBufs[1] = renderedTex2; - + // Set up bloom rendering buffers glGenTextures(1, &preBloomTex); glBindTexture(GL_TEXTURE_2D, preBloomTex); @@ -340,7 +340,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + glGenTextures(1, &bloomPassTex1); glBindTexture(GL_TEXTURE_2D, bloomPassTex1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -348,7 +348,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + glGenTextures(1, &bloomPassTex2); glBindTexture(GL_TEXTURE_2D, bloomPassTex2); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -356,31 +356,31 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + curBuf = 0; - + // Load the mesh! std::vector mesh_vertices; std::vector mesh_uvs; std::vector mesh_normals; loadMesh("res/monitor-fef.obj", mesh_vertices, mesh_uvs, mesh_normals); - + mesh_numvertices = mesh_vertices.size(); - + glGenBuffers(1, &mesh_vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); glBufferData(GL_ARRAY_BUFFER, mesh_vertices.size() * sizeof(glm::vec3), &mesh_vertices[0], GL_STATIC_DRAW); - + glGenBuffers(1, &mesh_uvbuffer); glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); glBufferData(GL_ARRAY_BUFFER, mesh_uvs.size() * sizeof(glm::vec3), &mesh_uvs[0], GL_STATIC_DRAW); - + glGenBuffers(1, &mesh_normalbuffer); glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); glBufferData(GL_ARRAY_BUFFER, mesh_normals.size() * sizeof(glm::vec3), &mesh_normals[0], GL_STATIC_DRAW); - + // Load the vertices of a flat surface - GLfloat g_quad_vertex_buffer_data[] = { + GLfloat g_quad_vertex_buffer_data[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, 1.0f, 0.0f, @@ -392,7 +392,7 @@ GLFWwindow* initRenderer() glGenBuffers(1, &quad_vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW); - + glGenTextures(1, &artifactsTex); glBindTexture(GL_TEXTURE_2D, artifactsTex); int atdw, atdh; @@ -403,7 +403,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); glGenerateMipmap(GL_TEXTURE_2D); - + glGenTextures(1, &scanlinesTex); glBindTexture(GL_TEXTURE_2D, scanlinesTex); int stdw, stdh; @@ -414,7 +414,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); glGenerateMipmap(GL_TEXTURE_2D); - + // Load the shaders ntscShader = LoadShaders("shaders/ntsc.vertex", "shaders/ntsc.fragment"); finalShader = LoadShaders("shaders/final.vertex", "shaders/final.fragment"); @@ -422,9 +422,9 @@ GLFWwindow* initRenderer() fillShader = LoadShaders("shaders/fill.vertex", "shaders/fill.fragment"); bloom1Shader = LoadShaders("shaders/bloom1.vertex", "shaders/bloom1.fragment"); bloom2Shader = LoadShaders("shaders/bloom2.vertex", "shaders/bloom2.fragment"); - + rendererInitialized = true; - + return window; } @@ -435,13 +435,13 @@ void destroyRenderer() fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + // Delete the plane buffer glDeleteBuffers(1, &quad_vertexbuffer); glDeleteBuffers(1, &mesh_vertexbuffer); glDeleteBuffers(1, &mesh_uvbuffer); glDeleteBuffers(1, &mesh_normalbuffer); - + // Delete the shaders glDeleteProgram(ntscShader); glDeleteProgram(finalShader); @@ -449,7 +449,7 @@ void destroyRenderer() glDeleteProgram(fillShader); glDeleteProgram(bloom1Shader); glDeleteProgram(bloom2Shader); - + // Delete the NTSC rendering buffers glDeleteTextures(1, &renderedTex1); glDeleteTextures(1, &renderedTex2); @@ -458,18 +458,18 @@ void destroyRenderer() glDeleteTextures(1, &preBloomTex); glDeleteTextures(1, &bloomPassTex1); glDeleteTextures(1, &bloomPassTex2); - + // Delete the framebuffer glDeleteRenderbuffers(1, &bloom_depthbuffer); glDeleteFramebuffers(1, &bloom_framebuffer); glDeleteFramebuffers(1, &generic_framebuffer); - + // Delete the VAO glDeleteVertexArrays(1, &VertexArrayID); - + // Kill the window glfwTerminate(); - + rendererInitialized = false; } @@ -480,10 +480,10 @@ Texture::Texture(int width, int height) fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + this->width = width; this->height = height; - + glGenTextures(1, &texID); glBindTexture(GL_TEXTURE_2D, texID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); @@ -500,7 +500,7 @@ Texture::Texture(const char* filename) fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + glGenTextures(1, &texID); glBindTexture(GL_TEXTURE_2D, texID); unsigned char* data = stbi_load(filename, &width, &height, 0, 4); @@ -520,14 +520,14 @@ Texture::Texture(const Texture& tex) fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + width = tex.width; height = tex.height; - + unsigned char* data = (unsigned char*) malloc(4 * width * height); glBindTexture(GL_TEXTURE_2D, tex.texID); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); - + glGenTextures(1, &texID); glBindTexture(GL_TEXTURE_2D, texID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); @@ -535,7 +535,7 @@ Texture::Texture(const Texture& tex) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - + free(data); } @@ -551,14 +551,14 @@ Texture::~Texture() fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + glDeleteTextures(1, &texID); } Texture& Texture::operator= (Texture tex) { swap(*this, tex); - + return *this; } @@ -576,17 +576,17 @@ void Texture::fill(Rectangle dstrect, int r, int g, int b) fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + // Target the framebuffer glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); - + // Set up the vertex attributes GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0); - + GLfloat vertexbuffer_data[] = { minx, miny, maxx, miny, @@ -601,14 +601,14 @@ void Texture::fill(Rectangle dstrect, int r, int g, int b) glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); - + glViewport(0, 0, width, height); glClear(GL_DEPTH_BUFFER_BIT); glUseProgram(fillShader); glUniform3f(glGetUniformLocation(fillShader, "vecColor"), r / 255.0, g / 255.0, b / 255.0); - + glDrawArrays(GL_TRIANGLES, 0, 6); - + glDisableVertexAttribArray(0); glDeleteBuffers(1, &vertexbuffer); } @@ -620,19 +620,19 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect, fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + alpha = glm::clamp(alpha, 0.0, 1.0); - + // Target the framebuffer glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); - + // Set up the vertex attributes GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0); - + GLfloat vertexbuffer_data[] = { minx, miny, maxx, miny, @@ -645,12 +645,12 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect, glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); - + GLfloat minu = (GLfloat) srcrect.x / srctex.width; GLfloat minv = 1 - ((GLfloat) srcrect.y / srctex.height); GLfloat maxu = (GLfloat) (srcrect.x + srcrect.w) / srctex.width; GLfloat maxv = 1 - ((GLfloat) (srcrect.y + srcrect.h) / srctex.height); - + GLfloat texcoordbuffer_data[] = { minu, minv, maxu, minv, @@ -663,20 +663,20 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect, glBufferData(GL_ARRAY_BUFFER, sizeof(texcoordbuffer_data), texcoordbuffer_data, GL_STATIC_DRAW); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); - + // Set up the shader glUseProgram(blitShader); glClear(GL_DEPTH_BUFFER_BIT); glViewport(0, 0, width, height); - + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, srctex.texID); glUniform1i(glGetUniformLocation(blitShader, "srctex"), 0); glUniform1f(glGetUniformLocation(blitShader, "alpha"), alpha); - + // Blit! glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - + // Unload everything glDisableVertexAttribArray(1); glDisableVertexAttribArray(0); @@ -691,11 +691,11 @@ void bloomPass1(GLuint srcTex, GLuint dstTex, bool horizontal, glm::vec2 srcRes, glViewport(0,0,dstRes.x,dstRes.y); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(bloom1Shader); - + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, srcTex); glUniform1i(glGetUniformLocation(bloom1Shader, "inTex"), 0); - + glm::vec2 offset = glm::vec2(0.0); if (horizontal) { @@ -703,9 +703,9 @@ void bloomPass1(GLuint srcTex, GLuint dstTex, bool horizontal, glm::vec2 srcRes, } else { offset.y = 1.2/srcRes.y; } - + glUniform2f(glGetUniformLocation(bloom1Shader, "offset"), offset.x, offset.y); - + glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); @@ -720,17 +720,17 @@ void Texture::renderScreen() const fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + // First we're going to composite our frame with the previous frame // We start by setting up the framebuffer glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexBufs[curBuf], 0); - + // Set up the shader glViewport(0,0,GAME_WIDTH,GAME_HEIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(ntscShader); - + // Use the current frame texture, nearest neighbor and clamped to edge glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texID); @@ -739,7 +739,7 @@ void Texture::renderScreen() const glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glUniform1i(glGetUniformLocation(ntscShader, "curFrameSampler"), 0); - + // Use the previous frame composite texture, nearest neighbor and clamped to edge glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, renderedTexBufs[(curBuf + 1) % 2]); @@ -748,13 +748,13 @@ void Texture::renderScreen() const glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glUniform1i(glGetUniformLocation(ntscShader, "prevFrameSampler"), 1); - + // Load the NTSC artifact texture glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, artifactsTex); glUniform1i(glGetUniformLocation(ntscShader, "NTSCArtifactSampler"), 2); glUniform1f(glGetUniformLocation(ntscShader, "NTSCLerp"), curBuf * 1.0); - + if ((rand() % 60) == 0) { // Change the 0.0 to a 1.0 or a 10.0 for a glitchy effect! @@ -762,7 +762,7 @@ void Texture::renderScreen() const } else { glUniform1f(glGetUniformLocation(ntscShader, "Tuning_NTSC"), 0.0); } - + // Render our composition glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); @@ -776,7 +776,7 @@ void Texture::renderScreen() const glViewport(0,0,buffer_width,buffer_height); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(finalShader); - + // Use the composited frame texture, linearly filtered and filling in black for the border glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, renderedTexBufs[curBuf]); @@ -788,69 +788,69 @@ void Texture::renderScreen() const glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color); glGenerateMipmap(GL_TEXTURE_2D); glUniform1i(glGetUniformLocation(finalShader, "rendertex"), 0); - + // Use the scanlines texture glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, scanlinesTex); glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); - + // Initialize the MVP matrices glm::mat4 p_matrix = glm::perspective(42.5f, (float) buffer_width / (float) buffer_height, 0.1f, 100.0f); glm::mat4 v_matrix = glm::lookAt(glm::vec3(2,0,0), glm::vec3(0,0,0), glm::vec3(0,1,0)); glm::mat4 m_matrix = glm::mat4(1.0); glm::mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; - + glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); glUniform2f(glGetUniformLocation(finalShader, "resolution"), buffer_width, buffer_height); glUniform1f(glGetUniformLocation(finalShader, "iGlobalTime"), glfwGetTime()); - + glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); - + glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); - + glEnableVertexAttribArray(2); glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); - + glDrawArrays(GL_TRIANGLES, 0, mesh_numvertices); glDisableVertexAttribArray(2); glDisableVertexAttribArray(1); glDisableVertexAttribArray(0); - + // First pass of bloom! glm::vec2 buffer_size = glm::vec2(buffer_width, buffer_height); bloomPass1(preBloomTex, bloomPassTex1, true, buffer_size, buffer_size / 4.0f); bloomPass1(bloomPassTex1, bloomPassTex2, false, buffer_size / 4.0f, buffer_size / 4.0f); - + // Do the second pass of bloom and render to screen glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport(0, 0, buffer_width, buffer_height); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(bloom2Shader); - + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, preBloomTex); glUniform1i(glGetUniformLocation(bloom2Shader, "clearTex"), 0); - + glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, bloomPassTex2); glUniform1i(glGetUniformLocation(bloom2Shader, "blurTex"), 1); - + glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime()); - + glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); glDrawArrays(GL_TRIANGLES, 0, 6); glDisableVertexAttribArray(0); - + glfwSwapBuffers(window); - + curBuf = (curBuf + 1) % 2; } diff --git a/src/renderer.h b/src/renderer.h index 84ad688..6dccf7a 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -24,7 +24,7 @@ class Texture { void blit(const Texture& src, Rectangle srcrect, Rectangle dstrect, double alpha = 1.0); void renderScreen() const; Rectangle entirety() const; - + private: GLuint texID; int width; diff --git a/src/system.h b/src/system.h index e08db0a..af3fb77 100644 --- a/src/system.h +++ b/src/system.h @@ -7,9 +7,9 @@ class System { public: System(Game& game) : game(game) {} - + virtual void tick(double dt) = 0; - + protected: Game& game; }; diff --git a/src/system_manager.h b/src/system_manager.h index 8f76db2..087b71c 100644 --- a/src/system_manager.h +++ b/src/system_manager.h @@ -18,18 +18,18 @@ class SystemManager { { std::unique_ptr ptr = std::unique_ptr(new T(game, std::forward(args)...)); std::type_index systemType = typeid(T); - + systems[systemType] = ptr.get(); loop.push_back(std::move(ptr)); } - + template T& getSystem() { std::type_index systemType = typeid(T); - + assert(systems.count(systemType) == 1); - + return *((T*)systems[systemType]); } }; diff --git a/src/systems/controlling.cpp b/src/systems/controlling.cpp index b1e73ad..456da3b 100644 --- a/src/systems/controlling.cpp +++ b/src/systems/controlling.cpp @@ -14,12 +14,12 @@ void ControllingSystem::tick(double dt) { int key = actions.front().first; int action = actions.front().second; - + auto entities = game.getEntityManager().getEntitiesWithComponents(); for (auto entity : entities) { auto& controllable = game.getEntityManager().getComponent(entity); - + if (action == GLFW_PRESS) { if (key == controllable.getLeftKey()) @@ -33,7 +33,7 @@ void ControllingSystem::tick(double dt) } else if (key == controllable.getRightKey()) { controllable.setHoldingRight(true); - + if (!controllable.isFrozen()) { walkRight(entity); @@ -56,7 +56,7 @@ void ControllingSystem::tick(double dt) if (key == controllable.getLeftKey()) { controllable.setHoldingLeft(false); - + if (!controllable.isFrozen()) { if (controllable.isHoldingRight()) @@ -69,7 +69,7 @@ void ControllingSystem::tick(double dt) } else if (key == controllable.getRightKey()) { controllable.setHoldingRight(false); - + if (!controllable.isFrozen()) { if (controllable.isHoldingRight()) @@ -94,7 +94,7 @@ void ControllingSystem::tick(double dt) } } } - + actions.pop(); } } diff --git a/src/systems/controlling.h b/src/systems/controlling.h index 61f86eb..30210b3 100644 --- a/src/systems/controlling.h +++ b/src/systems/controlling.h @@ -8,10 +8,10 @@ class ControllingSystem : public System { public: ControllingSystem(Game& game) : System(game) {} - + void tick(double dt); void input(int key, int action); - + private: void walkLeft(int entity); void walkRight(int entity); @@ -19,7 +19,7 @@ class ControllingSystem : public System { void jump(int entity); void stopJumping(int entity); void drop(int entity, bool start); - + std::queue> actions; }; diff --git a/src/systems/pondering.cpp b/src/systems/pondering.cpp index 96775d0..50a8bc8 100644 --- a/src/systems/pondering.cpp +++ b/src/systems/pondering.cpp @@ -6,16 +6,16 @@ void PonderingSystem::tick(double dt) { auto entities = game.getEntityManager().getEntitiesWithComponents(); - + for (auto entity : entities) { auto& transformable = game.getEntityManager().getComponent(entity); auto& ponderable = game.getEntityManager().getComponent(entity); - + // Accelerate ponderable.setVelocityX(ponderable.getVelocityX() + ponderable.getAccelX() * dt); ponderable.setVelocityY(ponderable.getVelocityY() + ponderable.getAccelY() * dt); - + // Move transformable.setX(transformable.getX() + ponderable.getVelocityX() * dt); transformable.setY(transformable.getY() + ponderable.getVelocityY() * dt); diff --git a/src/systems/pondering.h b/src/systems/pondering.h index ad01a22..3fe5473 100644 --- a/src/systems/pondering.h +++ b/src/systems/pondering.h @@ -7,7 +7,7 @@ class PonderingSystem : public System { public: PonderingSystem(Game& game) : System(game) {} - + void tick(double dt); }; diff --git a/src/systems/rendering.h b/src/systems/rendering.h index 9b6e27e..cec72e2 100644 --- a/src/systems/rendering.h +++ b/src/systems/rendering.h @@ -9,9 +9,9 @@ class RenderingSystem : public System { public: RenderingSystem(Game& game) : System(game) {} - + void tick(double dt); - + private: Texture texture {GAME_WIDTH, GAME_HEIGHT}; }; -- cgit 1.4.1 From 97d7fb425da906947cc45e11fadb35f708da50d6 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Wed, 7 Feb 2018 14:13:32 -0500 Subject: Changed EntityManager to dense vector This should improve speed, because entity lookup will be O(1) instead of O(log n). Deletion is also O(1). Insert stays at potentially O(n), but still should be overall faster than the previous method. Also replaced some asserts with exceptions. Also made Component polymorphic so that deletion actually works properly. --- src/component.h | 4 + src/entity_manager.cpp | 11 +-- src/entity_manager.h | 235 +++++++++++++++++++++++++++++-------------------- src/system.h | 15 ++-- src/system_manager.h | 43 +++++---- 5 files changed, 184 insertions(+), 124 deletions(-) (limited to 'src/system.h') diff --git a/src/component.h b/src/component.h index 2cbdc9d..b81dbee 100644 --- a/src/component.h +++ b/src/component.h @@ -2,6 +2,10 @@ #define COMPONENT_H_F0CE4573 class Component { +public: + + virtual ~Component() = default; + }; #endif /* end of include guard: COMPONENT_H_F0CE4573 */ diff --git a/src/entity_manager.cpp b/src/entity_manager.cpp index 9ad758b..f792e17 100644 --- a/src/entity_manager.cpp +++ b/src/entity_manager.cpp @@ -4,17 +4,18 @@ #include "entity_manager.h" template <> -std::set EntityManager::getEntitiesWithComponents<>(std::set& componentTypes) +std::set EntityManager::getEntitiesWithComponents<>( + std::set& componentTypes) { if (cachedComponents.count(componentTypes) == 1) { return cachedComponents[componentTypes]; } - std::set& cache = cachedComponents[componentTypes]; - for (auto& entity : entities) + std::set& cache = cachedComponents[componentTypes]; + for (id_type entity = 0; entity < entities.size(); entity++) { - EntityData& data = entity.second; + EntityData& data = entities[entity]; bool cacheEntity = true; for (auto& componentType : componentTypes) @@ -28,7 +29,7 @@ std::set EntityManager::getEntitiesWithComponents<>(std::set +#include #include #include -#include +#include #include "component.h" #include "algorithms.h" class EntityManager { - private: - struct EntityData { - std::map> components; - }; +private: - std::map entities; - std::map, std::set> cachedComponents; + struct EntityData { + std::map> components; + }; - int nextEntityID = 0; + using database_type = std::vector; - template - std::set getEntitiesWithComponentsHelper(std::set& componentTypes) - { - componentTypes.insert(typeid(T)); +public: - return getEntitiesWithComponents(componentTypes); - } + using id_type = database_type::size_type; - template - std::set getEntitiesWithComponents(std::set& componentTypes) - { - return getEntitiesWithComponentsHelper(componentTypes); - } +private: - public: - EntityManager() = default; - EntityManager(const EntityManager& copy) = delete; + database_type entities; + std::vector slotAvailable; + std::map, std::set> cachedComponents; - int emplaceEntity() - { - // Find a suitable entity ID - while ((entities.count(nextEntityID) == 1) && (nextEntityID >= 0)) - { - nextEntityID++; - } + id_type nextEntityID = 0; - if (nextEntityID < 0) - { - nextEntityID = 0; + template + std::set getEntitiesWithComponentsHelper( + std::set& componentTypes) + { + componentTypes.insert(typeid(T)); - while ((entities.count(nextEntityID) == 1) && (nextEntityID >= 0)) - { - nextEntityID++; - } + return getEntitiesWithComponents(componentTypes); + } - assert(nextEntityID >= 0); - } + template + std::set getEntitiesWithComponents( + std::set& componentTypes) + { + return getEntitiesWithComponentsHelper(componentTypes); + } - // Initialize the data - int id = nextEntityID++; - entities[id]; +public: - return id; - } + EntityManager() = default; - void deleteEntity(int entity) - { - assert(entities.count(entity) == 1); + EntityManager(const EntityManager& copy) = delete; - // Uncache components - for (auto& cache : cachedComponents) + id_type emplaceEntity() + { + if (nextEntityID >= entities.size()) + { + // If the database is saturated, add a new element for the new entity. + entities.emplace_back(); + slotAvailable.push_back(false); + + return nextEntityID++; + } else { + // If there is an available slot in the database, use it. + id_type id = nextEntityID++; + slotAvailable[id] = false; + + // Fast forward the next available slot pointer to an available slot. + while ((nextEntityID < entities.size()) && !slotAvailable[nextEntityID]) { - cache.second.erase(entity); + nextEntityID++; } - // Destroy the data - entities.erase(entity); + return id; + } + } + + void deleteEntity(id_type entity) + { + if ((entity >= entities.size()) || slotAvailable[entity]) + { + throw std::invalid_argument("Cannot delete non-existent entity"); } - template - T& emplaceComponent(int entity, Args&&... args) + // Uncache components + for (auto& cache : cachedComponents) { - assert(entities.count(entity) == 1); + cache.second.erase(entity); + } + + // Destroy the data + entities[entity].components.clear(); - EntityData& data = entities[entity]; - std::type_index componentType = typeid(T); + // Mark the slot as available + slotAvailable[entity] = true; - assert(data.components.count(componentType) == 0); + if (entity < nextEntityID) + { + nextEntityID = entity; + } + } - // Initialize the component - std::unique_ptr ptr = std::unique_ptr(new T(std::forward(args)...)); - T& component = *ptr; - data.components[componentType] = std::move(ptr); + template + T& emplaceComponent(id_type entity, Args&&... args) + { + if ((entity >= entities.size()) || slotAvailable[entity]) + { + throw std::invalid_argument("Cannot delete non-existent entity"); + } - // Invalidate related caches - erase_if(cachedComponents, [&componentType] (std::pair, std::set>& cache) { - return cache.first.count(componentType) == 1; - }); + EntityData& data = entities[entity]; + std::type_index componentType = typeid(T); - return component; + if (data.components.count(componentType)) + { + throw std::invalid_argument("Cannot emplace already-existent component"); } - template - void removeComponent(int entity) + // Initialize the component + std::unique_ptr ptr(new T(std::forward(args)...)); + T& component = *ptr; + data.components[componentType] = std::move(ptr); + + // Invalidate related caches + erase_if( + cachedComponents, + [&componentType] ( + std::pair, std::set>& cache) { + return cache.first.count(componentType) == 1; + }); + + return component; + } + + template + void removeComponent(id_type entity) + { + if ((entity >= entities.size()) || slotAvailable[entity]) { - assert(entities.count(entity) == 1); + throw std::invalid_argument("Cannot delete non-existent entity"); + } - EntityData& data = entities[entity]; - std::type_index componentType = typeid(T); + EntityData& data = entities[entity]; + std::type_index componentType = typeid(T); - assert(data.components.count(componentType) == 1); + if (!data.components.count(componentType)) + { + throw std::invalid_argument("Cannot delete non-existent component"); + } - // Destroy the component - data.components.erase(componentType); + // Destroy the component + data.components.erase(componentType); - // Uncache the component - for (auto& cache : cachedComponents) + // Uncache the component + for (auto& cache : cachedComponents) + { + if (cache.first.count(componentType) == 1) { - if (cache.first.count(componentType) == 1) - { - cache.second.erase(entity); - } + cache.second.erase(entity); } } + } - template - T& getComponent(int entity) + template + T& getComponent(id_type entity) + { + if ((entity >= entities.size()) || slotAvailable[entity]) { - assert(entities.count(entity) == 1); - - EntityData& data = entities[entity]; - std::type_index componentType = typeid(T); + throw std::invalid_argument("Cannot delete non-existent entity"); + } - assert(data.components.count(componentType) == 1); + EntityData& data = entities[entity]; + std::type_index componentType = typeid(T); - return *((T*)data.components[componentType].get()); + if (!data.components.count(componentType)) + { + throw std::invalid_argument("Cannot get non-existent component"); } - template - std::set getEntitiesWithComponents() - { - std::set componentTypes; + return *dynamic_cast(data.components[componentType].get()); + } - return getEntitiesWithComponentsHelper(componentTypes); - } + template + std::set getEntitiesWithComponents() + { + std::set componentTypes; + + return getEntitiesWithComponentsHelper(componentTypes); + } }; template <> -std::set EntityManager::getEntitiesWithComponents<>(std::set& componentTypes); +std::set EntityManager::getEntitiesWithComponents<>( + std::set& componentTypes); #endif /* end of include guard: ENTITY_MANAGER_H_C5832F11 */ diff --git a/src/system.h b/src/system.h index af3fb77..489afd0 100644 --- a/src/system.h +++ b/src/system.h @@ -4,14 +4,17 @@ class Game; class System { - public: - System(Game& game) - : game(game) {} +public: + System(Game& game) + : game(game) {} - virtual void tick(double dt) = 0; + virtual ~System() = default; - protected: - Game& game; + virtual void tick(double dt) = 0; + +protected: + + Game& game; }; #endif /* end of include guard: SYSTEM_H_B61A8CEA */ diff --git a/src/system_manager.h b/src/system_manager.h index 087b71c..e2c98cb 100644 --- a/src/system_manager.h +++ b/src/system_manager.h @@ -5,33 +5,40 @@ #include #include #include +#include #include "system.h" class SystemManager { - private: - std::list> loop; - std::map systems; +private: - public: - template - void emplaceSystem(Game& game, Args&&... args) - { - std::unique_ptr ptr = std::unique_ptr(new T(game, std::forward(args)...)); - std::type_index systemType = typeid(T); + std::list> loop; + std::map systems; - systems[systemType] = ptr.get(); - loop.push_back(std::move(ptr)); - } +public: - template - T& getSystem() - { - std::type_index systemType = typeid(T); + template + void emplaceSystem(Game& game, Args&&... args) + { + std::unique_ptr ptr(new T(game, std::forward(args)...)); + std::type_index systemType = typeid(T); + + systems[systemType] = ptr.get(); + loop.push_back(std::move(ptr)); + } - assert(systems.count(systemType) == 1); + template + T& getSystem() + { + std::type_index systemType = typeid(T); - return *((T*)systems[systemType]); + if (!systems.count(systemType)) + { + throw std::invalid_argument("Cannot get non-existent system"); } + + return *dynamic_cast(systems[systemType]); + } + }; #endif /* end of include guard: SYSTEM_MANAGER_H_544E6056 */ -- cgit 1.4.1 From cefe66cdbb8786dc455657376e36f0ff8785d5bc Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Thu, 8 Feb 2018 12:34:42 -0500 Subject: Introduced animated sprites Also restyled a lot of the code. --- CMakeLists.txt | 2 +- src/animation.cpp | 35 +++++++++++ src/animation.h | 100 ++++++++++++++++++++++++++++++ src/components/animatable.cpp | 27 --------- src/components/animatable.h | 75 ++++++++++++++++------- src/components/orientable.h | 24 ++++++++ src/components/ponderable.h | 13 ++++ src/game.cpp | 73 +++++++++++++--------- src/game.h | 36 ++++++++--- src/system.h | 12 +++- src/systems/animating.cpp | 38 ++++++++++++ src/systems/animating.h | 20 ++++++ src/systems/controlling.cpp | 138 +++++++++++++++++++++++++++--------------- src/systems/controlling.h | 36 ++++++----- src/systems/pondering.cpp | 10 +-- src/systems/pondering.h | 10 +-- src/systems/rendering.cpp | 40 ++++++++---- src/systems/rendering.h | 15 +++-- 18 files changed, 521 insertions(+), 183 deletions(-) create mode 100644 src/animation.cpp create mode 100644 src/animation.h delete mode 100644 src/components/animatable.cpp create mode 100644 src/components/orientable.h create mode 100644 src/systems/animating.cpp create mode 100644 src/systems/animating.h (limited to 'src/system.h') diff --git a/CMakeLists.txt b/CMakeLists.txt index e43b056..0ac3a38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,10 +61,10 @@ add_executable(Aromatherapy src/entity_manager.cpp src/game.cpp src/animation.cpp - src/components/animatable.cpp src/systems/rendering.cpp src/systems/controlling.cpp src/systems/pondering.cpp + src/systems/animating.cpp ) target_link_libraries(Aromatherapy ${ALL_LIBS}) install(TARGETS Aromatherapy RUNTIME DESTINATION ${BIN_DIR}) diff --git a/src/animation.cpp b/src/animation.cpp new file mode 100644 index 0000000..31ba21f --- /dev/null +++ b/src/animation.cpp @@ -0,0 +1,35 @@ +#include "animation.h" + +AnimationSet::AnimationSet( + Texture texture, + int frameWidth, + int frameHeight, + int framesAcross) : + texture_(std::move(texture)), + frameWidth_(frameWidth), + frameHeight_(frameHeight), + framesAcross_(framesAcross) +{ +} + +void AnimationSet::emplaceAnimation( + std::string animation, + size_t firstFrame, + size_t numFrames, + size_t delay) +{ + animations_.emplace( + std::piecewise_construct, + std::make_tuple(animation), + std::make_tuple(firstFrame, numFrames, delay)); +} + +Rectangle AnimationSet::getFrameRect(int frame) const +{ + return { + frameWidth_ * (frame % framesAcross_), + frameHeight_ * (frame / framesAcross_), + frameWidth_, + frameHeight_ + }; +} diff --git a/src/animation.h b/src/animation.h new file mode 100644 index 0000000..50446d0 --- /dev/null +++ b/src/animation.h @@ -0,0 +1,100 @@ +#ifndef ANIMATION_H_74EB0901 +#define ANIMATION_H_74EB0901 + +#include "renderer.h" +#include +#include +#include + +class Animation { +public: + + Animation( + size_t firstFrame, + size_t numFrames, + size_t delay) : + firstFrame_(firstFrame), + numFrames_(numFrames), + delay_(delay) + { + } + + inline size_t getFirstFrame() const + { + return firstFrame_; + } + + inline size_t getNumFrames() const + { + return numFrames_; + } + + inline size_t getDelay() const + { + return delay_; + } + +private: + + size_t firstFrame_; + size_t numFrames_; + size_t delay_; +}; + +class AnimationSet { +public: + + AnimationSet( + Texture texture, + int frameWidth, + int frameHeight, + int framesAcross); + + void emplaceAnimation( + std::string animation, + size_t firstFrame, + size_t numFrames, + size_t delay); + + inline const Animation& getAnimation(std::string animation) const + { + if (!animations_.count(animation)) + { + throw std::invalid_argument("Animation does not exist"); + } + + return animations_.at(animation); + } + + inline const Texture& getTexture() const + { + return texture_; + } + + inline int getFrameWidth() const + { + return frameWidth_; + } + + inline int getFrameHeight() const + { + return frameHeight_; + } + + inline int getFramesAcross() const + { + return framesAcross_; + } + + Rectangle getFrameRect(int frame) const; + +private: + + std::map animations_; + Texture texture_; + int frameWidth_; + int frameHeight_; + int framesAcross_; +}; + +#endif /* end of include guard: ANIMATION_H_74EB0901 */ diff --git a/src/components/animatable.cpp b/src/components/animatable.cpp deleted file mode 100644 index fcd277c..0000000 --- a/src/components/animatable.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "animatable.h" - -AnimatableComponent::AnimatableComponent(const char* filename, int frame_width, int frame_height, int frames_across) - : texture(filename), frame_width(frame_width), frame_height(frame_height), frames_across(frames_across) -{ - -} - -int AnimatableComponent::getFrame() const -{ - return frame; -} - -void AnimatableComponent::setFrame(int frame) -{ - this->frame = frame; -} - -const Texture& AnimatableComponent::getTexture() const -{ - return texture; -} - -Rectangle AnimatableComponent::getFrameRect() const -{ - return {frame_width * (frame % frames_across), frame_height * (frame / frames_across), frame_width, frame_height}; -} diff --git a/src/components/animatable.h b/src/components/animatable.h index cf6ee54..ed0133e 100644 --- a/src/components/animatable.h +++ b/src/components/animatable.h @@ -2,30 +2,61 @@ #define SPRITE_RENDERABLE_H_D3AACBBF #include "component.h" -#include "renderer.h" -#include "direction.h" +#include "animation.h" +#include class AnimatableComponent : public Component { - public: - AnimatableComponent(const char* filename, int frame_width, int frame_height, int frames_across); - - int getFrame() const; - void setFrame(int frame); - - const Texture& getTexture() const; - Rectangle getFrameRect() const; - - void setDirection(Direction dir) {}; - void setWalking(bool w) {}; - void setJumping(bool w) {}; - void setCrouching(bool w) {}; - - private: - Texture texture; - int frame_width; - int frame_height; - int frames_across; - int frame = 0; +public: + + AnimatableComponent( + AnimationSet animationSet, + std::string animation) : + animationSet_(std::move(animationSet)), + animation_(std::move(animation)) + { + } + + inline size_t getFrame() const + { + return frame_; + } + + inline void setFrame(size_t v) + { + frame_ = v; + } + + inline size_t getCountdown() const + { + return countdown_; + } + + inline void setCountdown(size_t v) + { + countdown_ = v; + } + + inline const AnimationSet& getAnimationSet() const + { + return animationSet_; + } + + inline const Animation& getAnimation() const + { + return animationSet_.getAnimation(animation_); + } + + inline void setAnimation(std::string animation) + { + animation_ = std::move(animation); + } + +private: + + AnimationSet animationSet_; + std::string animation_; + size_t frame_ = 0; + size_t countdown_ = 0; }; #endif /* end of include guard: SPRITE_RENDERABLE_H_D3AACBBF */ diff --git a/src/components/orientable.h b/src/components/orientable.h new file mode 100644 index 0000000..8f56912 --- /dev/null +++ b/src/components/orientable.h @@ -0,0 +1,24 @@ +#ifndef ORIENTABLE_H_EDB6C4A1 +#define ORIENTABLE_H_EDB6C4A1 + +#include "component.h" + +class OrientableComponent : public Component { +public: + + inline bool isFacingRight() const + { + return facingRight_; + } + + inline void setFacingRight(bool v) + { + facingRight_ = v; + } + +private: + + bool facingRight_ = false; +}; + +#endif /* end of include guard: ORIENTABLE_H_EDB6C4A1 */ diff --git a/src/components/ponderable.h b/src/components/ponderable.h index 80100d7..dfbf908 100644 --- a/src/components/ponderable.h +++ b/src/components/ponderable.h @@ -6,6 +6,13 @@ class PonderableComponent : public Component { public: + enum class state { + grounded, + jumping, + falling, + dropping + }; + inline double getVelocityX() const { return velX_; @@ -51,12 +58,18 @@ public: return state_; } + inline void setState(state arg) + { + state_ = arg; + } + private: double velX_ = 0.0; double velY_ = 0.0; double accelX_ = 0.0; double accelY_ = 0.0; + state state_ = state::grounded; }; #endif /* end of include guard: TANGIBLE_H_746DB3EE */ diff --git a/src/game.cpp b/src/game.cpp index 5d1ec18..492e4d0 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -4,40 +4,59 @@ #include "components/controllable.h" #include "components/droppable.h" #include "components/ponderable.h" +#include "components/orientable.h" #include "systems/rendering.h" #include "systems/controlling.h" #include "systems/pondering.h" +#include "systems/animating.h" +#include "animation.h" void key_callback(GLFWwindow* window, int key, int, int action, int) { Game& game = *((Game*) glfwGetWindowUserPointer(window)); - + if ((action == GLFW_PRESS) && (key == GLFW_KEY_ESCAPE)) { - game.shouldQuit = true; - + game.shouldQuit_ = true; + return; } - - game.systemManager.getSystem().input(key, action); + + game.systemManager_.getSystem().input(key, action); } -Game::Game(GLFWwindow* window) : window(window) +Game::Game(GLFWwindow* window) : window_(window) { - systemManager.emplaceSystem(*this); - systemManager.emplaceSystem(*this); - systemManager.emplaceSystem(*this); - - int player = entityManager.emplaceEntity(); - entityManager.emplaceComponent(player, "res/Starla.png", 10, 12, 6); - entityManager.emplaceComponent(player, 203, 44, 10, 12); - entityManager.emplaceComponent(player); - entityManager.emplaceComponent(player); - entityManager.emplaceComponent(player); - + systemManager_.emplaceSystem(*this); + systemManager_.emplaceSystem(*this); + systemManager_.emplaceSystem(*this); + systemManager_.emplaceSystem(*this); + + int player = entityManager_.emplaceEntity(); + + AnimationSet playerGraphics {"res/Starla2.bmp", 10, 12, 6}; + playerGraphics.emplaceAnimation("stillLeft", 3, 1, 1); + playerGraphics.emplaceAnimation("stillRight", 0, 1, 1); + playerGraphics.emplaceAnimation("walkingLeft", 4, 2, 10); + playerGraphics.emplaceAnimation("walkingRight", 1, 2, 10); + + entityManager_.emplaceComponent( + player, + std::move(playerGraphics), + "stillLeft"); + + entityManager_.emplaceComponent( + player, + 203, 44, 10, 12); + + entityManager_.emplaceComponent(player); + entityManager_.emplaceComponent(player); + entityManager_.emplaceComponent(player); + entityManager_.emplaceComponent(player); + glfwSwapInterval(1); - glfwSetWindowUserPointer(window, this); - glfwSetKeyCallback(window, key_callback); + glfwSetWindowUserPointer(window_, this); + glfwSetKeyCallback(window_, key_callback); } void Game::execute() @@ -46,7 +65,7 @@ void Game::execute() const double dt = 0.01; double accumulator = 0.0; - while (!(shouldQuit || glfwWindowShouldClose(window))) + while (!(shouldQuit_ || glfwWindowShouldClose(window_))) { double currentTime = glfwGetTime(); double frameTime = currentTime - lastTime; @@ -57,19 +76,13 @@ void Game::execute() accumulator += frameTime; while (accumulator >= dt) { - systemManager.getSystem().tick(dt); - systemManager.getSystem().tick(dt); + systemManager_.getSystem().tick(dt); + systemManager_.getSystem().tick(dt); + systemManager_.getSystem().tick(dt); accumulator -= dt; } - systemManager.getSystem().tick(frameTime); + systemManager_.getSystem().tick(frameTime); } } - -EntityManager& Game::getEntityManager() -{ - return entityManager; -} - - diff --git a/src/game.h b/src/game.h index ec667c8..7bd038e 100644 --- a/src/game.h +++ b/src/game.h @@ -6,19 +6,35 @@ #include "system_manager.h" class Game { - public: - Game(GLFWwindow* window); +public: - void execute(); - EntityManager& getEntityManager(); + Game(GLFWwindow* window); - friend void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods); + void execute(); - private: - EntityManager entityManager; - SystemManager systemManager; - GLFWwindow* const window; - bool shouldQuit = false; + inline EntityManager& getEntityManager() + { + return entityManager_; + } + + inline SystemManager& getSystemManager() + { + return systemManager_; + } + + friend void key_callback( + GLFWwindow* window, + int key, + int scancode, + int action, + int mods); + +private: + + EntityManager entityManager_; + SystemManager systemManager_; + GLFWwindow* const window_; + bool shouldQuit_ = false; }; #endif /* end of include guard: GAME_H_1014DDC9 */ diff --git a/src/system.h b/src/system.h index 489afd0..6a3cd14 100644 --- a/src/system.h +++ b/src/system.h @@ -1,12 +1,18 @@ #ifndef SYSTEM_H_B61A8CEA #define SYSTEM_H_B61A8CEA +#include "entity_manager.h" + class Game; class System { public: - System(Game& game) - : game(game) {} + + using id_type = EntityManager::id_type; + + System(Game& game) : game_(game) + { + } virtual ~System() = default; @@ -14,7 +20,7 @@ public: protected: - Game& game; + Game& game_; }; #endif /* end of include guard: SYSTEM_H_B61A8CEA */ diff --git a/src/systems/animating.cpp b/src/systems/animating.cpp new file mode 100644 index 0000000..fcbfca5 --- /dev/null +++ b/src/systems/animating.cpp @@ -0,0 +1,38 @@ +#include "animating.h" +#include "game.h" +#include "components/animatable.h" + +void AnimatingSystem::tick(double) +{ + std::set spriteEntities = + game_.getEntityManager().getEntitiesWithComponents(); + + for (id_type entity : spriteEntities) + { + auto& sprite = game_.getEntityManager(). + getComponent(entity); + + sprite.setCountdown(sprite.getCountdown() + 1); + + const Animation& anim = sprite.getAnimation(); + if (sprite.getCountdown() >= anim.getDelay()) + { + sprite.setFrame(sprite.getFrame() + 1); + sprite.setCountdown(0); + + if (sprite.getFrame() >= anim.getFirstFrame() + anim.getNumFrames()) + { + sprite.setFrame(anim.getFirstFrame()); + } + } + } +} + +void AnimatingSystem::startAnimation(id_type entity, std::string animation) +{ + auto& sprite = game_.getEntityManager(). + getComponent(entity); + + sprite.setAnimation(animation); + sprite.setFrame(sprite.getAnimation().getFirstFrame()); +} diff --git a/src/systems/animating.h b/src/systems/animating.h new file mode 100644 index 0000000..150a74a --- /dev/null +++ b/src/systems/animating.h @@ -0,0 +1,20 @@ +#ifndef ANIMATING_H_5BBF0094 +#define ANIMATING_H_5BBF0094 + +#include "system.h" +#include + +class AnimatingSystem : public System { +public: + + AnimatingSystem(Game& game) : System(game) + { + } + + void tick(double dt); + + void startAnimation(id_type entity, std::string animation); + +}; + +#endif /* end of include guard: ANIMATING_H_5BBF0094 */ diff --git a/src/systems/controlling.cpp b/src/systems/controlling.cpp index ec62e9a..3647ff8 100644 --- a/src/systems/controlling.cpp +++ b/src/systems/controlling.cpp @@ -4,21 +4,30 @@ #include "components/ponderable.h" #include "components/animatable.h" #include "components/droppable.h" +#include "components/orientable.h" +#include "systems/animating.h" #include "direction.h" #include "muxer.h" #include "consts.h" -void ControllingSystem::tick(double dt) +void ControllingSystem::tick(double) { - while (!actions.empty()) + while (!actions_.empty()) { - int key = actions.front().first; - int action = actions.front().second; + int key = actions_.front().first; + int action = actions_.front().second; + + auto entities = game_.getEntityManager().getEntitiesWithComponents< + ControllableComponent, + PonderableComponent, + AnimatableComponent, + DroppableComponent, + OrientableComponent>(); - auto entities = game.getEntityManager().getEntitiesWithComponents(); for (auto entity : entities) { - auto& controllable = game.getEntityManager().getComponent(entity); + auto& controllable = game_.getEntityManager(). + getComponent(entity); if (action == GLFW_PRESS) { @@ -95,74 +104,107 @@ void ControllingSystem::tick(double dt) } } - actions.pop(); + actions_.pop(); } } void ControllingSystem::input(int key, int action) { - actions.push(std::make_pair(key, action)); + actions_.push(std::make_pair(key, action)); } -void ControllingSystem::walkLeft(int entity) +void ControllingSystem::walkLeft(id_type entity) { - auto& ponderable = game.getEntityManager().getComponent(entity); - auto& animatable = game.getEntityManager().getComponent(entity); - + auto& ponderable = game_.getEntityManager().getComponent(entity); + auto& orientable = game_.getEntityManager().getComponent(entity); + + orientable.setFacingRight(false); ponderable.setVelocityX(-90); - - animatable.setDirection(Direction::Left); - animatable.setWalking(true); + + auto& animating = game_.getSystemManager().getSystem(); + + if (ponderable.getState() == PonderableComponent::state::grounded) + { + animating.startAnimation(entity, "walkingLeft"); + } else { + animating.startAnimation(entity, "stillLeft"); + } } -void ControllingSystem::walkRight(int entity) +void ControllingSystem::walkRight(id_type entity) { - auto& ponderable = game.getEntityManager().getComponent(entity); - auto& animatable = game.getEntityManager().getComponent(entity); - + auto& ponderable = game_.getEntityManager().getComponent(entity); + auto& orientable = game_.getEntityManager().getComponent(entity); + + orientable.setFacingRight(true); ponderable.setVelocityX(90); - animatable.setDirection(Direction::Right); - animatable.setWalking(true); + auto& animating = game_.getSystemManager().getSystem(); + + if (ponderable.getState() == PonderableComponent::state::grounded) + { + animating.startAnimation(entity, "walkingRight"); + } else { + animating.startAnimation(entity, "stillRight"); + } } -void ControllingSystem::stopWalking(int entity) +void ControllingSystem::stopWalking(id_type entity) { - auto& ponderable = game.getEntityManager().getComponent(entity); - auto& animatable = game.getEntityManager().getComponent(entity); - + auto& ponderable = game_.getEntityManager().getComponent(entity); + auto& orientable = game_.getEntityManager().getComponent(entity); + ponderable.setVelocityX(0); - - animatable.setWalking(false); + + if (ponderable.getState() == PonderableComponent::state::grounded) + { + auto& animating = game_.getSystemManager().getSystem(); + + if (orientable.isFacingRight()) + { + animating.startAnimation(entity, "stillRight"); + } else { + animating.startAnimation(entity, "stillLeft"); + } + } } -void ControllingSystem::jump(int entity) +void ControllingSystem::jump(id_type entity) { - auto& ponderable = game.getEntityManager().getComponent(entity); - auto& animatable = game.getEntityManager().getComponent(entity); - - playSound("res/Randomize87.wav", 0.25); - - ponderable.setVelocityY(JUMP_VELOCITY(TILE_HEIGHT*4.5, 0.3)); - ponderable.setAccelY(JUMP_GRAVITY(TILE_HEIGHT*4.5, 0.3)); - - animatable.setJumping(true); + auto& ponderable = game_.getEntityManager().getComponent(entity); + + if (ponderable.getState() == PonderableComponent::state::grounded) + { + playSound("res/Randomize87.wav", 0.25); + + ponderable.setVelocityY(JUMP_VELOCITY(TILE_HEIGHT*4.5, 0.3)); + ponderable.setAccelY(JUMP_GRAVITY(TILE_HEIGHT*4.5, 0.3)); + ponderable.setState(PonderableComponent::state::jumping); + } } -void ControllingSystem::stopJumping(int entity) +void ControllingSystem::stopJumping(id_type entity) { - auto& ponderable = game.getEntityManager().getComponent(entity); - auto& animatable = game.getEntityManager().getComponent(entity); - - ponderable.setAccelY(JUMP_GRAVITY(TILE_HEIGHT*3.5, 0.233)); - animatable.setJumping(false); + auto& ponderable = game_.getEntityManager().getComponent(entity); + + if (ponderable.getState() == PonderableComponent::state::jumping) + { + ponderable.setAccelY(JUMP_GRAVITY(TILE_HEIGHT*3.5, 0.233)); + ponderable.setState(PonderableComponent::state::falling); + } } -void ControllingSystem::drop(int entity, bool start) +void ControllingSystem::drop(id_type entity, bool start) { - auto& animatable = game.getEntityManager().getComponent(entity); - auto& droppable = game.getEntityManager().getComponent(entity); - + auto& droppable = game_.getEntityManager().getComponent(entity); + auto& ponderable = game_.getEntityManager().getComponent(entity); + + if (start && (ponderable.getState() == PonderableComponent::state::grounded)) + { + ponderable.setState(PonderableComponent::state::dropping); + } else if ((!start) && (ponderable.getState() == PonderableComponent::state::dropping)) + { + ponderable.setState(PonderableComponent::state::grounded); + } droppable.setDroppable(start); - animatable.setCrouching(start); } diff --git a/src/systems/controlling.h b/src/systems/controlling.h index 30210b3..1f1e8a0 100644 --- a/src/systems/controlling.h +++ b/src/systems/controlling.h @@ -3,24 +3,28 @@ #include "system.h" #include +#include "entity_manager.h" class ControllingSystem : public System { - public: - ControllingSystem(Game& game) - : System(game) {} - - void tick(double dt); - void input(int key, int action); - - private: - void walkLeft(int entity); - void walkRight(int entity); - void stopWalking(int entity); - void jump(int entity); - void stopJumping(int entity); - void drop(int entity, bool start); - - std::queue> actions; +public: + + ControllingSystem(Game& game) : System(game) + { + } + + void tick(double dt); + void input(int key, int action); + +private: + + void walkLeft(id_type entity); + void walkRight(id_type entity); + void stopWalking(id_type entity); + void jump(id_type entity); + void stopJumping(id_type entity); + void drop(id_type entity, bool start); + + std::queue> actions_; }; #endif /* end of include guard: CONTROLLING_H_80B1BB8D */ diff --git a/src/systems/pondering.cpp b/src/systems/pondering.cpp index 50a8bc8..e40db1d 100644 --- a/src/systems/pondering.cpp +++ b/src/systems/pondering.cpp @@ -5,12 +5,14 @@ void PonderingSystem::tick(double dt) { - auto entities = game.getEntityManager().getEntitiesWithComponents(); + auto entities = game_.getEntityManager().getEntitiesWithComponents< + PonderableComponent, + TransformableComponent>(); - for (auto entity : entities) + for (id_type entity : entities) { - auto& transformable = game.getEntityManager().getComponent(entity); - auto& ponderable = game.getEntityManager().getComponent(entity); + auto& transformable = game_.getEntityManager().getComponent(entity); + auto& ponderable = game_.getEntityManager().getComponent(entity); // Accelerate ponderable.setVelocityX(ponderable.getVelocityX() + ponderable.getAccelX() * dt); diff --git a/src/systems/pondering.h b/src/systems/pondering.h index 3fe5473..44e7600 100644 --- a/src/systems/pondering.h +++ b/src/systems/pondering.h @@ -4,11 +4,13 @@ #include "system.h" class PonderingSystem : public System { - public: - PonderingSystem(Game& game) - : System(game) {} +public: - void tick(double dt); + PonderingSystem(Game& game) : System(game) + { + } + + void tick(double dt); }; #endif /* end of include guard: PONDERING_H_F2530E0E */ diff --git a/src/systems/rendering.cpp b/src/systems/rendering.cpp index 251c2bc..8219732 100644 --- a/src/systems/rendering.cpp +++ b/src/systems/rendering.cpp @@ -3,19 +3,35 @@ #include "components/animatable.h" #include "components/transformable.h" -void RenderingSystem::tick(double dt) +void RenderingSystem::tick(double) { - texture.fill(texture.entirety(), 0, 0, 0); - - std::set spriteEntities = game.getEntityManager().getEntitiesWithComponents(); - for (int entity : spriteEntities) + texture_.fill(texture_.entirety(), 0, 0, 0); + + std::set spriteEntities = + game_.getEntityManager().getEntitiesWithComponents< + AnimatableComponent, + TransformableComponent>(); + + for (id_type entity : spriteEntities) { - auto& sprite = game.getEntityManager().getComponent(entity); - auto& transform = game.getEntityManager().getComponent(entity); - Rectangle dstrect {(int) transform.getX(), (int) transform.getY(), transform.getW(), transform.getH()}; - - texture.blit(sprite.getTexture(), sprite.getFrameRect(), dstrect); + auto& sprite = game_.getEntityManager(). + getComponent(entity); + + auto& transform = game_.getEntityManager(). + getComponent(entity); + + Rectangle dstrect { + static_cast(transform.getX()), + static_cast(transform.getY()), + transform.getW(), + transform.getH()}; + + const AnimationSet& aset = sprite.getAnimationSet(); + texture_.blit( + aset.getTexture(), + aset.getFrameRect(sprite.getFrame()), + dstrect); } - - texture.renderScreen(); + + texture_.renderScreen(); } diff --git a/src/systems/rendering.h b/src/systems/rendering.h index cec72e2..a53ee64 100644 --- a/src/systems/rendering.h +++ b/src/systems/rendering.h @@ -6,14 +6,17 @@ #include "consts.h" class RenderingSystem : public System { - public: - RenderingSystem(Game& game) - : System(game) {} +public: - void tick(double dt); + RenderingSystem(Game& game) : System(game) + { + } - private: - Texture texture {GAME_WIDTH, GAME_HEIGHT}; + void tick(double dt); + +private: + + Texture texture_ {GAME_WIDTH, GAME_HEIGHT}; }; #endif /* end of include guard: RENDERING_H_76ABC02A */ -- cgit 1.4.1 From 1400ade977e13e3b535d3c2fddb6e15de3c9b5a5 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Thu, 8 Feb 2018 13:43:10 -0500 Subject: Moved sprite rendering into AnimatingSystem Refactored how systems work slightly. Now, rendering can be done by a number of systems working together. Since the AnimatingSystem handles the animation of sprites, it should also handle the rendering of them. Because of this, the RenderingSystem has been removed. --- CMakeLists.txt | 1 - src/game.cpp | 16 +++++++++------- src/system.h | 31 ++++++++++++++++++++++++++++++- src/system_manager.h | 24 ++++++++++++++++++++++++ src/systems/animating.cpp | 30 ++++++++++++++++++++++++++++++ src/systems/animating.h | 3 +++ src/systems/rendering.cpp | 37 ------------------------------------- src/systems/rendering.h | 22 ---------------------- 8 files changed, 96 insertions(+), 68 deletions(-) delete mode 100644 src/systems/rendering.cpp delete mode 100644 src/systems/rendering.h (limited to 'src/system.h') diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ac3a38..1da4432 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,7 +61,6 @@ add_executable(Aromatherapy src/entity_manager.cpp src/game.cpp src/animation.cpp - src/systems/rendering.cpp src/systems/controlling.cpp src/systems/pondering.cpp src/systems/animating.cpp diff --git a/src/game.cpp b/src/game.cpp index 492e4d0..dfe700e 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -5,11 +5,12 @@ #include "components/droppable.h" #include "components/ponderable.h" #include "components/orientable.h" -#include "systems/rendering.h" #include "systems/controlling.h" #include "systems/pondering.h" #include "systems/animating.h" #include "animation.h" +#include "renderer.h" +#include "consts.h" void key_callback(GLFWwindow* window, int key, int, int action, int) { @@ -22,14 +23,13 @@ void key_callback(GLFWwindow* window, int key, int, int action, int) return; } - game.systemManager_.getSystem().input(key, action); + game.systemManager_.input(key, action); } Game::Game(GLFWwindow* window) : window_(window) { systemManager_.emplaceSystem(*this); systemManager_.emplaceSystem(*this); - systemManager_.emplaceSystem(*this); systemManager_.emplaceSystem(*this); int player = entityManager_.emplaceEntity(); @@ -64,6 +64,7 @@ void Game::execute() double lastTime = glfwGetTime(); const double dt = 0.01; double accumulator = 0.0; + Texture texture(GAME_WIDTH, GAME_HEIGHT); while (!(shouldQuit_ || glfwWindowShouldClose(window_))) { @@ -76,13 +77,14 @@ void Game::execute() accumulator += frameTime; while (accumulator >= dt) { - systemManager_.getSystem().tick(dt); - systemManager_.getSystem().tick(dt); - systemManager_.getSystem().tick(dt); + systemManager_.tick(dt); accumulator -= dt; } - systemManager_.getSystem().tick(frameTime); + // Render + texture.fill(texture.entirety(), 0, 0, 0); + systemManager_.render(texture); + texture.renderScreen(); } } diff --git a/src/system.h b/src/system.h index 6a3cd14..e630c48 100644 --- a/src/system.h +++ b/src/system.h @@ -4,6 +4,7 @@ #include "entity_manager.h" class Game; +class Texture; class System { public: @@ -16,7 +17,35 @@ public: virtual ~System() = default; - virtual void tick(double dt) = 0; + /** + * Updates the state of a system. + * + * @param dt - The amount of time in seconds that have passed since the last + * update. + */ + virtual void tick(double) + { + } + + /** + * Renders to a texture. + * + * @param texture - The surface to render to. + */ + virtual void render(Texture&) + { + } + + /** + * Processes keyboard input. + * + * @param key - The relevant key. + * + * @param action - The action performed (press, released, etc). + */ + virtual void input(int, int) + { + } protected: diff --git a/src/system_manager.h b/src/system_manager.h index e2c98cb..b03c3f2 100644 --- a/src/system_manager.h +++ b/src/system_manager.h @@ -39,6 +39,30 @@ public: return *dynamic_cast(systems[systemType]); } + void tick(double dt) + { + for (std::unique_ptr& sys : loop) + { + sys->tick(dt); + } + } + + virtual void render(Texture& texture) + { + for (std::unique_ptr& sys : loop) + { + sys->render(texture); + } + } + + virtual void input(int key, int action) + { + for (std::unique_ptr& sys : loop) + { + sys->input(key, action); + } + } + }; #endif /* end of include guard: SYSTEM_MANAGER_H_544E6056 */ diff --git a/src/systems/animating.cpp b/src/systems/animating.cpp index fcbfca5..91fe925 100644 --- a/src/systems/animating.cpp +++ b/src/systems/animating.cpp @@ -1,6 +1,7 @@ #include "animating.h" #include "game.h" #include "components/animatable.h" +#include "components/transformable.h" void AnimatingSystem::tick(double) { @@ -28,6 +29,35 @@ void AnimatingSystem::tick(double) } } +void AnimatingSystem::render(Texture& texture) +{ + std::set spriteEntities = + game_.getEntityManager().getEntitiesWithComponents< + AnimatableComponent, + TransformableComponent>(); + + for (id_type entity : spriteEntities) + { + auto& sprite = game_.getEntityManager(). + getComponent(entity); + + auto& transform = game_.getEntityManager(). + getComponent(entity); + + Rectangle dstrect { + static_cast(transform.getX()), + static_cast(transform.getY()), + transform.getW(), + transform.getH()}; + + const AnimationSet& aset = sprite.getAnimationSet(); + texture.blit( + aset.getTexture(), + aset.getFrameRect(sprite.getFrame()), + dstrect); + } +} + void AnimatingSystem::startAnimation(id_type entity, std::string animation) { auto& sprite = game_.getEntityManager(). diff --git a/src/systems/animating.h b/src/systems/animating.h index 150a74a..d6a89a5 100644 --- a/src/systems/animating.h +++ b/src/systems/animating.h @@ -3,6 +3,7 @@ #include "system.h" #include +#include "renderer.h" class AnimatingSystem : public System { public: @@ -13,6 +14,8 @@ public: void tick(double dt); + void render(Texture& texture); + void startAnimation(id_type entity, std::string animation); }; diff --git a/src/systems/rendering.cpp b/src/systems/rendering.cpp deleted file mode 100644 index 8219732..0000000 --- a/src/systems/rendering.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "rendering.h" -#include "game.h" -#include "components/animatable.h" -#include "components/transformable.h" - -void RenderingSystem::tick(double) -{ - texture_.fill(texture_.entirety(), 0, 0, 0); - - std::set spriteEntities = - game_.getEntityManager().getEntitiesWithComponents< - AnimatableComponent, - TransformableComponent>(); - - for (id_type entity : spriteEntities) - { - auto& sprite = game_.getEntityManager(). - getComponent(entity); - - auto& transform = game_.getEntityManager(). - getComponent(entity); - - Rectangle dstrect { - static_cast(transform.getX()), - static_cast(transform.getY()), - transform.getW(), - transform.getH()}; - - const AnimationSet& aset = sprite.getAnimationSet(); - texture_.blit( - aset.getTexture(), - aset.getFrameRect(sprite.getFrame()), - dstrect); - } - - texture_.renderScreen(); -} diff --git a/src/systems/rendering.h b/src/systems/rendering.h deleted file mode 100644 index a53ee64..0000000 --- a/src/systems/rendering.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef RENDERING_H_76ABC02A -#define RENDERING_H_76ABC02A - -#include "system.h" -#include "renderer.h" -#include "consts.h" - -class RenderingSystem : public System { -public: - - RenderingSystem(Game& game) : System(game) - { - } - - void tick(double dt); - -private: - - Texture texture_ {GAME_WIDTH, GAME_HEIGHT}; -}; - -#endif /* end of include guard: RENDERING_H_76ABC02A */ -- cgit 1.4.1