diff --git a/include/Core/CTransform.h b/include/Core/CTransform.h index e99f21e..812e05e 100644 --- a/include/Core/CTransform.h +++ b/include/Core/CTransform.h @@ -43,7 +43,7 @@ struct Transform : public Component glm::vec3 Scale; // Sticky is if it sticks with the player or not. True means it will follow the camera. - bool Sticky; + bool Sticky = true; }; } diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 777c943..6d13fba 100755 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -50,12 +50,15 @@ #include "Game/CStickyAim.h" #include "Game/BallSystem.h" #include "Game/HitLagSystem.h" +#include "Game/TravellingSystem.h" #include "Game/LifebuoySystem.h" #include "Game/ProjectileSystem.h" #include "Game/Bricks/CPowerUpBrick.h" #include "Game/BrickComponents.h" +#include "Game/EScreenShake.h" + #include "Physics/PhysicsSystem.h" #include "Physics/CPhysics.h" #include "Physics/CRectangleShape.h" @@ -153,6 +156,9 @@ public: m_World->SystemFactory.Register( [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::TravellingSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); @@ -360,8 +366,10 @@ public: //EVENT_SUBSCRIBE_MEMBER(m_EGameStart, &Engine::OnGameStart); m_EGameStart = decltype(m_EGameStart)(std::bind(&Engine::OnGameStart, this, std::placeholders::_1)); m_EventBroker->Subscribe(m_EGameStart); + m_EScreenShake = decltype(m_EScreenShake)(std::bind(&Engine::OnScreenShake, this, std::placeholders::_1)); + m_EventBroker->Subscribe(m_EScreenShake); - m_LastTime = glfwGetTime(); + m_LastTime = glfwGetTime(); } bool Running() const { return !glfwWindowShouldClose(m_Renderer->Window()); } @@ -380,6 +388,9 @@ public: //ResourceManager::Update(); if (m_GameIsRunning) { m_World->Update(dt); + + // I apologize about this. + ScreenShakeUpdate(dt); } m_EventBroker->Process(); m_FrameStack->UpdateLayered(dt); @@ -391,6 +402,8 @@ public: TEMPAddToRenderQueue(); } + std::unique_ptr defaultCamera = nullptr; + // Render scene //TODO send renderqueue to draw. m_Renderer->Draw(m_RendererQueue); @@ -550,6 +563,36 @@ public: m_RendererQueue.Forward.Add(job); } + void ScreenShakeUpdate(double dt) + { + if (m_ScreenShake) { + m_ShakeTimer += dt; + if (m_ShakeTimer >= m_ShakeEndTime) { + m_ShakeRepresentativeIntensity -= m_ShakeRepresentativeIntensity * 0.1 * dt; + m_ShakeIntensity = m_ShakeRepresentativeIntensity; + if (m_ShakeRepresentativeIntensity < 0.1) { + m_ScreenShake = false; + m_Renderer->PlaceCamera(glm::vec3(0, 0, 0)); + return; + } + } else { + std::cout << "Timer: " << m_ShakeTimer << " End: " << m_ShakeEndTime << std::endl; + } + //float randomX = (rand() % m_ShakeIntensity); + //float randomY = (rand() % m_ShakeIntensity); + + float randomX = 0; + float randomY = 0; + + std::cout << "X: " << randomX << " Y: " << randomY << std::endl; + float half = m_ShakeIntensity / 2; + + //m_Renderer->PlaceCamera(glm::vec3(randomX - half, randomY - half, 0)); + } else { + + } + } + private: std::shared_ptr m_EventBroker; GUI::Frame* m_FrameStack = nullptr; @@ -557,6 +600,7 @@ private: RenderQueueCollection m_RendererQueue; std::shared_ptr m_InputManager; std::shared_ptr m_World; + glm::vec3 m_CameraPosition = glm::vec3(0.f, 0.f, 0.f); //TODO: Redo bool m_GameIsRunning = false; @@ -581,6 +625,22 @@ private: return true; }; + + //TODO: Extreme Redo. + bool m_ScreenShake = false; + int m_ShakeIntensity = 0; + float m_ShakeRepresentativeIntensity = 0; + float m_ShakeTimer = 0; + float m_ShakeEndTime = 0; + dd::EventRelay m_EScreenShake; + bool OnScreenShake(const dd::Events::ScreenShake &event) + { + m_ScreenShake = true; + m_ShakeIntensity = event.Intensity; + m_ShakeEndTime = event.Time; + m_ShakeTimer = 0; + return true; + } double m_LastTime; }; diff --git a/include/Core/Renderer.h b/include/Core/Renderer.h index 33fb83a..b02928a 100755 --- a/include/Core/Renderer.h +++ b/include/Core/Renderer.h @@ -20,6 +20,12 @@ #define DD_RENDERER_H__ #include "Util/Rectangle.h" +#include "Core/System.h" +#include "Core/CTransform.h" +#include "Core/CTemplate.h" +#include "Core/EventBroker.h" +#include "Core/World.h" +#include "Game/EScreenShake.h" #include "Camera.h" #include "RenderQueue.h" #include "ShaderProgram.h" @@ -48,6 +54,7 @@ public: } void Initialize(); void Draw(RenderQueueCollection& rq); + void PlaceCamera(glm::vec3 position); private: Rectangle m_Resolution = Rectangle(1280, 720); @@ -107,6 +114,12 @@ private: void DrawWater(RenderQueue &objects); void DrawGUI(RenderQueue& rq); void DebugKeys(); + + dd::EventRelay m_EScreenShake; + bool OnScreenShake(dd::Events::ScreenShake &event); + bool m_ScreenShake = false; + float m_ShakeIntensity = 0; + float m_ShakeTimer = 0; }; } diff --git a/include/Game/EScreenShake.h b/include/Game/EScreenShake.h new file mode 100644 index 0000000..7df1af3 --- /dev/null +++ b/include/Game/EScreenShake.h @@ -0,0 +1,26 @@ +// +// Created by Administrator on 2015-10-13. +// + +#ifndef DAYDREAM_ESCREENSHAKE_H +#define DAYDREAM_ESCREENSHAKE_H + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct ScreenShake : Event +{ + float Time; + int Intensity; +}; + +} + +} + +#endif //DAYDREAM_ESCREENSHAKE_H diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index 2d6ea68..789e1e0 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -35,6 +35,7 @@ #include "Game/EStageCleared.h" #include "Game/EPause.h" #include "Game/EHitLag.h" +#include "Game/EScreenShake.h" #include "Game/EActionButton.h" @@ -92,6 +93,7 @@ private: std::shared_ptr m_StickTransform; std::shared_ptr m_StickyAim; + bool m_ResetBall = false; bool m_Pause = false; dd::EventRelay m_EKeyDown; @@ -99,6 +101,7 @@ private: dd::EventRelay m_EContact; dd::EventRelay m_EContactPowerUp; dd::EventRelay m_EStageCleared; + dd::EventRelay m_EResetBall; dd::EventRelay m_EPause; dd::EventRelay m_EKrakenAttack; dd::EventRelay m_EStickyPad; @@ -110,6 +113,7 @@ private: bool OnContact(const dd::Events::Contact &event); bool OnContactPowerUp(const dd::Events::Contact &event); bool OnStageCleared(const dd::Events::StageCleared &event); + bool OnResetBall(const dd::Events::ResetBall &event); bool OnPause(const dd::Events::Pause &event); bool OnKrakenAttack(const dd::Events::KrakenAttack &event); bool OnStickyPad(const dd::Events::StickyPad &event); diff --git a/include/Game/TravellingSystem.h b/include/Game/TravellingSystem.h new file mode 100644 index 0000000..ca18a88 --- /dev/null +++ b/include/Game/TravellingSystem.h @@ -0,0 +1,56 @@ +// +// Created by Adniklastrator on 2015-10-13. +// + +#ifndef DAYDREAM_TRAVELLINGSYSTEM_H +#define DAYDREAM_TRAVELLINGSYSTEM_H + + +#include "Core/System.h" +#include "Core/CTransform.h" +#include "Core/EventBroker.h" +#include "Core/World.h" +#include "Game/EPause.h" +#include "Game/EArrivedAtNewStage.h" +#include "Game/EStageCleared.h" + + +namespace dd +{ + +namespace Systems +{ + +class TravellingSystem : public System +{ +public: + TravellingSystem(World* world, std::shared_ptr eventBroker) + : System(world, eventBroker) + { } + + + void Initialize() override; + void Update(double dt) override; + void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + + bool IsPaused() const { return m_Pause; } + void SetPause(const bool& pause) { m_Pause = pause; } + +private: + bool m_Pause = false; + + bool m_Travelling = false; + float m_DistanceTravelled = 0; + + dd::EventRelay m_EPause; + dd::EventRelay m_EStageCleared; + + bool OnPause(const dd::Events::Pause &event); + bool OnStageCleared(const dd::Events::StageCleared &event); +}; + +} + +} + +#endif //DAYDREAM_TRAVELLINGSYSTEM_H diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index b2c0ab7..60fd02e 100755 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -31,9 +31,6 @@ #include "Transform/TransformSystem.h" #include "CRectangleShape.h" - -#include "Game/EStageCleared.h" -#include "Game/EArrivedAtNewStage.h" #include "Game/EPause.h" #include "Game/CPad.h" #include "Game/CBrick.h" @@ -117,12 +114,8 @@ namespace dd bool SetImpulse(const Events::SetImpulse &event); dd::EventRelay m_EPause; bool OnPause(const dd::Events::Pause &event); - dd::EventRelay m_EStageCleared; - bool OnStageCleared(const dd::Events::StageCleared &event); dd::EventRelay m_EContact; bool OnContact(const dd::Events::Contact &event); - bool m_Travelling = false; - float m_DistanceTravelled = 0; //TODO: Fill struct with info needed. struct EmitterHandler //TODO CHANGE NAMES diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index 674fc96..5d99505 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -72,6 +72,7 @@ void dd::Renderer::Initialize() m_CurrentScreenBuffer = m_TFinal; } + void dd::Renderer::LoadShaders() { /* @@ -384,6 +385,11 @@ void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) DrawWater(objects); } +void dd::Renderer::PlaceCamera(glm::vec3 position) +{ + m_DefaultCamera->SetPosition(position); +} + void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) { GLuint shaderProgramHandle = program; diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index e67cafb..68c38f0 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -126,7 +126,7 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID } else if (!ballComponent->Sticky) { auto transform = m_World->GetComponent(entity); transform->Velocity = glm::vec3(0.f, 0.f, 0.f); - transform->Position = glm::vec3(0.0f, -3.f, -10.f); + //transform->Position = glm::vec3(0.0f, -3.f, -10.f); transform->Orientation = glm::quat(); return; } @@ -288,27 +288,29 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) float y = glm::cos((abs(x) / (1.6f)) * glm::pi() / 2.f) + 1.f; ballComponent->Combo = 0; - - if (m_InkBlaster) { - if (!m_InkAttached) { - m_InkAttached = true; - m_Waiting = true; - m_InkBlockedWaiting = true; - ballComponent->Sticky = true; - ballComponent->StickyPlacement = glm::vec3(0, 0.5f, 0); - ballComponent->SavedSpeed = glm::normalize(glm::vec3(x, y, 0.f)) * ballComponent->Speed; - ballTransform->Velocity = glm::vec3(0.f, 0.f, 0.f); + if (!ballComponent->Waiting) { + if (m_InkBlaster) { + if (!m_InkAttached) { + m_InkAttached = true; + m_Waiting = true; + m_InkBlockedWaiting = true; + ballComponent->Sticky = true; + ballComponent->StickyPlacement = glm::vec3(0, 0.5f, 0); + ballComponent->SavedSpeed = glm::normalize(glm::vec3(x, y, 0.f)) * ballComponent->Speed; + ballTransform->Velocity = glm::vec3(0.f, 0.f, 0.f); + } + } + else if (m_Sticky) { + m_Sticky = false; + m_Waiting = true; + ballComponent->Sticky = true; + ballComponent->StickyPlacement = ballTransform->Position - padTransform->Position; + ballComponent->SavedSpeed = glm::normalize(glm::vec3(x, y, 0.f)) * ballComponent->Speed; + ballTransform->Velocity *= -1; + Events::StickyAttachedToPad e; + EventBroker->Publish(e); + return true; } - } else if (m_Sticky) { - m_Sticky = false; - m_Waiting = true; - ballComponent->Sticky = true; - ballComponent->StickyPlacement = ballTransform->Position - padTransform->Position; - ballComponent->SavedSpeed = glm::normalize(glm::vec3(x, y, 0.f)) * ballComponent->Speed; - ballTransform->Velocity *= -1; - Events::StickyAttachedToPad e; - EventBroker->Publish(e); - return true; } ballTransform->Velocity = glm::normalize(glm::vec3(x, y ,0.f)) * ballComponent->Speed; diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index 323fea7..6de46d3 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -27,6 +27,7 @@ void dd::Systems::PadSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EContact, &PadSystem::OnContact); EVENT_SUBSCRIBE_MEMBER(m_EContactPowerUp, &PadSystem::OnContactPowerUp); EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &PadSystem::OnStageCleared); + EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &PadSystem::OnResetBall); EVENT_SUBSCRIBE_MEMBER(m_EPause, &PadSystem::OnPause); EVENT_SUBSCRIBE_MEMBER(m_EKrakenAttack, &PadSystem::OnKrakenAttack); EVENT_SUBSCRIBE_MEMBER(m_EStickyPad, &PadSystem::OnStickyPad); @@ -72,6 +73,8 @@ void dd::Systems::PadSystem::Initialize() m_StickTransform = transform; m_StickyAim = sticky; } + + m_ResetBall = true; } void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) @@ -81,7 +84,12 @@ void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID p auto ball = m_World->GetComponent(entity); if (ball != nullptr) { - if (ball->Sticky) { + if (ball->Waiting || ball->Sticky) { + if (m_ResetBall && ball->Waiting) { + ball->StickyPlacement = glm::vec3(0.f, 0.f, 0.f); + ball->StickyPlacement.y += 0.45f; + m_ResetBall = false; + } auto ballTransform = m_World->GetComponent(entity); ballTransform->Position = Transform()->Position; ballTransform->Position += ball->StickyPlacement; @@ -89,8 +97,10 @@ void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID p glm::vec2 up = glm::vec2(0.f, 1.f); float angle = glm::acos(glm::dot(dir, up)) * glm::sign(dir.x); ballTransform->Orientation = glm::rotate(glm::quat(), angle, glm::vec3(0.f, 0.f, -1.f)); - m_StickTransform->Orientation = glm::rotate(glm::quat(), angle, glm::vec3(0.f, 0.f, 1.f)); - m_StickTransform->Position = ballTransform->Position; + if (ball->Sticky) { + m_StickTransform->Orientation = glm::rotate(glm::quat(), angle, glm::vec3(0.f, 0.f, 1.f)); + m_StickTransform->Position = ballTransform->Position; + } } if (!m_StickyAim->Aiming) { m_StickTransform->Position = glm::vec3(30.f, 0.f, 0.f); @@ -103,6 +113,7 @@ void dd::Systems::PadSystem::Update(double dt) if (IsPaused()) { return; } + if (Entity() == 0) { for (auto it = m_World->GetEntities()->begin(); it != m_World->GetEntities()->end(); it++) { if (m_World->GetProperty(it->first, "Name") == "Pad") { @@ -209,6 +220,11 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) { } else if (val == GLFW_KEY_S) { Events::StageCleared e; EventBroker->Publish(e); + } else if (val == GLFW_KEY_E) { + Events::ScreenShake e; + e.Intensity = 20; + e.Time = 3; + EventBroker->Publish(e); } else if (val == GLFW_KEY_Y) { Events::StickyPad e; EventBroker->Publish(e); @@ -345,6 +361,12 @@ bool dd::Systems::PadSystem::OnStageCleared(const dd::Events::StageCleared &even return true; } +bool dd::Systems::PadSystem::OnResetBall(const dd::Events::ResetBall &event) +{ + m_ResetBall = true; + return true; +} + bool dd::Systems::PadSystem::OnKrakenAttack(const dd::Events::KrakenAttack &event) { if (!m_KrakenAttack) { diff --git a/src/game/Game/TravellingSystem.cpp b/src/game/Game/TravellingSystem.cpp new file mode 100644 index 0000000..a073488 --- /dev/null +++ b/src/game/Game/TravellingSystem.cpp @@ -0,0 +1,66 @@ +// +// Created by Adniklastrator on 2015-10-13. +// + +#include "PrecompiledHeader.h" +#include "Game/TravellingSystem.h" + +void dd::Systems::TravellingSystem::Initialize() +{ + EVENT_SUBSCRIBE_MEMBER(m_EPause, &TravellingSystem::OnPause); + EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &TravellingSystem::OnStageCleared); +} + +void dd::Systems::TravellingSystem::Update(double dt) +{ + if (m_Pause) { + return; + } + if (m_Travelling) { + if (m_DistanceTravelled > 12.f) { + m_DistanceTravelled = 0; + m_Travelling = false; + Events::ArrivedAtNewStage e; + EventBroker->Publish(e); + } + + m_DistanceTravelled += 6.0f * dt; + } +} + +void dd::Systems::TravellingSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) +{ + if (m_Travelling) { + auto transform = m_World->GetComponent(entity); + if (transform != nullptr) { + if (!transform->Sticky) { + transform->Position.y -= 6.0f * dt; + } + } + else { + transform->Position.y -= 6.0f * dt; + } + } +} + +bool dd::Systems::TravellingSystem::OnPause(const dd::Events::Pause &event) +{ + if (event.Type != "TravellingSystem" && event.Type != "All") { + return false; + } + + if (IsPaused()) { + SetPause(false); + } else { + SetPause(true); + } + return true; +} + +bool dd::Systems::TravellingSystem::OnStageCleared(const dd::Events::StageCleared &event) +{ + if (event.ClearedStage < 5) { + m_Travelling = true; + } + return true; +} \ No newline at end of file diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 0e99693..a567626 100755 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -23,7 +23,6 @@ void dd::Systems::PhysicsSystem::Initialize() InitializeWater(); EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, &PhysicsSystem::SetImpulse); EVENT_SUBSCRIBE_MEMBER(m_EPause, &PhysicsSystem::OnPause); - EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &PhysicsSystem::OnStageCleared); EVENT_SUBSCRIBE_MEMBER(m_ECreateParticleSequence, &PhysicsSystem::CreateParticleSequence); EVENT_SUBSCRIBE_MEMBER(m_EContact, &PhysicsSystem::OnContact); } @@ -170,17 +169,6 @@ void dd::Systems::PhysicsSystem::Update(double dt) if (m_Pause) { return; } - - if (m_Travelling) { - if (m_DistanceTravelled > 12.f) { - m_DistanceTravelled = 0; - m_Travelling = false; - Events::ArrivedAtNewStage e; - EventBroker->Publish(e); - } - - m_DistanceTravelled += 6.0f * dt; - } m_Accumulator += dt; while(m_Accumulator >= m_TimeStep) @@ -254,20 +242,8 @@ void dd::Systems::PhysicsSystem::Update(double dt) void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { - if (m_Travelling) { - auto transform = m_World->GetComponent(entity); - if (transform != nullptr) { - if (!transform->Sticky) { - transform->Position.y -= 6.0f * dt; - } - } else { - transform->Position.y -= 6.0f * dt; - } - } auto particle = m_World->GetComponent(entity); auto pTemplate = m_World->GetComponent(entity); - - if (particle && !pTemplate) { particle->LifeTime -= dt; @@ -360,15 +336,6 @@ void dd::Systems::PhysicsSystem::OnEntityRemoved(EntityID entity) } -bool dd::Systems::PhysicsSystem::OnStageCleared(const dd::Events::StageCleared &event) -{ - if (event.ClearedStage < 5) { - m_Travelling = true; - } - return true; -} - - void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) { auto physicsComponent = m_World->GetComponent(entity);