From c31ff4cfcb83d4aed0117a3841d153dc1eed9596 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Wed, 30 Sep 2015 15:19:45 +0200 Subject: [PATCH 1/6] P-button pauses, H-button does 0.3 second HitLag. --- include/Core/Engine.h | 25 -------- include/Game/BallSystem.h | 17 ++++++ include/Game/EHitLag.h | 26 ++++++++ include/Game/EPause.h | 25 ++++++++ include/Game/LevelSystem.h | 6 ++ include/Game/PadSystem.h | 10 +++- include/Physics/PhysicsSystem.h | 33 ++++++++--- src/game/Game/BallSystem.cpp | 95 ++++++++++++++++++++++++------ src/game/Game/LevelSystem.cpp | 14 +++++ src/game/Game/PadSystem.cpp | 26 ++++++++ src/game/Physics/PhysicsSystem.cpp | 36 +++++++++++ 11 files changed, 262 insertions(+), 51 deletions(-) create mode 100644 include/Game/EHitLag.h create mode 100644 include/Game/EPause.h diff --git a/include/Core/Engine.h b/include/Core/Engine.h index f556bc5..38142a7 100644 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -130,31 +130,6 @@ public: m_World->ComponentFactory.Register(); m_World->Initialize(); - - //OctoBall - { - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(-0.f, 0.26f, -10.f); - transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); - transform->Velocity = glm::vec3(0.0f, -10.f, 0.f); - auto model = m_World->AddComponent(ent); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - std::shared_ptr circleShape = m_World->AddComponent(ent); - std::shared_ptr ball = m_World->AddComponent(ent); - ball->Speed = 5.f; - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Ball; - physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; - physics->Calculate = true; - - //auto plight = m_World->AddComponent(ent); - //plight->Radius = 2.f; - - m_World->CommitEntity(ent); - } - //PointLightTest { auto t_Light = m_World->CreateEntity(); diff --git a/include/Game/BallSystem.h b/include/Game/BallSystem.h index 3ead5d8..c0e94fe 100644 --- a/include/Game/BallSystem.h +++ b/include/Game/BallSystem.h @@ -20,6 +20,8 @@ #include "Game/EMultiBall.h" #include "Game/EMultiBallLost.h" #include "Game/EGameOver.h" +#include "Game/EPause.h" +#include "Game/EHitLag.h" namespace dd { @@ -75,6 +77,10 @@ public: void SetReplaceBall(const bool& replaceBall) { m_ReplaceBall = replaceBall; } bool MultiBall() const { return m_MultiBall; } void SetMultiBall(const bool& multiBall) { m_MultiBall = multiBall; } + bool Pause() const { return m_Pause; } + void SetPause(const bool& pause) { m_Pause = pause; } + bool HitLag() const { return m_HitLag; } + void SetHitLag(const bool& hitLag) { m_HitLag = hitLag; } private: float m_XMovementMultiplier = 2.f; @@ -85,6 +91,13 @@ private: int m_PastLives = 3; bool m_ReplaceBall = false; bool m_MultiBall = false; + bool m_Pause = false; + + bool m_HitLag = false; + float m_Time; + float m_SlowdownTime; + float m_HitLagTimer = 0; + float m_HitLagPlacement = 0; EntityID m_Ball; @@ -92,11 +105,15 @@ private: dd::EventRelay m_EMultiBallLost; dd::EventRelay m_EResetBall; dd::EventRelay m_EMultiBall; + dd::EventRelay m_EPause; + dd::EventRelay m_EHitLag; bool OnLifeLost(const dd::Events::LifeLost &event); bool OnMultiBallLost(const dd::Events::MultiBallLost &event); bool OnResetBall(const dd::Events::ResetBall &event); bool OnMultiBall(const dd::Events::MultiBall &event); + bool OnPause(const dd::Events::Pause &event); + bool OnHitLag(const dd::Events::HitLag &event); }; } diff --git a/include/Game/EHitLag.h b/include/Game/EHitLag.h new file mode 100644 index 0000000..9e29416 --- /dev/null +++ b/include/Game/EHitLag.h @@ -0,0 +1,26 @@ +// +// Created by Administrator on 2015-09-30. +// + +#ifndef DAYDREAM_EHITLAG_H +#define DAYDREAM_EHITLAG_H + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct HitLag : Event +{ + float Time; + std::string Type; +}; + +} + +} + +#endif //DAYDREAM_EHITLAG_H diff --git a/include/Game/EPause.h b/include/Game/EPause.h new file mode 100644 index 0000000..b6d2505 --- /dev/null +++ b/include/Game/EPause.h @@ -0,0 +1,25 @@ +// +// Created by Adniklastrator on 2015-09-30. +// + +#ifndef DAYDREAM_EPAUSE_H +#define DAYDREAM_EPAUSE_H + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct Pause : Event +{ + +}; + +} + +} + +#endif //DAYDREAM_EPAUSE_H diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index 6849d4f..f8b4603 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -23,6 +23,7 @@ #include "Game/EComboEvent.h" #include "Game/EMultiBall.h" #include "Game/EMultiBallLost.h" +#include "Game/EPause.h" #include "Game/EGameOver.h" #include "Game/ECreatePowerUp.h" #include "Game/EPowerUpTaken.h" @@ -80,6 +81,8 @@ public: void SetRestarting(const bool& restarting) { m_Restarting = restarting; } bool Initialized() const { return m_Initialized; } void SetInitialized(const bool& initialized) { m_Initialized = initialized; } + bool Pause() const { return m_Pause; } + void SetPause(const bool& pause) { m_Pause = pause; } int& MultiBalls() { return m_MultiBalls; } void SetMultiBalls(const int& multiBalls) { m_MultiBalls = multiBalls; } int& PowerUps() { return m_PowerUps; } @@ -103,6 +106,7 @@ public: private: bool m_Restarting = false; bool m_Initialized = false; + bool m_Pause = false; int m_MultiBalls = 0; int m_PowerUps = 0; int m_Score = 0; @@ -120,6 +124,7 @@ private: dd::EventRelay m_ECreatePowerUp; dd::EventRelay m_EPowerUpTaken; dd::EventRelay m_EStageCleared; + dd::EventRelay m_EPause; bool OnContact(const dd::Events::Contact &event); bool OnScoreEvent(const dd::Events::ScoreEvent &event); @@ -128,6 +133,7 @@ private: bool OnCreatePowerUp(const dd::Events::CreatePowerUp &event); bool OnPowerUpTaken(const dd::Events::PowerUpTaken &event); bool OnStageCleared(const dd::Events::StageCleared &event); + bool OnPause(const dd::Events::Pause &event); }; } diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index 6f2d13a..9328972 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -28,6 +28,8 @@ #include "Game/EMultiBall.h" #include "Game/EPowerUpTaken.h" #include "Game/EStageCleared.h" +#include "Game/EPause.h" +#include "Game/EHitLag.h" namespace dd @@ -63,6 +65,9 @@ public: Components::Pad* Pad() const { return m_Pad; } void SetPad(Components::Pad* pad) { m_Pad = pad; } + bool Pause() const { return m_Pause; } + void SetPause(const bool& pause) { m_Pause = pause; } + private: EntityID m_Entity = 0; glm::vec3 m_Acceleration = glm::vec3(0.f, 0.f, 0.f); @@ -72,18 +77,21 @@ private: Components::Transform* m_Transform; Components::Pad* m_Pad; + bool m_Pause = false; + dd::EventRelay m_EKeyDown; dd::EventRelay m_EKeyUp; dd::EventRelay m_EContact; dd::EventRelay m_EContactPowerUp; dd::EventRelay m_EStageCleared; + dd::EventRelay m_EPause; bool OnKeyDown(const dd::Events::KeyDown &event); bool OnKeyUp(const dd::Events::KeyUp &event); - bool OnContact(const dd::Events::Contact &event); bool OnContactPowerUp(const dd::Events::Contact &event); bool OnStageCleared(const dd::Events::StageCleared &event); + bool OnPause(const dd::Events::Pause &event); class PadSteeringInputController; std::array, 4> m_PadInputControllers; diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index 05ea1e7..4f9a8ef 100644 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -3,21 +3,23 @@ #include +#include "Core/CTransform.h" #include "Core/System.h" #include "Core/World.h" -#include "CRectangleShape.h" +#include "Core/EventBroker.h" +#include "Physics/CRectangleShape.h" +#include "Physics/CCircleShape.h" #include "Physics/CPhysics.h" -#include -#include "Core/CTransform.h" -#include "Transform/TransformSystem.h" +#include "Physics/CWaterVolume.h" #include "Physics/EContact.h" #include "Physics/ESetImpulse.h" -#include "Physics/CCircleShape.h" -#include "Core/EventBroker.h" +#include "Game/EPause.h" +#include "Game/EHitLag.h" #include "Game/CPad.h" -#include "Physics/CWaterVolume.h" #include "Game/CBall.h" +#include "Transform/TransformSystem.h" #include "Rendering/CSprite.h" +#include namespace dd @@ -54,11 +56,28 @@ public: // Called when an entity is removed void OnEntityRemoved(EntityID entity) override; + bool Pause() const { return m_Pause; } + void SetPause(const bool& pause) { m_Pause = pause; } + bool HitLag() const { return m_HitLag; } + void SetHitLag(const bool& hitLag) { m_HitLag = hitLag; } + private: b2Vec2 m_Gravity; b2World* m_PhysicsWorld; double m_TimeStep; double m_Accumulator; + bool m_Pause = false; + + bool m_HitLag = false; + float m_Time; + float m_SlowdownTime; + float m_HitLagTimer = 0; + float m_HitLagPlacement = 0; + + dd::EventRelay m_EPause; + dd::EventRelay m_EHitLag; + bool OnPause(const dd::Events::Pause &event); + bool OnHitLag(const dd::Events::HitLag &event); int m_VelocityIterations, m_PositionIterations; diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index 53206fb..d7d264d 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -18,26 +18,42 @@ void dd::Systems::BallSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EMultiBallLost, &BallSystem::OnMultiBallLost); EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &BallSystem::OnResetBall); EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &BallSystem::OnMultiBall); + EVENT_SUBSCRIBE_MEMBER(m_EPause, &BallSystem::OnPause); + EVENT_SUBSCRIBE_MEMBER(m_EHitLag, &BallSystem::OnHitLag); - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(-0.f, 50.f, -10.f); - transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); - transform->Velocity = glm::vec3(0.0f, 0.f, 0.f); - auto model = m_World->AddComponent(ent); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - std::shared_ptr circleShape = m_World->AddComponent(ent); - std::shared_ptr ball = m_World->AddComponent(ent); - ball->Speed = 5.f; - std::shared_ptr physics = m_World->AddComponent(ent); - std::shared_ptr ballTemplate = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Ball; - physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; - physics->Calculate = true; - m_World->CommitEntity(ent); + //OctoBall + { + auto ent = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(ent); + transform->Position = glm::vec3(-0.f, 50.26f, -10.f); + transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); + transform->Velocity = glm::vec3(0.f, 0.f, 0.f); + auto model = m_World->AddComponent(ent); + model->ModelFile = "Models/Test/Ball/Ballopus.obj"; + std::shared_ptr circleShape = m_World->AddComponent(ent); + std::shared_ptr ball = m_World->AddComponent(ent); + ball->Speed = 5.f; + std::shared_ptr physics = m_World->AddComponent(ent); + std::shared_ptr ballTemplate = m_World->AddComponent(ent); + physics->Static = false; + physics->Category = CollisionLayer::Type::Ball; + physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; + physics->Calculate = true; - SetBall(ent); + //auto plight = m_World->AddComponent(ent); + //plight->Radius = 2.f; + + m_World->CommitEntity(ent); + + SetBall(ent); + + auto ent2 = CreateBall(); + auto transform2 = m_World->GetComponent(ent2); + transform2->Position = glm::vec3(-0.f, 0.26f, -10.f); + transform2->Velocity = glm::vec3(0.0f, -10.f, 0.f); + + m_World->CommitEntity(ent2); + } for (int i = 0; i < Lives(); i++) { CreateLife(i); @@ -52,10 +68,30 @@ void dd::Systems::BallSystem::Update(double dt) Events::GameOver e; EventBroker->Publish(e); } + + /* if (HitLag()) { + m_HitLagTimer += 0.1 * dt; + if (Pause()) { + if (m_HitLagTimer > 1) { + SetPause(false); + m_HitLagTimer = 0; + } + } else { + if (m_HitLagTimer > m_HitLagPlacement) { + SetPause(true); + m_HitLagPlacement *= 0.9; + m_HitLagTimer = 0; + } + } + }*/ } void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { + if (Pause()) { + return; + } + auto templateCheck = m_World->GetComponent(entity); if (templateCheck != nullptr){ return; } auto ballComponent = m_World->GetComponent(entity); @@ -132,6 +168,29 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID } } +bool dd::Systems::BallSystem::OnPause(const dd::Events::Pause &event) +{ + if (Pause()) { + SetPause(false); + } else { + SetPause(true); + } + return true; +} + +bool dd::Systems::BallSystem::OnHitLag(const dd::Events::HitLag &event) +{ + if (HitLag()) { + SetHitLag(false); + } else { + SetHitLag(true); + m_Time = event.Time; + m_SlowdownTime = event.SlowdownTime; + m_HitLagTimer = m_SlowdownTime; + } + return true; +} + void dd::Systems::BallSystem::OnEntityCommit(EntityID entity) { diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index d8c1765..4696491 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -16,6 +16,7 @@ void dd::Systems::LevelSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EMultiBallLost, &LevelSystem::OnMultiBallLost); EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, &LevelSystem::OnPowerUpTaken); EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &LevelSystem::OnStageCleared); + EVENT_SUBSCRIBE_MEMBER(m_EPause, &LevelSystem::OnPause); return; } @@ -30,6 +31,9 @@ void dd::Systems::LevelSystem::Update(double dt) void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { + if (Pause()) { + return; + } auto templateCheck = m_World->GetComponent(entity); if (templateCheck != nullptr){ return; } @@ -71,6 +75,16 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID } } +bool dd::Systems::LevelSystem::OnPause(const dd::Events::Pause &event) +{ + if (Pause()) { + SetPause(false); + } else { + SetPause(true); + } + return true; +} + void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 spacesBetweenBricks, float spaceToEdge) { SetNumberOfBricks(rows * lines); diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index 34e5bb9..887d6a2 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_EPause, &PadSystem::OnPause); { auto ent = m_World->CreateEntity(); @@ -58,6 +59,9 @@ void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID p void dd::Systems::PadSystem::Update(double dt) { + if (Pause()) { + 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") { @@ -105,6 +109,16 @@ void dd::Systems::PadSystem::Update(double dt) return; } +bool dd::Systems::PadSystem::OnPause(const dd::Events::Pause &event) +{ + if (Pause()) { + SetPause(false); + } else { + SetPause(true); + } + return true; +} + bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) { int val = event.KeyCode; @@ -127,6 +141,18 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) Events::MultiBall e; e.padTransform = Transform(); EventBroker->Publish(e); + } else if (val == GLFW_KEY_P) { + Events::Pause e; + e.Time = 0; + e.SlowdownTime = 0; + e.Type = "All"; + EventBroker->Publish(e); + } else if (val == GLFW_KEY_H) { + Events::HitLag e; + e.Time = 0.3; + e.SlowdownTime = 10; + e.Type = "All"; + EventBroker->Publish(e); } else if (val == GLFW_KEY_D) { return false; } diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index c425b5f..f8a2d4e 100644 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -25,6 +25,8 @@ void dd::Systems::PhysicsSystem::Initialize() InitializeWater(); EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, &PhysicsSystem::SetImpulse); + EVENT_SUBSCRIBE_MEMBER(m_EPause, &PhysicsSystem::OnPause); + EVENT_SUBSCRIBE_MEMBER(m_EHitLag, &PhysicsSystem::OnHitLag); } void dd::Systems::PhysicsSystem::InitializeWater() @@ -60,6 +62,19 @@ bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) void dd::Systems::PhysicsSystem::Update(double dt) { + if (Pause()) { + if (HitLag()) { + m_HitLagTimer += dt; + std::cout << m_HitLagTimer << std::endl; + if (m_HitLagPlacement < m_HitLagTimer) { + m_HitLagTimer = 0; + SetHitLag(false); + Events::Pause e; + EventBroker->Publish(e); + } + } + return; + } m_Accumulator += dt; while(m_Accumulator >= m_TimeStep) @@ -173,6 +188,27 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity } +bool dd::Systems::PhysicsSystem::OnPause(const dd::Events::Pause &event) +{ + if (Pause()) { + SetPause(false); + } else { + SetPause(true); + } + return true; +} + +bool dd::Systems::PhysicsSystem::OnHitLag(const dd::Events::HitLag &event) +{ + SetHitLag(true); + Events::Pause e; + EventBroker->Publish(e); + m_HitLagPlacement = event.Time + 10; + m_SlowdownTime = event.SlowdownTime; + m_HitLagTimer = m_SlowdownTime; + return true; +} + void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) { auto physicsComponent = m_World->GetComponent(entity); From c63ec035a707051ee4d66e5c17d7449032c8af93 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Wed, 30 Sep 2015 16:42:35 +0200 Subject: [PATCH 2/6] HitLagSystem implemented. --- include/Core/Engine.h | 4 ++ include/Game/BallSystem.h | 13 +---- include/Game/HitLagSystem.h | 83 ++++++++++++++++++++++++++++++ include/Game/LevelSystem.h | 2 +- include/Game/PadSystem.h | 2 +- include/Physics/PhysicsSystem.h | 13 +---- src/game/Game/BallSystem.cpp | 34 +----------- src/game/Game/HitLagSystem.cpp | 48 +++++++++++++++++ src/game/Game/LevelSystem.cpp | 4 +- src/game/Game/PadSystem.cpp | 8 +-- src/game/Physics/PhysicsSystem.cpp | 26 +--------- 11 files changed, 147 insertions(+), 90 deletions(-) create mode 100644 include/Game/HitLagSystem.h create mode 100644 src/game/Game/HitLagSystem.cpp diff --git a/include/Core/Engine.h b/include/Core/Engine.h index 38142a7..c07919b 100644 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -45,6 +45,7 @@ #include "Game/CPad.h" #include "Game/CBrick.h" #include "Game/BallSystem.h" +#include "Game/HitLagSystem.h" #include "Game/Bricks/CPowerUpBrick.h" #include "Physics/PhysicsSystem.h" @@ -120,6 +121,9 @@ public: m_World->SystemFactory.Register( [this]() { return new Systems::BallSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::HitLagSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); m_World->SystemFactory.Register( [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); diff --git a/include/Game/BallSystem.h b/include/Game/BallSystem.h index c0e94fe..f56a08a 100644 --- a/include/Game/BallSystem.h +++ b/include/Game/BallSystem.h @@ -21,7 +21,6 @@ #include "Game/EMultiBallLost.h" #include "Game/EGameOver.h" #include "Game/EPause.h" -#include "Game/EHitLag.h" namespace dd { @@ -77,10 +76,8 @@ public: void SetReplaceBall(const bool& replaceBall) { m_ReplaceBall = replaceBall; } bool MultiBall() const { return m_MultiBall; } void SetMultiBall(const bool& multiBall) { m_MultiBall = multiBall; } - bool Pause() const { return m_Pause; } + bool IsPaused() const { return m_Pause; } void SetPause(const bool& pause) { m_Pause = pause; } - bool HitLag() const { return m_HitLag; } - void SetHitLag(const bool& hitLag) { m_HitLag = hitLag; } private: float m_XMovementMultiplier = 2.f; @@ -93,12 +90,6 @@ private: bool m_MultiBall = false; bool m_Pause = false; - bool m_HitLag = false; - float m_Time; - float m_SlowdownTime; - float m_HitLagTimer = 0; - float m_HitLagPlacement = 0; - EntityID m_Ball; dd::EventRelay m_ELifeLost; @@ -106,14 +97,12 @@ private: dd::EventRelay m_EResetBall; dd::EventRelay m_EMultiBall; dd::EventRelay m_EPause; - dd::EventRelay m_EHitLag; bool OnLifeLost(const dd::Events::LifeLost &event); bool OnMultiBallLost(const dd::Events::MultiBallLost &event); bool OnResetBall(const dd::Events::ResetBall &event); bool OnMultiBall(const dd::Events::MultiBall &event); bool OnPause(const dd::Events::Pause &event); - bool OnHitLag(const dd::Events::HitLag &event); }; } diff --git a/include/Game/HitLagSystem.h b/include/Game/HitLagSystem.h new file mode 100644 index 0000000..8367dd6 --- /dev/null +++ b/include/Game/HitLagSystem.h @@ -0,0 +1,83 @@ +// +// Created by Adniklastrator on 2015-09-30. +// + +#ifndef DAYDREAM_HITLAGSYSTEM_H +#define DAYDREAM_HITLAGSYSTEM_H + + +#include "Core/System.h" +#include "Core/CTransform.h" +#include "Core/CTemplate.h" +#include "Core/EventBroker.h" +#include "Core/World.h" +#include "Rendering/CSprite.h" +#include "Rendering/CModel.h" +#include "Game/CBrick.h" +#include "Game/CBall.h" +#include "Game/CLife.h" +#include "Game/CPowerUp.h" +#include "Game/EStageCleared.h" +#include "Game/ELifeLost.h" +#include "Game/EResetBall.h" +#include "Game/EScoreEvent.h" +#include "Game/EComboEvent.h" +#include "Game/EMultiBall.h" +#include "Game/EMultiBallLost.h" +#include "Game/EPause.h" +#include "Game/EHitLag.h" +#include "Game/EGameOver.h" +#include "Game/ECreatePowerUp.h" +#include "Game/EPowerUpTaken.h" +#include "Game/Bricks/CPowerUpBrick.h" +#include "Physics/CPhysics.h" +#include "Physics/CCircleShape.h" +#include "Physics/CRectangleShape.h" +#include "Physics/ESetImpulse.h" +#include "Physics/EContact.h" +#include "Sound/CCollisionSound.h" +#include "Game/PadSystem.h" +#include +#include + + +namespace dd +{ + +namespace Systems +{ + +class HitLagSystem : public System +{ +public: + HitLagSystem(World* world, std::shared_ptr eventBroker) + : System(world, eventBroker) + { } + + void Initialize() override; + + void Update(double dt) override; + + bool IsPaused() const { return m_Pause; } + void SetPause(const bool& pause) { m_Pause = pause; } + bool HitLag() const { return m_HitLag; } + void SetHitLag(const bool& hitLag) { m_HitLag = hitLag; } +private: + bool m_Pause; + bool m_HitLag; + float m_HitLagDuration; + float m_HitLagTimer; + + dd::EventRelay m_EPause; + dd::EventRelay m_EHitLag; + + bool OnPause(const dd::Events::Pause &event); + bool OnHitLag(const dd::Events::HitLag &event); + +}; + +} + +} + +#endif //DAYDREAM_HITLAGSYSTEM_H diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index f8b4603..67131c6 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -81,7 +81,7 @@ public: void SetRestarting(const bool& restarting) { m_Restarting = restarting; } bool Initialized() const { return m_Initialized; } void SetInitialized(const bool& initialized) { m_Initialized = initialized; } - bool Pause() const { return m_Pause; } + bool IsPaused() const { return m_Pause; } void SetPause(const bool& pause) { m_Pause = pause; } int& MultiBalls() { return m_MultiBalls; } void SetMultiBalls(const int& multiBalls) { m_MultiBalls = multiBalls; } diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index 9328972..ef76104 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -65,7 +65,7 @@ public: Components::Pad* Pad() const { return m_Pad; } void SetPad(Components::Pad* pad) { m_Pad = pad; } - bool Pause() const { return m_Pause; } + bool IsPaused() const { return m_Pause; } void SetPause(const bool& pause) { m_Pause = pause; } private: diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index 4f9a8ef..c970eb0 100644 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -14,7 +14,6 @@ #include "Physics/EContact.h" #include "Physics/ESetImpulse.h" #include "Game/EPause.h" -#include "Game/EHitLag.h" #include "Game/CPad.h" #include "Game/CBall.h" #include "Transform/TransformSystem.h" @@ -56,10 +55,8 @@ public: // Called when an entity is removed void OnEntityRemoved(EntityID entity) override; - bool Pause() const { return m_Pause; } + bool IsPaused() const { return m_Pause; } void SetPause(const bool& pause) { m_Pause = pause; } - bool HitLag() const { return m_HitLag; } - void SetHitLag(const bool& hitLag) { m_HitLag = hitLag; } private: b2Vec2 m_Gravity; @@ -68,16 +65,8 @@ private: double m_Accumulator; bool m_Pause = false; - bool m_HitLag = false; - float m_Time; - float m_SlowdownTime; - float m_HitLagTimer = 0; - float m_HitLagPlacement = 0; - dd::EventRelay m_EPause; - dd::EventRelay m_EHitLag; bool OnPause(const dd::Events::Pause &event); - bool OnHitLag(const dd::Events::HitLag &event); int m_VelocityIterations, m_PositionIterations; diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index d7d264d..84e103e 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -19,7 +19,6 @@ void dd::Systems::BallSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &BallSystem::OnResetBall); EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &BallSystem::OnMultiBall); EVENT_SUBSCRIBE_MEMBER(m_EPause, &BallSystem::OnPause); - EVENT_SUBSCRIBE_MEMBER(m_EHitLag, &BallSystem::OnHitLag); //OctoBall { @@ -68,27 +67,11 @@ void dd::Systems::BallSystem::Update(double dt) Events::GameOver e; EventBroker->Publish(e); } - - /* if (HitLag()) { - m_HitLagTimer += 0.1 * dt; - if (Pause()) { - if (m_HitLagTimer > 1) { - SetPause(false); - m_HitLagTimer = 0; - } - } else { - if (m_HitLagTimer > m_HitLagPlacement) { - SetPause(true); - m_HitLagPlacement *= 0.9; - m_HitLagTimer = 0; - } - } - }*/ } void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { - if (Pause()) { + if (IsPaused()) { return; } @@ -170,7 +153,7 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID bool dd::Systems::BallSystem::OnPause(const dd::Events::Pause &event) { - if (Pause()) { + if (IsPaused()) { SetPause(false); } else { SetPause(true); @@ -178,19 +161,6 @@ bool dd::Systems::BallSystem::OnPause(const dd::Events::Pause &event) return true; } -bool dd::Systems::BallSystem::OnHitLag(const dd::Events::HitLag &event) -{ - if (HitLag()) { - SetHitLag(false); - } else { - SetHitLag(true); - m_Time = event.Time; - m_SlowdownTime = event.SlowdownTime; - m_HitLagTimer = m_SlowdownTime; - } - return true; -} - void dd::Systems::BallSystem::OnEntityCommit(EntityID entity) { diff --git a/src/game/Game/HitLagSystem.cpp b/src/game/Game/HitLagSystem.cpp new file mode 100644 index 0000000..92deb9a --- /dev/null +++ b/src/game/Game/HitLagSystem.cpp @@ -0,0 +1,48 @@ +// +// Created by Adniklastrator on 2015-09-30. +// + +#include "PrecompiledHeader.h" +#include "Game/HitLagSystem.h" + +void dd::Systems::HitLagSystem::Initialize() +{ + EVENT_SUBSCRIBE_MEMBER(m_EPause, &HitLagSystem::OnPause); + EVENT_SUBSCRIBE_MEMBER(m_EHitLag, &HitLagSystem::OnHitLag); +} + +void dd::Systems::HitLagSystem::Update(double dt) +{ + if (IsPaused()) { + if (HitLag()) { + m_HitLagTimer += dt; + std::cout << m_HitLagTimer << std::endl; + if (m_HitLagDuration < m_HitLagTimer) { + m_HitLagTimer = 0; + SetHitLag(false); + Events::Pause e; + EventBroker->Publish(e); + } + } + return; + } +} + +bool dd::Systems::HitLagSystem::OnPause(const dd::Events::Pause &event) +{ + if (IsPaused()) { + SetPause(false); + } else { + SetPause(true); + } + return true; +} + +bool dd::Systems::HitLagSystem::OnHitLag(const dd::Events::HitLag &event) +{ + SetHitLag(true); + Events::Pause e; + EventBroker->Publish(e); + m_HitLagDuration = event.Time; + return true; +} \ No newline at end of file diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index 4696491..c85132a 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -31,7 +31,7 @@ void dd::Systems::LevelSystem::Update(double dt) void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { - if (Pause()) { + if (IsPaused()) { return; } auto templateCheck = m_World->GetComponent(entity); @@ -77,7 +77,7 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID bool dd::Systems::LevelSystem::OnPause(const dd::Events::Pause &event) { - if (Pause()) { + if (IsPaused()) { SetPause(false); } else { SetPause(true); diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index 887d6a2..becb0f6 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -59,7 +59,7 @@ void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID p void dd::Systems::PadSystem::Update(double dt) { - if (Pause()) { + if (IsPaused()) { return; } if (Entity() == 0) { @@ -111,7 +111,7 @@ void dd::Systems::PadSystem::Update(double dt) bool dd::Systems::PadSystem::OnPause(const dd::Events::Pause &event) { - if (Pause()) { + if (IsPaused()) { SetPause(false); } else { SetPause(true); @@ -143,14 +143,10 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) EventBroker->Publish(e); } else if (val == GLFW_KEY_P) { Events::Pause e; - e.Time = 0; - e.SlowdownTime = 0; - e.Type = "All"; EventBroker->Publish(e); } else if (val == GLFW_KEY_H) { Events::HitLag e; e.Time = 0.3; - e.SlowdownTime = 10; e.Type = "All"; EventBroker->Publish(e); } else if (val == GLFW_KEY_D) { diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index f8a2d4e..b0bd283 100644 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -26,7 +26,6 @@ void dd::Systems::PhysicsSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, &PhysicsSystem::SetImpulse); EVENT_SUBSCRIBE_MEMBER(m_EPause, &PhysicsSystem::OnPause); - EVENT_SUBSCRIBE_MEMBER(m_EHitLag, &PhysicsSystem::OnHitLag); } void dd::Systems::PhysicsSystem::InitializeWater() @@ -62,17 +61,7 @@ bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) void dd::Systems::PhysicsSystem::Update(double dt) { - if (Pause()) { - if (HitLag()) { - m_HitLagTimer += dt; - std::cout << m_HitLagTimer << std::endl; - if (m_HitLagPlacement < m_HitLagTimer) { - m_HitLagTimer = 0; - SetHitLag(false); - Events::Pause e; - EventBroker->Publish(e); - } - } + if (IsPaused()) { return; } @@ -190,7 +179,7 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity bool dd::Systems::PhysicsSystem::OnPause(const dd::Events::Pause &event) { - if (Pause()) { + if (IsPaused()) { SetPause(false); } else { SetPause(true); @@ -198,17 +187,6 @@ bool dd::Systems::PhysicsSystem::OnPause(const dd::Events::Pause &event) return true; } -bool dd::Systems::PhysicsSystem::OnHitLag(const dd::Events::HitLag &event) -{ - SetHitLag(true); - Events::Pause e; - EventBroker->Publish(e); - m_HitLagPlacement = event.Time + 10; - m_SlowdownTime = event.SlowdownTime; - m_HitLagTimer = m_SlowdownTime; - return true; -} - void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) { auto physicsComponent = m_World->GetComponent(entity); From 4d3428f125d7cc768b493955a4b6535c9d22c447 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Thu, 1 Oct 2015 14:14:07 +0200 Subject: [PATCH 3/6] HitLag has types in strings to send along to affect what systems lag. --- include/Core/Engine.h | 14 ++++++++------ include/Game/BallSystem.h | 3 +++ include/Game/CBall.h | 2 ++ include/Game/EPause.h | 2 +- include/Game/HitLagSystem.h | 8 ++++++++ src/game/Game/BallSystem.cpp | 27 +++++++++++++++++++++++++-- src/game/Game/HitLagSystem.cpp | 27 ++++++++++++++++++--------- src/game/Game/LevelSystem.cpp | 4 ++++ src/game/Game/PadSystem.cpp | 7 ++++++- src/game/Physics/PhysicsSystem.cpp | 4 ++++ 10 files changed, 79 insertions(+), 19 deletions(-) diff --git a/include/Core/Engine.h b/include/Core/Engine.h index c07919b..bf10872 100644 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -183,10 +183,12 @@ public: //Water test { + float amount = 1.5f; + auto t_waterBody = m_World->CreateEntity(); auto transform = m_World->AddComponent(t_waterBody); - transform->Position = glm::vec3(0.f, -5.5f, -10.f); - transform->Scale = glm::vec3(7.f, 1.5f, 1.f); + transform->Position = glm::vec3(0.f, -6.25f + (amount / 2), -10.f); + transform->Scale = glm::vec3(7.f, amount, 1.f); auto water = m_World->AddComponent(t_waterBody); auto body = m_World->AddComponent(t_waterBody); m_World->CommitEntity(t_waterBody); @@ -235,7 +237,7 @@ public: // m_World->CommitEntity(topWall); // } - { + /*{ auto topWall = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent( topWall); @@ -254,14 +256,14 @@ public: physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; m_World->CommitEntity(topWall); - } + }*/ { auto leftWall = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent( leftWall); transform->Position = glm::vec3(-4.f, 1.f, -10.f); - transform->Scale = glm::vec3(0.5f, 20.f, 1.f); + transform->Scale = glm::vec3(0.5f, 35.f, 1.f); std::shared_ptr sprite = m_World->AddComponent(leftWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; @@ -282,7 +284,7 @@ public: std::shared_ptr transform = m_World->AddComponent( rightWall); transform->Position = glm::vec3(4.f, 1.f, -10.f); - transform->Scale = glm::vec3(0.5f, 20.f, 1.f); + transform->Scale = glm::vec3(0.5f, 35.f, 1.f); std::shared_ptr sprite = m_World->AddComponent(rightWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; diff --git a/include/Game/BallSystem.h b/include/Game/BallSystem.h index f56a08a..95dfad6 100644 --- a/include/Game/BallSystem.h +++ b/include/Game/BallSystem.h @@ -90,6 +90,9 @@ private: bool m_MultiBall = false; bool m_Pause = false; + glm::vec3 m_SavedSpeed; + bool m_InitializePause = false; + EntityID m_Ball; dd::EventRelay m_ELifeLost; diff --git a/include/Game/CBall.h b/include/Game/CBall.h index 5dd1405..fbf720a 100644 --- a/include/Game/CBall.h +++ b/include/Game/CBall.h @@ -18,6 +18,8 @@ struct Ball : Component int Number = 0; float Speed = 5.f; int Combo = 0; + bool Paused = false; + glm::vec3 SavedSpeed = glm::vec3(0, 0, 0); }; } diff --git a/include/Game/EPause.h b/include/Game/EPause.h index b6d2505..ab27306 100644 --- a/include/Game/EPause.h +++ b/include/Game/EPause.h @@ -15,7 +15,7 @@ namespace Events struct Pause : Event { - + std::string Type; }; } diff --git a/include/Game/HitLagSystem.h b/include/Game/HitLagSystem.h index 8367dd6..2d9fa3f 100644 --- a/include/Game/HitLagSystem.h +++ b/include/Game/HitLagSystem.h @@ -57,16 +57,24 @@ public: void Initialize() override; void Update(double dt) override; + void FlipPause(); bool IsPaused() const { return m_Pause; } void SetPause(const bool& pause) { m_Pause = pause; } bool HitLag() const { return m_HitLag; } void SetHitLag(const bool& hitLag) { m_HitLag = hitLag; } + float& HitLagDuration() { return m_HitLagDuration; } + void SetHitLagDuration(const float& hitLagDuration) { m_HitLagDuration = hitLagDuration; } + float& HitLagTimer() { return m_HitLagTimer; } + void SetHitLagTimer(const float& hitLagTimer) { m_HitLagTimer = hitLagTimer; } + std::string& CurrentType() { return m_CurrentType; } + void SetCurrentType(const std::string& currentType) { m_CurrentType = currentType; } private: bool m_Pause; bool m_HitLag; float m_HitLagDuration; float m_HitLagTimer; + std::string m_CurrentType; dd::EventRelay m_EPause; dd::EventRelay m_EHitLag; diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index 84e103e..36435ba 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -71,15 +71,34 @@ void dd::Systems::BallSystem::Update(double dt) void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { + auto ballComponent = m_World->GetComponent(entity); if (IsPaused()) { + if (ballComponent != nullptr) { + auto transform = m_World->GetComponent(entity); + + if (!ballComponent->Paused) { + ballComponent->Paused = true; + ballComponent->SavedSpeed = transform->Velocity; + transform->Velocity = glm::vec3(0, 0, 0); + } + } return; + } else { + if (ballComponent != nullptr) { + auto transform = m_World->GetComponent(entity); + + if (ballComponent->Paused) { + transform->Velocity = ballComponent->SavedSpeed; + ballComponent->Paused = false; + } + } } auto templateCheck = m_World->GetComponent(entity); if (templateCheck != nullptr){ return; } - auto ballComponent = m_World->GetComponent(entity); + if (ballComponent != nullptr) { - if (ReplaceBall() == true) { + if (ReplaceBall()) { SetReplaceBall(false); auto transform = m_World->GetComponent(entity); @@ -153,6 +172,10 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID bool dd::Systems::BallSystem::OnPause(const dd::Events::Pause &event) { + if (event.Type != "BallSystem" && event.Type != "All") { + return false; + } + if (IsPaused()) { SetPause(false); } else { diff --git a/src/game/Game/HitLagSystem.cpp b/src/game/Game/HitLagSystem.cpp index 92deb9a..da2b25f 100644 --- a/src/game/Game/HitLagSystem.cpp +++ b/src/game/Game/HitLagSystem.cpp @@ -15,19 +15,25 @@ void dd::Systems::HitLagSystem::Update(double dt) { if (IsPaused()) { if (HitLag()) { - m_HitLagTimer += dt; - std::cout << m_HitLagTimer << std::endl; - if (m_HitLagDuration < m_HitLagTimer) { - m_HitLagTimer = 0; + SetHitLagTimer(HitLagTimer() += dt); + std::cout << HitLagTimer() << std::endl; + if (HitLagDuration() < HitLagTimer()) { + SetHitLagTimer(0); SetHitLag(false); - Events::Pause e; - EventBroker->Publish(e); + FlipPause(); } } return; } } +void dd::Systems::HitLagSystem::FlipPause() +{ + Events::Pause e; + e.Type = CurrentType(); + EventBroker->Publish(e); +} + bool dd::Systems::HitLagSystem::OnPause(const dd::Events::Pause &event) { if (IsPaused()) { @@ -40,9 +46,12 @@ bool dd::Systems::HitLagSystem::OnPause(const dd::Events::Pause &event) bool dd::Systems::HitLagSystem::OnHitLag(const dd::Events::HitLag &event) { + if (HitLag()) { + FlipPause(); + } SetHitLag(true); - Events::Pause e; - EventBroker->Publish(e); - m_HitLagDuration = event.Time; + SetCurrentType(event.Type); + FlipPause(); + SetHitLagDuration(event.Time); return true; } \ No newline at end of file diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index c85132a..c411701 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -77,6 +77,10 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID bool dd::Systems::LevelSystem::OnPause(const dd::Events::Pause &event) { + if (event.Type != "LevelSystem" && event.Type != "All") { + return false; + } + if (IsPaused()) { SetPause(false); } else { diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index becb0f6..1eb5744 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -111,6 +111,10 @@ void dd::Systems::PadSystem::Update(double dt) bool dd::Systems::PadSystem::OnPause(const dd::Events::Pause &event) { + if (event.Type != "PadSystem" && event.Type != "All") { + return false; + } + if (IsPaused()) { SetPause(false); } else { @@ -143,10 +147,11 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) EventBroker->Publish(e); } else if (val == GLFW_KEY_P) { Events::Pause e; + e.Type = "All"; EventBroker->Publish(e); } else if (val == GLFW_KEY_H) { Events::HitLag e; - e.Time = 0.3; + e.Time = 0.2; e.Type = "All"; EventBroker->Publish(e); } else if (val == GLFW_KEY_D) { diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index b0bd283..effdfa4 100644 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -179,6 +179,10 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity bool dd::Systems::PhysicsSystem::OnPause(const dd::Events::Pause &event) { + if (event.Type != "PhysicsSystem" && event.Type != "All") { + return false; + } + if (IsPaused()) { SetPause(false); } else { From 56086d60615fdddecd1c043219f8ded35eb09bd3 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Mon, 5 Oct 2015 16:35:37 +0200 Subject: [PATCH 4/6] Implemented GetNextLevel function with hard-coded levels. --- include/Game/BallSystem.h | 1 + include/Game/EHitPad.h | 21 ++++ include/Game/LevelSystem.h | 30 +++-- src/game/Game/BallSystem.cpp | 28 +---- src/game/Game/LevelSystem.cpp | 215 ++++++++++++++++++++++++---------- src/game/Game/PadSystem.cpp | 3 - 6 files changed, 195 insertions(+), 103 deletions(-) create mode 100644 include/Game/EHitPad.h diff --git a/include/Game/BallSystem.h b/include/Game/BallSystem.h index 95dfad6..682b1c9 100644 --- a/include/Game/BallSystem.h +++ b/include/Game/BallSystem.h @@ -21,6 +21,7 @@ #include "Game/EMultiBallLost.h" #include "Game/EGameOver.h" #include "Game/EPause.h" +#include "Game/EHitPad.h" namespace dd { diff --git a/include/Game/EHitPad.h b/include/Game/EHitPad.h new file mode 100644 index 0000000..573f8ef --- /dev/null +++ b/include/Game/EHitPad.h @@ -0,0 +1,21 @@ +// +// Created by Administrator on 2015-10-05. +// + +#ifndef DAYDREAM_EHITPAD_H +#define DAYDREAM_EHITPAD_H + +#include "Core/EventBroker.h" + +namespace dd +{ +namespace Events +{ +struct HitPad : Event +{ + +}; +} +} + +#endif //DAYDREAM_EHITPAD_H diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index 67131c6..805c546 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -21,6 +21,7 @@ #include "Game/EResetBall.h" #include "Game/EScoreEvent.h" #include "Game/EComboEvent.h" +#include "Game/EHitPad.h" #include "Game/EMultiBall.h" #include "Game/EMultiBallLost.h" #include "Game/EPause.h" @@ -45,15 +46,15 @@ namespace Systems { // Me trying things out. -class Level +/*class Level { public: - int levelRows; - int levelLines; - int levelSpaceBetweenBricks; - int levelSpaceToEdge; - int bricks[]; -}; + int levelRows = 6; + int levelLines = 7; + glm::vec2 levelSpaceBetweenBricks = glm::vec2(1, 0.4); + float levelSpaceToEdge = 0.25f; + std::array bricks; +};*/ class LevelSystem : public System { @@ -65,10 +66,8 @@ public: void Initialize() override; void CreateBasicLevel(int, int, glm::vec2, float); - void SaveLevel(int, int, glm::vec2, int); // Shouldn't be here, but I'm experimenting. - void LoadLevel(char[20]); - void CreateBrick(int, int, glm::vec2, float, int); - void ProcessCollision(); + void CreateLevel(); + void CreateBrick(int, int, glm::vec2, float, int, int); void OnEntityRemoved(EntityID entity); @@ -104,9 +103,12 @@ public: void SetNotResettingTheStage(const float& notResettingTheStage) { m_NotResettingTheStage = notResettingTheStage; } private: + bool m_Cleared = false; bool m_Restarting = false; bool m_Initialized = false; bool m_Pause = false; + int m_CurrentCluster = 2; + int m_CurrentLevel = 1; int m_MultiBalls = 0; int m_PowerUps = 0; int m_Score = 0; @@ -117,6 +119,8 @@ private: glm::vec2 m_SpaceBetweenBricks = glm::vec2(1, 0.4); float m_NotResettingTheStage = 5.f; + std::array m_Bricks; + dd::EventRelay m_EContact; dd::EventRelay m_EScoreEvent; dd::EventRelay m_EMultiBall; @@ -125,6 +129,7 @@ private: dd::EventRelay m_EPowerUpTaken; dd::EventRelay m_EStageCleared; dd::EventRelay m_EPause; + dd::EventRelay m_EHitPad; bool OnContact(const dd::Events::Contact &event); bool OnScoreEvent(const dd::Events::ScoreEvent &event); @@ -134,6 +139,9 @@ private: bool OnPowerUpTaken(const dd::Events::PowerUpTaken &event); bool OnStageCleared(const dd::Events::StageCleared &event); bool OnPause(const dd::Events::Pause &event); + bool OnHitPad(const dd::Events::HitPad &event); + + void GetNextLevel(); }; } diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index 36435ba..21a32ca 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -116,10 +116,6 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID } if (transformBall->Position.y < -EdgeY() - 4) { if (MultiBalls() != 0) { -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); -// m_World->RemoveComponent(entity); m_World->RemoveEntity(entity); Events::MultiBallLost e; EventBroker->Publish(e); @@ -153,8 +149,6 @@ void dd::Systems::BallSystem::UpdateEntity(double dt, EntityID entity, EntityID auto life = m_World->GetComponent(entity); if (life != nullptr) { if (life->Number + 1 == PastLives()) { - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); m_World->RemoveEntity(entity); SetPastLives(Lives()); } @@ -236,6 +230,9 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) glm::vec2 ballVelocity = glm::vec2(ballTransform->Velocity.x, ballTransform->Velocity.y); if (m_World->GetProperty(otherEntitiy, "Name") == "Pad"){ + Events::HitPad e; + EventBroker->Publish(e); + auto padTransform = m_World->GetComponent(otherEntitiy); float x = (ballTransform->Position.x - padTransform->Position.x) * XMovementMultiplier(); @@ -263,25 +260,6 @@ EntityID dd::Systems::BallSystem::CreateBall() m_World->RemoveComponent(ent); - /* auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(0.5f, 0.26f, -10.f); - transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); - auto model = m_World->AddComponent(ent); - model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - //auto pointlight = m_World->AddComponent(ent); - std::shared_ptr circleShape = m_World->AddComponent(ent); - std::shared_ptr cball = m_World->AddComponent(ent); - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; - physics->Category = CollisionLayer::Type::Ball; - physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; - physics->Calculate = true; - cball->Speed = 5.f; - - auto plight = m_World->AddComponent(ent); - plight->Radius = 2.f;*/ - m_World->CommitEntity(ent); return ent; diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index c411701..f6b80fa 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -17,6 +17,7 @@ void dd::Systems::LevelSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, &LevelSystem::OnPowerUpTaken); EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &LevelSystem::OnStageCleared); EVENT_SUBSCRIBE_MEMBER(m_EPause, &LevelSystem::OnPause); + EVENT_SUBSCRIBE_MEMBER(m_EHitPad, &LevelSystem::OnHitPad); return; } @@ -24,7 +25,9 @@ void dd::Systems::LevelSystem::Initialize() void dd::Systems::LevelSystem::Update(double dt) { if (!m_Initialized) { - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); + //CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); + GetNextLevel(); + CreateLevel(); m_Initialized = true; } } @@ -38,36 +41,20 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID if (templateCheck != nullptr){ return; } auto ball = m_World->GetComponent(entity); - SetNotResettingTheStage(NotResettingTheStage() + 0.01 * dt); - if (NumberOfBricks() <= 0 && Restarting() == false) { + if (NumberOfBricks() <= 0 && !Restarting()) { if (MultiBalls() <= 0 && PowerUps() <= 0) { - if (NotResettingTheStage() > 5) { - SetRestarting(true); - Events::ResetBall e; - EventBroker->Publish(e); - Events::ScoreEvent es; - es.Score = 500; - EventBroker->Publish(es); - Events::StageCleared ec; - EventBroker->Publish(ec); - SetNotResettingTheStage(0); - //CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); - } + Events::StageCleared ec; + EventBroker->Publish(ec); + //CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); } else { if (ball != nullptr && MultiBalls() > 0) { SetMultiBalls(MultiBalls()-1); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); m_World->RemoveEntity(entity); } else { auto powerUp = m_World->GetComponent(entity); if (powerUp != nullptr) { SetPowerUps(PowerUps() - 1); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); m_World->RemoveEntity(entity); } } @@ -97,7 +84,7 @@ void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 s for (int i = 0; i < rows; i++) { num--; for (int j = 0; j < Lines(); j++) { - CreateBrick(i, j, spacesBetweenBricks, spaceToEdge, num); + CreateBrick(i, j, spacesBetweenBricks, spaceToEdge, num, 1); } if (num == 1) num = Lines(); @@ -108,8 +95,31 @@ void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 s return; } -void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBetweenBricks, float spaceToEdge, int num) +void dd::Systems::LevelSystem::CreateLevel() { + std::cout << "Loading level: " << m_CurrentLevel << std::endl; + SetNumberOfBricks(Rows() * Lines()); + int num = Lines(); + int getter = 0; + + for (int i = 0; i < Rows(); i++) { + num--; + for (int j = 0; j < Lines(); j++) { + CreateBrick(i, j, SpaceBetweenBricks(), SpaceToEdge(), num, m_Bricks[getter]); + getter++; + } + if (num == 1) + num = Lines(); + } + SetRestarting(false); +} + +void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBetweenBricks, float spaceToEdge, int num, int typeInt) +{ + if (typeInt == 0) { + SetNumberOfBricks(NumberOfBricks() - 1); + return; + } auto brick = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(brick); auto model = m_World->AddComponent(brick); @@ -121,12 +131,11 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe cPhys->Category = CollisionLayer::Type::Brick; cPhys->Mask = CollisionLayer::Type::Ball; - /*std::string fileName = "Textures/Bricks/"; - fileName.append(std::to_string(num)); - fileName.append(".png");*/ - //sprite->SpriteFile = fileName; model->ModelFile = "Models/Test/Brick/Brick.obj"; - if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 5 && row == 2)) { + /*if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 5 && row == 2)) { + std::shared_ptr cPow = m_World->AddComponent(brick); + }*/ + if (typeInt == 2) { std::shared_ptr cPow = m_World->AddComponent(brick); } float x = line * spacesBetweenBricks.x; @@ -143,25 +152,9 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe 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 != nullptr) { - SetNumberOfBricks(NumberOfBricks() - 1); - Events::ScoreEvent es; - es.Score = brick->Score; - EventBroker->Publish(es); - if (numberOfBricks < 1) { - EndLevel(); - } - } - return;*/ + } bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) @@ -204,7 +197,7 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) EventBroker->Publish(e); } - if (ball != nullptr && Restarting() == false) { + if (!Restarting()) { ball->Combo += 1; Events::ComboEvent ec; ec.Combo = ball->Combo; @@ -213,12 +206,6 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) auto ballTransform = m_World->GetComponent(entityBall); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveComponent(entityBrick); -// m_World->RemoveEntity(entityBrick); - auto physicsComponent = m_World->GetComponent(entityBrick); physicsComponent->GravityScale = 1.f; physicsComponent->Mask = CollisionLayer::Type::Water | CollisionLayer::Type::Wall; @@ -239,17 +226,14 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) SetNumberOfBricks(NumberOfBricks() - 1); - if (NumberOfBricks() <= 0) { - //SetMultiBalls(MultiBalls() + 1); - } Events::ScoreEvent es; es.Score = brick->Score * ball->Combo; EventBroker->Publish(es); - std::cout << "Combo: " << ball->Combo << std::endl; + //std::cout << "Combo: " << ball->Combo << std::endl; //std::cout << NumberOfBricks() << std::endl; //std::cout << "Brick Score: " << brick->Score << std::endl; - std::cout << "Score: " << Score() << std::endl; + //std::cout << "Score: " << Score() << std::endl; } return true; @@ -265,14 +249,12 @@ bool dd::Systems::LevelSystem::OnScoreEvent(const dd::Events::ScoreEvent &event) bool dd::Systems::LevelSystem::OnMultiBall(const dd::Events::MultiBall &event) { SetMultiBalls(MultiBalls()+2); - std::cout << MultiBalls() << std::endl; return true; } bool dd::Systems::LevelSystem::OnMultiBallLost(const dd::Events::MultiBallLost &event) { SetMultiBalls(MultiBalls()-1); - std::cout << MultiBalls() << std::endl; return true; } @@ -290,7 +272,6 @@ bool dd::Systems::LevelSystem::OnCreatePowerUp(const dd::Events::CreatePowerUp & std::shared_ptr cPow = m_World->AddComponent(powerUp); - transform->Position = event.Position; transform->Scale = glm::vec3(0.2, 0.2, 0.2); transform->Velocity = glm::vec3(0, -4, 0); @@ -310,13 +291,119 @@ bool dd::Systems::LevelSystem::OnPowerUpTaken(const dd::Events::PowerUpTaken &ev bool dd::Systems::LevelSystem::OnStageCleared(const dd::Events::StageCleared &event) { + if (!m_Cleared) { + m_Cleared = true; + SetRestarting(true); + Events::ResetBall e; + EventBroker->Publish(e); + Events::ScoreEvent es; + es.Score = 500; + EventBroker->Publish(es); + m_CurrentLevel++; + if (m_CurrentLevel < 6) { + GetNextLevel(); + CreateLevel(); + } + } return true; } -void dd::Systems::LevelSystem::EndLevel() +void dd::Systems::LevelSystem::GetNextLevel() { - Events::StageCleared e; - EventBroker->Publish(e); - return; + std::array level; + if (m_CurrentCluster == 1) { + if (m_CurrentLevel == 1) { + level = + {0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0}; + } else if (m_CurrentLevel == 2) { + level = + {1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0}; + } else if (m_CurrentLevel == 3) { + level = + {0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0}; + } else if (m_CurrentLevel == 4) { + level = + {0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0}; + } else if (m_CurrentLevel == 5) { + level = + {0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1}; + } + } else if (m_CurrentCluster == 2) { + if (m_CurrentLevel == 1) { + level = + {1, 1, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 2, 1, 2, 1, + 1, 1, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 1}; + } else if (m_CurrentLevel == 2) { + level = + {1, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 1, 0, + 0, 0, 2, 2, 2, 0, 0, + 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0}; + } else if (m_CurrentLevel == 3) { + level = + {2, 0, 0, 0, 0, 0, 2, + 0, 1, 0, 0, 0, 1, 0, + 1, 2, 1, 1, 1, 2, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 1, 1, 1, 0, 1}; + } else if (m_CurrentLevel == 4) { + level = + {1, 2, 1, 1, 1, 2, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 2, 1, 1, 1, 2, 1, + 1, 0, 1, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 0, 1, + 0, 1, 1, 0, 1, 1, 0}; + } else if (m_CurrentLevel == 5) { + level = + {1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, + 2, 0, 1, 0, 1, 0, 2, + 0, 1, 0, 2, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0}; + } + } else if (m_CurrentCluster == 3) { + + } + + std::copy(std::begin(level), std::end(level), std::begin(m_Bricks)); } +bool dd::Systems::LevelSystem::OnHitPad(const dd::Events::HitPad &event) +{ + m_Cleared = false; + return true; +} \ No newline at end of file diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index 1eb5744..4fe3b6b 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -252,9 +252,6 @@ bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) return false; } -// m_World->RemoveComponent(entityPower); -// m_World->RemoveComponent(entityPower); -// m_World->RemoveComponent(entityPower); m_World->RemoveEntity(entityPower); Events::PowerUpTaken ep; ep.Name = "Something"; From a8219e2129d49526f73c5c8cb4bfce28b8fabd64 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Mon, 5 Oct 2015 17:55:02 +0200 Subject: [PATCH 5/6] Doesn't work right now. Cloning bricks kills makes balls stop bouncing on them. --- include/Game/LevelSystem.h | 3 ++ src/game/Game/LevelSystem.cpp | 66 ++++++++++++++++++++++++++++++----- 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index 805c546..8f1720c 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -107,6 +107,7 @@ private: bool m_Restarting = false; bool m_Initialized = false; bool m_Pause = false; + int m_LooseBricks = 0; int m_CurrentCluster = 2; int m_CurrentLevel = 1; int m_MultiBalls = 0; @@ -119,6 +120,8 @@ private: glm::vec2 m_SpaceBetweenBricks = glm::vec2(1, 0.4); float m_NotResettingTheStage = 5.f; + EntityID m_BrickTemplate; + std::array m_Bricks; dd::EventRelay m_EContact; diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index f6b80fa..de9c2f6 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -19,6 +19,32 @@ void dd::Systems::LevelSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EPause, &LevelSystem::OnPause); EVENT_SUBSCRIBE_MEMBER(m_EHitPad, &LevelSystem::OnHitPad); + m_BrickTemplate = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(m_BrickTemplate); + auto model = m_World->AddComponent(m_BrickTemplate); + std::shared_ptr cBrick = m_World->AddComponent(m_BrickTemplate); + std::shared_ptr cRec = m_World->AddComponent(m_BrickTemplate); + std::shared_ptr cPhys = m_World->AddComponent(m_BrickTemplate); + std::shared_ptr cTemplate = m_World->AddComponent(m_BrickTemplate); + cPhys->Static = false; + cPhys->GravityScale = 0.f; + cPhys->Category = CollisionLayer::Type::Brick; + cPhys->Mask = CollisionLayer::Type::Ball; + + model->ModelFile = "Models/Test/Brick/Brick.obj"; + /*if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 5 && row == 2)) { + std::shared_ptr cPow = m_World->AddComponent(brick); + }*/ + + transform->Scale = glm::vec3(0.8, 0.2, 0.2); + transform->Position = glm::vec3(50, 50, -10); + + //sound + auto collisionSound = m_World->AddComponent(m_BrickTemplate); + collisionSound->FilePath = "Sounds/Brick/shortbrickbreak.wav"; + + m_World->CommitEntity(m_BrickTemplate); + return; } @@ -40,9 +66,20 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID auto templateCheck = m_World->GetComponent(entity); if (templateCheck != nullptr){ return; } + auto brick = m_World->GetComponent(entity); + if (brick != nullptr) { + auto transform = m_World->GetComponent(entity); + //Removes bricks that falls out of the stage. + if (transform->Position.y < -10) { + m_LooseBricks--; + std::cout << m_LooseBricks << std::endl; + m_World->RemoveEntity(entity); + } + } + auto ball = m_World->GetComponent(entity); - if (NumberOfBricks() <= 0 && !Restarting()) { + if (NumberOfBricks() <= 0 && m_LooseBricks <= 0 && !Restarting()) { if (MultiBalls() <= 0 && PowerUps() <= 0) { Events::StageCleared ec; EventBroker->Publish(ec); @@ -56,6 +93,12 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID if (powerUp != nullptr) { SetPowerUps(PowerUps() - 1); m_World->RemoveEntity(entity); + } else { + if (brick != nullptr) { + m_LooseBricks--; + std::cout << m_LooseBricks << std::endl; + m_World->RemoveEntity(entity); + } } } } @@ -111,6 +154,7 @@ void dd::Systems::LevelSystem::CreateLevel() if (num == 1) num = Lines(); } + m_LooseBricks = NumberOfBricks(); SetRestarting(false); } @@ -120,12 +164,18 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe SetNumberOfBricks(NumberOfBricks() - 1); return; } + //auto brick = m_World->CloneEntity(m_BrickTemplate); + //m_World->RemoveComponent(brick); + //auto transform = m_World->GetComponent(brick); + //auto cBrick = m_World->GetComponent(brick); + //auto cPhys = m_World->GetComponent(brick); auto brick = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(brick); auto model = m_World->AddComponent(brick); std::shared_ptr cBrick = m_World->AddComponent(brick); std::shared_ptr cRec = m_World->AddComponent(brick); std::shared_ptr cPhys = m_World->AddComponent(brick); + //std::shared_ptr cTemplate = m_World->AddComponent(brick); cPhys->Static = false; cPhys->GravityScale = 0.f; cPhys->Category = CollisionLayer::Type::Brick; @@ -135,6 +185,8 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe /*if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 5 && row == 2)) { std::shared_ptr cPow = m_World->AddComponent(brick); }*/ + + transform->Scale = glm::vec3(0.8, 0.2, 0.2); if (typeInt == 2) { std::shared_ptr cPow = m_World->AddComponent(brick); } @@ -144,10 +196,6 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe transform->Position = glm::vec3(x - 3, 5 - spaceToEdge - y , -10.f); cBrick->Score = 10 * num; - //sound - auto collisionSound = m_World->AddComponent(brick); - collisionSound->FilePath = "Sounds/Brick/shortbrickbreak.wav"; - m_World->CommitEntity(brick); return; } @@ -356,12 +404,12 @@ void dd::Systems::LevelSystem::GetNextLevel() } else if (m_CurrentCluster == 2) { if (m_CurrentLevel == 1) { level = - {1, 1, 0, 0, 0, 1, 1, - 1, 1, 1, 0, 1, 1, 1, + {1, 1, 0, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, - 1, 1, 0, 0, 0, 1, 1, - 1, 0, 0, 0, 0, 0, 1}; + 1, 1, 0, 1, 0, 1, 1, + 1, 0, 0, 1, 0, 0, 1}; } else if (m_CurrentLevel == 2) { level = {1, 0, 0, 0, 0, 0, 1, From 5b425f27aec3d5576fcd7fbacfa9c181f57355e6 Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Tue, 6 Oct 2015 15:31:48 +0200 Subject: [PATCH 6/6] Fixed invisible item bug, maybe. Put 0.1 sec hitlag on impact with pad. Stable level loading? --- include/Game/BallSystem.h | 4 ++++ include/Game/CBrick.h | 2 -- include/Game/CPad.h | 3 --- src/game/Game/BallSystem.cpp | 23 ++++++++++++++++++++++- src/game/Game/LevelSystem.cpp | 27 +++++++++++++++------------ src/game/Physics/PhysicsSystem.cpp | 5 ++++- 6 files changed, 45 insertions(+), 19 deletions(-) diff --git a/include/Game/BallSystem.h b/include/Game/BallSystem.h index 682b1c9..1d06e6b 100644 --- a/include/Game/BallSystem.h +++ b/include/Game/BallSystem.h @@ -8,12 +8,14 @@ #include "Core/CTemplate.h" #include "Physics/CPhysics.h" #include "Physics/CCircleShape.h" +#include "Physics/CRectangleShape.h" #include "Physics/EContact.h" #include "Rendering/CModel.h" #include "Rendering/CPointLight.h" #include "Game/CBall.h" #include "Game/CPowerUp.h" #include "Game/CLife.h" +#include "Game/CBrick.h" #include "Game/ELifeLost.h" #include "Game/EComboEvent.h" #include "Game/EResetBall.h" @@ -22,6 +24,7 @@ #include "Game/EGameOver.h" #include "Game/EPause.h" #include "Game/EHitPad.h" +#include "Game/EHitLag.h" namespace dd { @@ -90,6 +93,7 @@ private: bool m_ReplaceBall = false; bool m_MultiBall = false; bool m_Pause = false; + EntityID m_LastCollision = 999999; glm::vec3 m_SavedSpeed; bool m_InitializePause = false; diff --git a/include/Game/CBrick.h b/include/Game/CBrick.h index d44ab02..893f157 100644 --- a/include/Game/CBrick.h +++ b/include/Game/CBrick.h @@ -15,8 +15,6 @@ namespace Components struct Brick : Component { - int Points = 10; - int Hits = 1; int Score = 50; bool Removed = false; }; diff --git a/include/Game/CPad.h b/include/Game/CPad.h index 15afebd..9d9c702 100644 --- a/include/Game/CPad.h +++ b/include/Game/CPad.h @@ -17,9 +17,6 @@ namespace Components struct Pad : Component { - int Lives; - int Points; - float SlowdownModifier = 5.f; float AccelerationSpeed = 40.f; float MaxSpeed = 5.f; diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index 21a32ca..7be7d8a 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -224,6 +224,23 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) //TODO: Add support for power-up collisions } + auto brick = m_World->GetComponent(otherEntitiy); + if (brick != nullptr) { + auto transform = m_World->GetComponent(otherEntitiy); + auto physics = m_World->GetComponent(otherEntitiy); + auto rectangle = m_World->GetComponent(otherEntitiy); + int hey = 5; + } + + /*if (otherEntitiy == m_LastCollision) { + + if (brick != nullptr) { + return false; + } + } else { + m_LastCollision = otherEntitiy; + }*/ + //if this is a brick thats dead do not collide :) auto ballTransform = m_World->GetComponent(ballEntity); @@ -232,6 +249,10 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) if (m_World->GetProperty(otherEntitiy, "Name") == "Pad"){ Events::HitPad e; EventBroker->Publish(e); + Events::HitLag el; + el.Time = 0.1f; + el.Type = "All"; + EventBroker->Publish(el); auto padTransform = m_World->GetComponent(otherEntitiy); float x = (ballTransform->Position.x - padTransform->Position.x) * XMovementMultiplier(); @@ -260,7 +281,7 @@ EntityID dd::Systems::BallSystem::CreateBall() m_World->RemoveComponent(ent); - m_World->CommitEntity(ent); + //m_World->CommitEntity(ent); return ent; } diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index de9c2f6..c74c60b 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -164,32 +164,33 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe SetNumberOfBricks(NumberOfBricks() - 1); return; } - //auto brick = m_World->CloneEntity(m_BrickTemplate); - //m_World->RemoveComponent(brick); - //auto transform = m_World->GetComponent(brick); - //auto cBrick = m_World->GetComponent(brick); - //auto cPhys = m_World->GetComponent(brick); - auto brick = m_World->CreateEntity(); + auto brick = m_World->CloneEntity(m_BrickTemplate); + m_World->RemoveComponent(brick); + auto transform = m_World->GetComponent(brick); + auto cBrick = m_World->GetComponent(brick); + auto cPhys = m_World->GetComponent(brick); + + /*auto brick = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(brick); auto model = m_World->AddComponent(brick); std::shared_ptr cBrick = m_World->AddComponent(brick); std::shared_ptr cRec = m_World->AddComponent(brick); - std::shared_ptr cPhys = m_World->AddComponent(brick); + std::shared_ptr cPhys = m_World->AddComponent(brick);*/ //std::shared_ptr cTemplate = m_World->AddComponent(brick); cPhys->Static = false; cPhys->GravityScale = 0.f; cPhys->Category = CollisionLayer::Type::Brick; cPhys->Mask = CollisionLayer::Type::Ball; - model->ModelFile = "Models/Test/Brick/Brick.obj"; + //model->ModelFile = "Models/Test/Brick/Brick.obj"; /*if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 5 && row == 2)) { std::shared_ptr cPow = m_World->AddComponent(brick); }*/ - transform->Scale = glm::vec3(0.8, 0.2, 0.2); - if (typeInt == 2) { + //transform->Scale = glm::vec3(0.8, 0.2, 0.2); + /*if (typeInt == 2) { std::shared_ptr cPow = m_World->AddComponent(brick); - } + }*/ float x = line * spacesBetweenBricks.x; float y = row * spacesBetweenBricks.y; transform->Scale = glm::vec3(0.8, 0.2, 0.2); @@ -245,7 +246,9 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) EventBroker->Publish(e); } - if (!Restarting()) { + if (!Restarting() && !brick->Removed) { + brick->Removed = true; + // Hit brick with ball code. ball->Combo += 1; Events::ComboEvent ec; ec.Combo = ball->Combo; diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index e585c57..f1f4030 100644 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -212,7 +212,10 @@ void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) } if (physicsComponent) { - CreateBody(entity); + auto it = m_EntitiesToBodies.find(entity); + if(it == m_EntitiesToBodies.end()) { + CreateBody(entity); + } } else if (waterComponent) { CreateParticleGroup(entity); } else if (particleEmitterComponent) {