From f6b6f05c37498188dc51b37b15c968c008d14c3e Mon Sep 17 00:00:00 2001 From: PlatinumSkink Date: Tue, 22 Sep 2015 17:55:12 +0200 Subject: [PATCH] CPowerUpBrick + CPowerUp exists. Can drop from brick and be grabbed for MultiBall. --- include/Core/Engine.h | 7 +- include/Game/Bricks/CPowerUpBrick.h | 25 ++++++ include/Game/CPowerUp.h | 25 ++++++ include/Game/ECreatePowerUp.h | 26 ++++++ include/Game/EGameOver.h | 27 ++++++ include/Game/LevelSystem.h | 20 +++-- include/Game/PadSystem.h | 5 +- src/game/CMakeLists.txt | 2 +- src/game/Game/LevelSystem.cpp | 126 +++++++++++++++++++++++----- src/game/Game/PadSystem.cpp | 45 +++++++++- 10 files changed, 275 insertions(+), 33 deletions(-) create mode 100644 include/Game/Bricks/CPowerUpBrick.h create mode 100644 include/Game/CPowerUp.h create mode 100644 include/Game/ECreatePowerUp.h create mode 100644 include/Game/EGameOver.h diff --git a/include/Core/Engine.h b/include/Core/Engine.h index a48c4ac..4e2a7c1 100644 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -42,8 +42,9 @@ #include "Game/LevelSystem.h" #include "Game/PadSystem.h" #include "Game/CBall.h" -#include "Game/CBrick.h" #include "Game/CPad.h" +#include "Game/CBrick.h" +#include "Game/Bricks/CPowerUpBrick.h" #include "Physics/PhysicsSystem.h" #include "Physics/CPhysics.h" @@ -90,6 +91,10 @@ public: m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); + + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->SystemFactory.Register( [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); diff --git a/include/Game/Bricks/CPowerUpBrick.h b/include/Game/Bricks/CPowerUpBrick.h new file mode 100644 index 0000000..d7bb369 --- /dev/null +++ b/include/Game/Bricks/CPowerUpBrick.h @@ -0,0 +1,25 @@ +// +// Created by Administrator on 2015-09-22. +// + +#ifndef DAYDREAM_CPOWERUPBRICK_H +#define DAYDREAM_CPOWERUPBRICK_H + +#include "Core/Component.h" + +namespace dd +{ + +namespace Components +{ + +struct PowerUpBrick : Component +{ + +}; + +} + +} + +#endif //DAYDREAM_CPOWERUPBRICK_H diff --git a/include/Game/CPowerUp.h b/include/Game/CPowerUp.h new file mode 100644 index 0000000..297d14c --- /dev/null +++ b/include/Game/CPowerUp.h @@ -0,0 +1,25 @@ +// +// Created by Administrator on 2015-09-22. +// + +#ifndef DAYDREAM_CPOWERUP_H +#define DAYDREAM_CPOWERUP_H + +#include "Core/Component.h" + +namespace dd +{ + +namespace Components +{ + +struct PowerUp : Component +{ + int Type; +}; + +} + +} + +#endif //DAYDREAM_CPOWERUP_H diff --git a/include/Game/ECreatePowerUp.h b/include/Game/ECreatePowerUp.h new file mode 100644 index 0000000..d1940ae --- /dev/null +++ b/include/Game/ECreatePowerUp.h @@ -0,0 +1,26 @@ +// +// Created by Administrator on 2015-09-22. +// + +#ifndef DAYDREAM_ECREATEPOWERUP_H +#define DAYDREAM_ECREATEPOWERUP_H + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct CreatePowerUp : Event +{ + glm::vec3 Position; + +}; + +} + +} + +#endif //DAYDREAM_ECREATEPOWERUP_H diff --git a/include/Game/EGameOver.h b/include/Game/EGameOver.h new file mode 100644 index 0000000..923b75d --- /dev/null +++ b/include/Game/EGameOver.h @@ -0,0 +1,27 @@ +// +// Created by Administrator on 2015-09-22. +// + +#ifndef DAYDREAM_EGAMEOVER_H +#define DAYDREAM_EGAMEOVER_H + +#include "Core/EventBroker.h" +#include "Core/Entity.h" + +namespace dd +{ + +namespace Events +{ + +struct GameOver : Event +{ + EntityID Entity; + +}; + +} + +} + +#endif //DAYDREAM_EGAMEOVER_H diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index c36fda8..9086c5b 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -7,24 +7,29 @@ #include "Core/System.h" #include "Core/CTransform.h" +#include "Core/EventBroker.h" +#include "Core/World.h" #include "Rendering/CSprite.h" #include "Rendering/CModel.h" #include "Game/CBrick.h" -#include "Core/EventBroker.h" -#include "Core/World.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/EMultiBall.h" +#include "Game/EGameOver.h" +#include "Game/ECreatePowerUp.h" +#include "Game/Bricks/CPowerUpBrick.h" #include "Physics/CBoxShape.h" #include "Physics/CPhysics.h" #include "Physics/CCircleShape.h" #include "Physics/ESetImpulse.h" #include "Physics/EContact.h" #include "Sound/CCollisionSound.h" +#include "Game/PadSystem.h" #include #include #include @@ -75,6 +80,8 @@ public: void SetLives(const int& lives) { m_Lives = lives; } int& PastLives() { return m_PastLives; } void SetPastLives(const int& pastLives) { m_PastLives = pastLives; } + int& MultiBalls() { return m_MultiBalls; } + void SetMultiBalls(const int& multiBalls) { m_MultiBalls = multiBalls; } int& Score() { return m_Score; } void SetScore(const int& score) { m_Score = score; } int& NumberOfBricks() { return m_NumberOfBricks; } @@ -93,6 +100,7 @@ private: bool m_Initialized = false; int m_Lives = 3; int m_PastLives = 3; + int m_MultiBalls = 0; int m_Score = 0; int m_NumberOfBricks; int m_Rows = 7; @@ -104,11 +112,13 @@ private: dd::EventRelay m_ELifeLost; dd::EventRelay m_EScoreEvent; dd::EventRelay m_EMultiBall; + dd::EventRelay m_ECreatePowerUp; 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); + bool OnLifeLost(const dd::Events::LifeLost &event); + bool OnScoreEvent(const dd::Events::ScoreEvent &event); + bool OnMultiBall(const dd::Events::MultiBall &event); + bool OnCreatePowerUp(const dd::Events::CreatePowerUp &event); }; } diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index 5564151..5be9ba3 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -21,8 +21,9 @@ #include "Rendering/CSprite.h" #include "Rendering/CModel.h" #include "Game/CBall.h" -#include "Game/EResetBall.h" #include "Game/CPad.h" +#include "Game/CPowerUp.h" +#include "Game/EResetBall.h" #include "Game/EMultiBall.h" @@ -73,6 +74,7 @@ private: dd::EventRelay m_EKeyDown; dd::EventRelay m_EKeyUp; dd::EventRelay m_EContact; + dd::EventRelay m_EContactPowerUp; dd::EventRelay m_EResetBall; dd::EventRelay m_EMultiBall; @@ -80,6 +82,7 @@ private: bool OnKeyUp(const dd::Events::KeyUp &event); bool OnContact(const dd::Events::Contact &event); + bool OnContactPowerUp(const dd::Events::Contact &event); bool OnResetBall(const dd::Events::ResetBall &event); bool OnMultiBall(const dd::Events::MultiBall &event); diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index f608d66..8980c8e 100755 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -87,7 +87,7 @@ set(SOURCE_FILES ${SOURCE_FILES_Transform} ${SOURCE_FILES_Physics} ${SOURCE_FILES_Game} - ${SOURCE_FILES_Sound}) + ${SOURCE_FILES_Sound} ../../include/Game/EGameOver.h ../../include/Game/Bricks/CPowerUpBrick.h ../../include/Game/CPowerUp.h ../../include/Game/ECreatePowerUp.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 0d605f9..9763e7a 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -10,9 +10,10 @@ 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); + EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, LevelSystem::OnLifeLost); + EVENT_SUBSCRIBE_MEMBER(m_EScoreEvent, LevelSystem::OnScoreEvent); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, LevelSystem::OnMultiBall); + EVENT_SUBSCRIBE_MEMBER(m_ECreatePowerUp, LevelSystem::OnCreatePowerUp); for (int i = 0; i < Lives(); i++) { CreateLife(i); @@ -46,6 +47,13 @@ void dd::Systems::LevelSystem::Update(double dt) CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); m_Initialized = true; } + + if (Lives() < 0) + { + Events::GameOver e; + EventBroker->Publish(e); + std::cout << "Game Over!" << std::endl; + } } void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) @@ -55,7 +63,10 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID if (ball != NULL) { auto transformBall = m_World->GetComponent(entity); if (transformBall->Position.y < -10) { - if (Lives() == PastLives()) { + if (MultiBalls() != 0) { + SetMultiBalls(MultiBalls() - 1); + m_World->RemoveEntity(entity); + } else if (Lives() == PastLives()) { Events::LifeLost e; e.Entity = entity; EventBroker->Publish(e); @@ -75,6 +86,21 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID } } } + if (NumberOfBricks() <= 0) { + if (MultiBalls() <= 0) { + Events::ScoreEvent es; + es.Score = 500; + EventBroker->Publish(es); + Events::ResetBall e; + EventBroker->Publish(e); + CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); + } else { + if (ball != NULL) { + SetMultiBalls(MultiBalls() - 1); + m_World->RemoveEntity(entity); + } + } + } } void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 spacesBetweenBricks, int spaceToEdge) @@ -107,6 +133,9 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe fileName.append(".png"); //sprite->SpriteFile = fileName; model->ModelFile = "Models/Test/Brick/Brick.obj"; + if (line == 1) { + std::shared_ptr cPow = m_World->AddComponent(brick); + } float x = spaceToEdge + line * spacesBetweenBricks.x; float y = spaceToEdge + row * spacesBetweenBricks.y; transform->Scale = glm::vec3(1.6, 0.35, 0.5); @@ -141,50 +170,101 @@ void dd::Systems::LevelSystem::OnEntityRemoved(EntityID entity) bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) { - EntityID entityBrick = event.Entity1; - auto brick = m_World->GetComponent(entityBrick); + EntityID entityBrick; + EntityID entityBall; + auto ball = m_World->GetComponent(event.Entity2); + auto brick = m_World->GetComponent(event.Entity1); + if (brick != NULL) { + entityBrick = event.Entity1; + } else { + brick = m_World->GetComponent(event.Entity2); + if (brick != NULL) { + entityBrick = event.Entity2; + } else { + return false; + } + } + if (ball != NULL) { + entityBall = event.Entity2; + } else { + ball = m_World->GetComponent(event.Entity1); + if (ball != NULL) { + entityBall = event.Entity1; + } else { + return false; + } + } + + brick = m_World->GetComponent(entityBrick); if (brick == NULL) { return false; } - EntityID entityBall = event.Entity2; - m_World->RemoveEntity(entityBrick); - - SetNumberOfBricks(NumberOfBricks() - 1); - if (NumberOfBricks() == 0) { - Events::ScoreEvent es; - es.Score = 500; - EventBroker->Publish(es); - Events::ResetBall e; + auto power = m_World->GetComponent(entityBrick); + if (power != NULL) { + Events::CreatePowerUp e; + auto transform = m_World->GetComponent(entityBrick); + e.Position = transform->Position; EventBroker->Publish(e); - CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); } - Events::ScoreEvent es; - es.Score = brick->Score; - EventBroker->Publish(es); - std::cout << "Score: " << Score() << std::endl; + if (ball) + { + m_World->RemoveEntity(entityBrick); + + SetNumberOfBricks(NumberOfBricks() - 1); + Events::ScoreEvent es; + es.Score = brick->Score; + EventBroker->Publish(es); + + std::cout << "Score: " << Score() << std::endl; + } return true; } -bool dd::Systems::LevelSystem::LifeLost(const dd::Events::LifeLost &event) +bool dd::Systems::LevelSystem::OnLifeLost(const dd::Events::LifeLost &event) { SetLives(Lives() - 1); return true; } -bool dd::Systems::LevelSystem::ScoreEvent(const dd::Events::ScoreEvent &event) +bool dd::Systems::LevelSystem::OnScoreEvent(const dd::Events::ScoreEvent &event) { SetScore(Score() += event.Score); return true; } -bool dd::Systems::LevelSystem::MultiBall(const dd::Events::MultiBall &event) +bool dd::Systems::LevelSystem::OnMultiBall(const dd::Events::MultiBall &event) { + SetMultiBalls(MultiBalls()+2); +} +bool dd::Systems::LevelSystem::OnCreatePowerUp(const dd::Events::CreatePowerUp &event) +{ + auto powerUp = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(powerUp); + auto model = m_World->AddComponent(powerUp); + std::shared_ptr cRec = m_World->AddComponent(powerUp); + std::shared_ptr cPhys = m_World->AddComponent(powerUp); + std::shared_ptr cPow = m_World->AddComponent(powerUp); + cPhys->Static = false; + + transform->Position = event.Position; + transform->Scale = glm::vec3(0.25, 0.25, 0.25); + + model->ModelFile = "Models/Test/Ball/Ballopus.obj"; + + m_World->CommitEntity(powerUp); + + Events::SetImpulse e; + e.Entity = powerUp; + e.Impulse = glm::vec2(0, -0.25); + e.Point = glm::vec2(transform->Position.x, transform->Position.y); + EventBroker->Publish(e); + return true; } void dd::Systems::LevelSystem::EndLevel() diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index fc994f8..52cd7bb 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -25,6 +25,7 @@ void dd::Systems::PadSystem::Initialize() 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_EContactPowerUp, &PadSystem::OnContactPowerUp); EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &PadSystem::OnResetBall); EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &PadSystem::OnMultiBall); } @@ -209,6 +210,46 @@ bool dd::Systems::PadSystem::OnContact(const dd::Events::Contact &event) EventBroker->Publish(e); } +bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) +{ + EntityID entityPower; + EntityID entityPad; + auto powerUp = m_World->GetComponent(event.Entity1); + auto pad = m_World->GetComponent(event.Entity2); + if (powerUp != NULL) { + entityPower = event.Entity1; + } else { + powerUp = m_World->GetComponent(event.Entity2); + if (powerUp != NULL) { + entityPower = event.Entity2; + } + } + if (pad != NULL) { + entityPad = event.Entity2; + } else { + pad = m_World->GetComponent(event.Entity1); + if (pad != NULL) { + entityPad = event.Entity1; + } + } + + if (entityPower == NULL || entityPad == NULL) { + return false; + } + + pad = m_World->GetComponent(entityPad); + if (pad == NULL) { + return false; + } + + m_World->RemoveEntity(entityPower); + Events::MultiBall e; + auto transform = m_World->GetComponent(entityPad); + e.padTransform = transform; + EventBroker->Publish(e); + return true; +} + bool dd::Systems::PadSystem::OnResetBall(const dd::Events::ResetBall &event) { SetReplaceBall(true); @@ -222,8 +263,8 @@ bool dd::Systems::PadSystem::OnMultiBall(const dd::Events::MultiBall &event) auto transform1 = m_World->GetComponent(ent1); auto transform2 = m_World->GetComponent(ent2); auto padTransform = event.padTransform; - transform1->Position = glm::vec3(padTransform->Position.x - 4, -6, -10); - transform2->Position = glm::vec3(padTransform->Position.x + 4, -6, -10); + transform1->Position = glm::vec3(padTransform->Position.x - 4, -5, -10); + transform2->Position = glm::vec3(padTransform->Position.x + 4, -5, -10); Events::SetImpulse e1; e1.Entity = ent1;