From 5d753babe62430d3d54dce061d8e70de01de1da1 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Wed, 9 Sep 2015 21:10:10 +0200 Subject: [PATCH] I developed a LevelSystem class, along with a CBrick component for use in it and an EStageCleared event that is triggered upon all the bricks being removed. The class currently creates a 8x8 grid of entities with Transform components. --- include/Core/Engine.h | 52 ++++++++++++++------------ include/Game/CBrick.h | 26 +++++++++++++ include/Game/EStageCleared.h | 21 +++++++++++ include/Game/LevelSystem.h | 51 ++++++++++++++++++++++++++ src/game/CMakeLists.txt | 2 +- src/game/Game/LevelSystem.cpp | 69 +++++++++++++++++++++++++++++++++++ 6 files changed, 196 insertions(+), 25 deletions(-) create mode 100644 include/Game/CBrick.h create mode 100644 include/Game/EStageCleared.h create mode 100644 include/Game/LevelSystem.h create mode 100644 src/game/Game/LevelSystem.cpp diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 8b16650..25269e6 100644 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -33,6 +33,7 @@ #include "Rendering/CModel.h" #include "CTemplate.h" #include "Transform/TransformSystem.h" +#include "Game/LevelSystem.h" namespace dd { @@ -42,24 +43,26 @@ class Engine public: Engine(int argc, char* argv[]) { -// m_EventBroker = std::make_shared(); + m_EventBroker = std::make_shared(); m_Renderer = std::make_shared(); m_Renderer->SetFullscreen(false); m_Renderer->SetResolution(Rectangle(0, 0, 1280, 720)); m_Renderer->Initialize(); -// m_InputManager = std::make_shared(m_Renderer->Window(), m_EventBroker); -// -// m_World = std::make_shared(m_EventBroker); -// -// //TODO: Move this out of engine.h -// m_World->ComponentFactory.Register(); -// m_World->SystemFactory.Register([this]() { return new Systems::TransformSystem(m_World.get(), m_EventBroker); }); -// m_World->AddSystem(); -// m_World->ComponentFactory.Register(); -// m_World->ComponentFactory.Register(); -// m_World->Initialize(); + m_InputManager = std::make_shared(m_Renderer->Window(), m_EventBroker); + + m_World = std::make_shared(m_EventBroker); + + //TODO: Move this out of engine.h + m_World->ComponentFactory.Register(); + m_World->SystemFactory.Register([this]() { return new Systems::TransformSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + m_World->SystemFactory.Register([this]() { return new Systems::LevelSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->Initialize(); // auto ent = m_World->CreateEntity(); // std::shared_ptr transform = m_World->AddComponent(ent); @@ -79,31 +82,32 @@ public: double dt = currentTime - m_LastTime; m_LastTime = currentTime; -// ResourceManager::Update(); -// -// // Update input -// m_InputManager->Update(dt); -// -// m_World->Update(dt); + ResourceManager::Update(); + + // Update input + m_InputManager->Update(dt); + + m_World->Update(dt); // // if (glfwGetKey(m_Renderer->Window(), GLFW_KEY_R)) { // ResourceManager::Reload("Shaders/Deferred/3/Fragment.glsl"); // } // -// //TODO Fill up the renderQueue with models (Temp fix) + //TODO Fill up the renderQueue with models (Temp fix) // TEMPAddToRenderQueue(); -// -// // Render scene -// //TODO send renderqueue to draw. - m_Renderer->Draw(m_RendererQueue); + + // Render scene + //TODO send renderqueue to draw. +// m_Renderer->Draw(m_RendererQueue); // Swap event queues -// m_EventBroker->Clear(); + m_EventBroker->Clear(); glfwPollEvents(); } std::shared_ptr m_TransformSystem; + std::shared_ptr m_LevelSystem; //TODO: Get this out of engine.h void TEMPAddToRenderQueue() diff --git a/include/Game/CBrick.h b/include/Game/CBrick.h new file mode 100644 index 0000000..7e7f83e --- /dev/null +++ b/include/Game/CBrick.h @@ -0,0 +1,26 @@ +// +// Created by Adniklastrator on 2015-09-09. +// + +#ifndef DAYDREAM_CBRICK_H +#define DAYDREAM_CBRICK_H + +#include "Core/Component.h" + +namespace dd +{ + +namespace Components +{ + +struct Brick : Component +{ + int Points = 10; + int Hits = 1; +}; + +} + +} + +#endif //DAYDREAM_CBRICK_H diff --git a/include/Game/EStageCleared.h b/include/Game/EStageCleared.h new file mode 100644 index 0000000..29ef021 --- /dev/null +++ b/include/Game/EStageCleared.h @@ -0,0 +1,21 @@ +// +// Created by Adniklastrator on 2015-09-09. +// + +#ifndef DAYDREAM_ESTAGECLEARED_H +#define DAYDREAM_ESTAGECLEARED_H + +#include "Core/EventBroker.h" + +namespace dd +{ +namespace Events +{ +struct StageCleared : Event +{ + +}; +} +} + +#endif //DAYDREAM_ESTAGECLEARED_H diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h new file mode 100644 index 0000000..5016f0f --- /dev/null +++ b/include/Game/LevelSystem.h @@ -0,0 +1,51 @@ +// +// Created by Adniklastrator on 2015-09-09. +// + +#ifndef DAYDREAM_LEVELSYSTEM_H +#define DAYDREAM_LEVELSYSTEM_H + +#include "Core/System.h" +#include "Core/CTransform.h" +//#include "Rendering/CSprite.h" +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Systems +{ + +class LevelSystem : public System +{ +public: + LevelSystem(World* world, std::shared_ptr eventBroker) + : System(world, eventBroker) + { } + + void Initialize() override; + + void CreateBasicLevel(int, int, int, int); + void CreateBrick(int, int, int, int); + void ProcessCollision(); + + void OnEntityRemoved(EntityID entity); + + void EndLevel(); + + + +private: + int numberOfBricks; + EntityID bricks[]; + int tRows = 8; + int tLines = 8; + int tSpaceBetweenBricks = 30; + int tSpaceToEdge = 30; +}; + +} + +} + +#endif //DAYDREAM_LEVELSYSTEM_H diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index aece1db..aa0e86a 100755 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -67,7 +67,7 @@ set(SOURCE_FILES ${SOURCE_FILES_Rendering} ${SOURCE_FILES_Transform} ${SOURCE_FILES_Game} -) + ../../include/Game/CBrick.h ../../include/Game/EStageCleared.h) if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp new file mode 100644 index 0000000..df0fde6 --- /dev/null +++ b/src/game/Game/LevelSystem.cpp @@ -0,0 +1,69 @@ +// +// Created by Adniklastrator on 2015-09-09. +// + + +#include "PrecompiledHeader.h" +#include "Game/CBrick.h" +#include "Game/LevelSystem.h" +#include "Core/World.h" +#include "Game/EStageCleared.h" + +void dd::Systems::LevelSystem::Initialize() +{ + CreateBasicLevel(tRows, tLines, tSpaceBetweenBricks, tSpaceToEdge); + return; +} + +void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, int spacesBetweenBricks, int spaceToEdge) +{ + numberOfBricks = rows * lines; + for (int i = 0; i < rows; i++) + { + for (int j = 0; j < lines; j++) + { + CreateBrick(i, j, spacesBetweenBricks, spaceToEdge); + } + } + + return; +} + +void dd::Systems::LevelSystem::CreateBrick(int row, int line, int spacesBetweenBricks, int spaceToEdge) +{ + auto brick = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(brick); + //std::shared_ptr sprite = m_World->AddComponent(brick); + float x = spaceToEdge + line * spacesBetweenBricks; + float y = spaceToEdge + line * spacesBetweenBricks; + transform->Position = glm::vec3(x, y, 0.f); + //sprite->Color = glm::vec4(1.f, 1.f, 1.f, 1.f); + return; +} + +void dd::Systems::LevelSystem::ProcessCollision() +{ + // Like, go into brick component and check what it does upon collision. Maybe not done here? + return; +} + +void dd::Systems::LevelSystem::OnEntityRemoved(EntityID entity) +{ + auto brick = m_World->GetComponent(entity); + if (brick != NULL) + { + numberOfBricks--; + if (numberOfBricks < 1) + { + EndLevel(); + } + } + return; +} + +void dd::Systems::LevelSystem::EndLevel() +{ + Events::StageCleared e; + EventBroker->Publish(e); + return; +} \ No newline at end of file