diff --git a/include/Game/EMultiBall.h b/include/Game/EMultiBall.h new file mode 100644 index 0000000..d43cc55 --- /dev/null +++ b/include/Game/EMultiBall.h @@ -0,0 +1,26 @@ +// +// Created by Adniklastrator on 2015-09-17. +// + +#ifndef DAYDREAM_EMULTIBALL_H +#define DAYDREAM_EMULTIBALL_H + +#include "Core/EventBroker.h" +#include "Core/Entity.h" + +namespace dd +{ + +namespace Events +{ + +struct MultiBall : Event +{ + +}; + +} + +} + +#endif //DAYDREAM_EMULTIBALL_H diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index 786355f..d6bccb6 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -18,6 +18,7 @@ #include "Game/ELifeLost.h" #include "Game/EResetBall.h" #include "Game/EScoreEvent.h" +#include "Game/EMultiBall.h" #include "Physics/CBoxShape.h" #include "Physics/CPhysics.h" #include "Physics/CCircleShape.h" @@ -101,10 +102,12 @@ private: dd::EventRelay m_EContact; dd::EventRelay m_ELifeLost; dd::EventRelay m_EScoreEvent; + dd::EventRelay m_EMultiBall; bool OnContact(const dd::Events::Contact &event); bool LifeLost(const dd::Events::LifeLost &event); bool ScoreEvent(const dd::Events::ScoreEvent &event); + bool MultiBall(const dd::Events::MultiBall &event); }; } diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index 4a21df7..5564151 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -22,7 +22,8 @@ #include "Rendering/CModel.h" #include "Game/CBall.h" #include "Game/EResetBall.h" -#include "CPad.h" +#include "Game/CPad.h" +#include "Game/EMultiBall.h" namespace dd @@ -41,6 +42,8 @@ public: void Update(double dt) override; void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + EntityID CreateBall(); + EntityID& Entity() { return m_Entity; } void SetEntity(const EntityID& ent) { m_Entity = ent; } glm::vec3 Acceleration() const { return m_Acceleration; } @@ -52,16 +55,18 @@ public: void SetRight(const bool& right) { m_Right = right; } bool ReplaceBall() const { return m_ReplaceBall; } void SetReplaceBall(const bool& replaceBall) { m_ReplaceBall = replaceBall; } + bool MultiBall() const { return m_MultiBall; } + void SetMultiBall(const bool& multiBall) { m_MultiBall = multiBall; } Components::Transform* Transform() const { return m_Transform; } - void SetTransform(const Components::Transform* transform) { m_Transform = transform; } + void SetTransform(Components::Transform* transform) { m_Transform = transform; } Components::Pad* Pad() const { return m_Pad; } - void SetPad(const Components::Pad* pad) { m_Pad = pad; } + void SetPad(Components::Pad* pad) { m_Pad = pad; } private: EntityID m_Entity = 0; glm::vec3 m_Acceleration = glm::vec3(0.f, 0.f, 0.f); - bool m_Left = false, m_Right = false, m_ReplaceBall = false; + bool m_Left = false, m_Right = false, m_ReplaceBall = false, m_MultiBall = false; Components::Transform* m_Transform; Components::Pad* m_Pad; @@ -69,12 +74,14 @@ private: dd::EventRelay m_EKeyUp; dd::EventRelay m_EContact; dd::EventRelay m_EResetBall; + dd::EventRelay m_EMultiBall; bool OnKeyDown(const dd::Events::KeyDown &event); bool OnKeyUp(const dd::Events::KeyUp &event); bool OnContact(const dd::Events::Contact &event); - bool ResetBall(const dd::Events::ResetBall &event); + bool OnResetBall(const dd::Events::ResetBall &event); + bool OnMultiBall(const dd::Events::MultiBall &event); class PadSteeringInputController; std::array, 4> m_PadInputControllers; diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 61c2d74..0d0a576 100755 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -75,7 +75,7 @@ set(SOURCE_FILES ${SOURCE_FILES_Rendering} ${SOURCE_FILES_Transform} ${SOURCE_FILES_Physics} - ${SOURCE_FILES_Game}) + ${SOURCE_FILES_Game} ../../include/Game/EMultiBall.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 index 816d839..9c6c34e 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -12,6 +12,7 @@ void dd::Systems::LevelSystem::Initialize() EVENT_SUBSCRIBE_MEMBER(m_EContact, LevelSystem::OnContact); EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, LevelSystem::LifeLost); EVENT_SUBSCRIBE_MEMBER(m_EScoreEvent, LevelSystem::ScoreEvent); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, LevelSystem::MultiBall); for (int i = 0; i < Lives(); i++) { CreateLife(i); @@ -176,6 +177,11 @@ bool dd::Systems::LevelSystem::ScoreEvent(const dd::Events::ScoreEvent &event) return true; } +bool dd::Systems::LevelSystem::MultiBall(const dd::Events::MultiBall &event) +{ + +} + void dd::Systems::LevelSystem::EndLevel() { Events::StageCleared e; diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index 5f1aa61..085b411 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -22,12 +22,11 @@ void dd::Systems::PadSystem::Initialize() l.Command = "left"; EventBroker->Publish(l); - EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, PadSystem::OnKeyDown); - EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, PadSystem::OnKeyUp); - EVENT_SUBSCRIBE_MEMBER(m_EContact, PadSystem::OnContact); - EVENT_SUBSCRIBE_MEMBER(m_EResetBall, PadSystem::ResetBall); - - return; + EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PadSystem::OnKeyDown); + EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PadSystem::OnKeyUp); + EVENT_SUBSCRIBE_MEMBER(m_EContact, &PadSystem::OnContact); + EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &PadSystem::OnResetBall); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &PadSystem::OnMultiBall); } void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) @@ -40,32 +39,10 @@ void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID p auto transformEntity = m_World->GetComponent(entity); transformEntity->Position = glm::vec3(20, 20, -10); - //Temporary. Create new ball. - /*auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(0.5f, 0.f, -10.f); - transform->Scale = glm::vec3(1.f, 1.f, 1.f); - std::shared_ptr sprite = m_World->AddComponent(ent); - sprite->SpriteFile = "Textures/Ball.png"; - 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;*/ - - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(0.5f, 0.f, -10.f); - transform->Scale = glm::vec3(1.f, 1.f, 1.f); - 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; - m_World->RemoveEntity(entity); - m_World->CommitEntity(ent); + + auto ent = CreateBall(); + auto transform = m_World->GetComponent(ent); Events::SetImpulse e; e.Entity = ent; @@ -105,11 +82,9 @@ void dd::Systems::PadSystem::Update(double dt) if (Left()) { acceleration.x = -pad->AccelerationSpeed; - } - else if (Right()) { + } else if (Right()) { acceleration.x = pad->AccelerationSpeed; - } - else { + } else { acceleration.x = 0.f; } @@ -117,9 +92,35 @@ void dd::Systems::PadSystem::Update(double dt) SetPad(pad); SetAcceleration(acceleration); + if (MultiBall() == true) { + SetMultiBall(false); + + Events::MultiBall e; + EventBroker->Publish(e); + } + return; } +EntityID dd::Systems::PadSystem::CreateBall() +{ + auto ent = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(ent); + transform->Position = glm::vec3(0.5f, 0.f, -10.f); + transform->Scale = glm::vec3(1.f, 1.f, 1.f); + 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; + + m_World->CommitEntity(ent); + + return ent; +} + bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) { int val = event.KeyCode; @@ -137,6 +138,8 @@ bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) SetRight(true); } else if (val == GLFW_KEY_R) { SetReplaceBall(true); + } else if (val == GLFW_KEY_M) { + SetMultiBall(true); } return true; } @@ -191,20 +194,12 @@ bool dd::Systems::PadSystem::OnContact(const dd::Events::Contact &event) //std::cout << movementX << " " << movementY << std::endl; //Temporary solution. Add a new ball and delete the old one. - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); + auto ent = CreateBall(); + auto transform = m_World->GetComponent(ent); + transform->Position = glm::vec3(transformBall->Position.x, transformBall->Position.y + 0.01f, -10.f); - transform->Scale = glm::vec3(1.f, 1.f, 1.f); - 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; m_World->RemoveEntity(entityBall); - m_World->CommitEntity(ent); Events::SetImpulse e; e.Entity = ent; @@ -213,12 +208,36 @@ bool dd::Systems::PadSystem::OnContact(const dd::Events::Contact &event) EventBroker->Publish(e); } -bool dd::Systems::PadSystem::ResetBall(const dd::Events::ResetBall &event) +bool dd::Systems::PadSystem::OnResetBall(const dd::Events::ResetBall &event) { SetReplaceBall(true); return true; } +bool dd::Systems::PadSystem::OnMultiBall(const dd::Events::MultiBall &event) +{ + auto ent1 = CreateBall(); + auto ent2 = CreateBall(); + auto transform1 = m_World->GetComponent(ent1); + auto transform2 = m_World->GetComponent(ent2); + transform1->Position = glm::vec3(3, -6, -10); + transform2->Position = glm::vec3(6, -6, -10); + + Events::SetImpulse e1; + e1.Entity = ent1; + e1.Impulse = glm::vec2(6, 6); + e1.Point = glm::vec2(transform1->Position.x, transform1->Position.y); + EventBroker->Publish(e1); + + Events::SetImpulse e2; + e2.Entity = ent2; + e2.Impulse = glm::vec2(-6, 6); + e2.Point = glm::vec2(transform2->Position.x, transform2->Position.y); + EventBroker->Publish(e2); + + return true; +} + bool dd::Systems::PadSystem::PadSteeringInputController::OnCommand(const Events::InputCommand &event) { std::string command = event.Command;