From 93c4805a2297e2e167fdbadb6d16fc0f8193bd90 Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 5 Jun 2014 00:35:15 +0200 Subject: [PATCH] Tower not aiming towards the player. --- src/Components/Tower.h | 24 +++++ src/Components/Turret.h | 0 src/GameWorld.cpp | 96 +++++++++++++++++-- src/GameWorld.h | 2 + src/Systems/TowerSystem.cpp | 69 +++++++++++++ src/Systems/TowerSystem.h | 36 +++++++ vs11/Returngeance/Returngeance.vcxproj | 3 + .../Returngeance/Returngeance.vcxproj.filters | 25 +++-- 8 files changed, 238 insertions(+), 17 deletions(-) create mode 100644 src/Components/Tower.h create mode 100644 src/Components/Turret.h create mode 100644 src/Systems/TowerSystem.cpp create mode 100644 src/Systems/TowerSystem.h diff --git a/src/Components/Tower.h b/src/Components/Tower.h new file mode 100644 index 0000000..fc51d3d --- /dev/null +++ b/src/Components/Tower.h @@ -0,0 +1,24 @@ +#ifndef Tower_h__ +#define Tower_h__ + +#include "Component.h" + +namespace Components +{ + + struct Tower : Component + { + Tower() + : ID(0) { } + + int ID; + EntityID GunBase; + EntityID Gun; + + + virtual Tower* Clone() const override { return new Tower(*this); } + }; + +} + +#endif // Tower_h__ \ No newline at end of file diff --git a/src/Components/Turret.h b/src/Components/Turret.h new file mode 100644 index 0000000..e69de29 diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index c9f4fe6..d27d827 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -292,8 +292,6 @@ void GameWorld::Initialize() EventBroker->Publish(e); }*/ - - { auto flag = CreateEntity(); auto transform = AddComponent(flag); @@ -442,6 +440,7 @@ void GameWorld::RegisterSystems() m_SystemFactory.Register([this]() { return new Systems::FollowSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::GarageSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::WallSystem(this, EventBroker, ResourceManager); }); + m_SystemFactory.Register([this]() { return new Systems::TowerSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::RenderSystem(this, EventBroker, ResourceManager); }); } @@ -465,6 +464,7 @@ void GameWorld::AddSystems() AddSystem(); AddSystem(); AddSystem(); + AddSystem(); AddSystem(); } @@ -628,6 +628,85 @@ void GameWorld::CreateGate(EntityID parent, glm::vec3 position, glm::quat orient } } +EntityID GameWorld::CreateTower(EntityID parent, glm::vec3 pos, int playerID) +{ + auto towerBase = CreateEntity(parent); + auto transform = AddComponent(towerBase); + transform->Position = pos; + + auto towerComponent = AddComponent(towerBase); + + auto physics = AddComponent(towerBase); + physics->Mass = 100.f; + physics->MotionType = Components::Physics::MotionTypeEnum::Fixed; + + auto model = AddComponent(towerBase); + model->ModelFile = "Models/Turret/Base/Base.obj"; + + auto health = AddComponent(towerBase); + health->Amount = 50.f; + + auto shape = CreateEntity(towerBase); + auto shapetransform = AddComponent(shape); + auto shapemesh = AddComponent(shape); + shapemesh->ResourceName = "Models/Turret/Base/Base.obj"; + + CommitEntity(shape); + { + auto towerGunRotation = CreateEntity(towerBase); + auto transform = AddComponent(towerGunRotation); + transform->Position = glm::vec3(0.f, 5.889f-0.92791f, 0.f); + + + auto towerGunBaseModel = CreateEntity(towerGunRotation); + { + auto transform = AddComponent(towerGunBaseModel); + transform->Orientation = glm::quat(glm::vec3(0, -glm::pi() / 2.f, 0)); + auto model = AddComponent(towerGunBaseModel); + model->ModelFile = "Models/Turret/GunRotation/GunRotation.obj"; + } + CommitEntity(towerGunBaseModel); + + auto health = AddComponent(towerGunRotation); + health->Amount = 50.f; + + { + auto towerGun = CreateEntity(towerGunRotation); + auto transform = AddComponent(towerGun); + transform->Position = glm::vec3(0.f, 4.12801f, 1.18125f); + //transform->Orientation = glm::quat(glm::vec3(0, -glm::pi() / 2.f, 0)); + + auto towerGunModel = CreateEntity(towerGun); + { + auto transform = AddComponent(towerGunModel); + transform->Orientation = glm::quat(glm::vec3(0, -glm::pi() / 2.f, 0)); + auto model = AddComponent(towerGunModel); + model->ModelFile = "Models/Turret/Gun/Gun.obj"; + } + CommitEntity(towerGunModel); + + auto health = AddComponent(towerGun); + health->Amount = 50.f; + + CommitEntity(towerGun); + towerComponent->Gun = towerGun; + } + + CommitEntity(towerGunRotation); + towerComponent->GunBase = towerGunRotation; + } + + + + + towerComponent->ID = playerID; + + CommitEntity(towerBase); + + return towerBase; + +} + EntityID GameWorld::CreateWall(EntityID parent, glm::vec3 pos, glm::quat orientation) { auto wall = CreateEntity(parent); @@ -1100,12 +1179,13 @@ void GameWorld::CreateBase(glm::quat orientation, int playerID) CreateGate(base, glm::vec3(273.f, 40.185f, 0.06f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); CreateWall(base, glm::vec3(273.f, 40.3f, -55.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); - //CreateWall(base, glm::vec3(273.f, 40.3f, -45.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); - //CreateWall(base, glm::vec3(273.f, 40.3f, -35.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); - //CreateWall(base, glm::vec3(273.f, 40.3f, -25.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); - //CreateWall(base, glm::vec3(273.f, 40.3f, -15.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); - //CreateWall(base, glm::vec3(273.f, 40.3f, 15.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); - //CreateWall(base, glm::vec3(273.f, 40.3f, 25.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); + CreateWall(base, glm::vec3(273.f, 40.3f, -45.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); + CreateWall(base, glm::vec3(273.f, 40.3f, -35.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); + CreateWall(base, glm::vec3(273.f, 40.3f, -25.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); + CreateWall(base, glm::vec3(273.f, 40.3f, -15.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); + CreateWall(base, glm::vec3(273.f, 40.3f, 15.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); + CreateWall(base, glm::vec3(273.f, 40.3f, 25.f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0))); + CreateTower(base, glm::vec3(290.f, 40.3f, 15.f), playerID); CreateGarage(base, glm::vec3(323.2f, 41.4f, -10.2f), glm::quat(glm::vec3(0, glm::pi() / 2.f, 0)), playerID); } diff --git a/src/GameWorld.h b/src/GameWorld.h index ef91887..511ae87 100755 --- a/src/GameWorld.h +++ b/src/GameWorld.h @@ -23,6 +23,7 @@ #include "Systems/WheelPairSystem.h" #include "Systems/FollowSystem.h" #include "Systems/WallSystem.h" +#include "Systems/TowerSystem.h" #include "Systems/GarageSystem.h" #include "Components/Camera.h" @@ -82,6 +83,7 @@ private: void AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool steering); EntityID CreateJeep(int playerID); EntityID CreateWall(EntityID parent, glm::vec3 pos, glm::quat orientation); + EntityID CreateTower(EntityID parent, glm::vec3 pos, int playerID); EntityID CreateGarage(EntityID parent, glm::vec3 Position, glm::quat orientation, int playerID); void CreateTerrain(); void CreateBase(glm::quat orientation, int playerID); diff --git a/src/Systems/TowerSystem.cpp b/src/Systems/TowerSystem.cpp new file mode 100644 index 0000000..85df1d3 --- /dev/null +++ b/src/Systems/TowerSystem.cpp @@ -0,0 +1,69 @@ +#include "PrecompiledHeader.h" +#include "TowerSystem.h" +#include "World.h" + +void Systems::TowerSystem::RegisterComponents( ComponentFactory* cf ) +{ + cf->Register([]() { return new Components::Tower(); }); +} + +void Systems::TowerSystem::Initialize() +{ + //EVENT_SUBSCRIBE_MEMBER(m_eDamage, &Systems::TowerSystem::Damage); +} + +//bool Systems::TowerSystem::Damage( const Events::Damage &event ) +//{ +// return true; +//} + +void Systems::TowerSystem::Update( double dt ) +{ + +} + +void Systems::TowerSystem::UpdateEntity( double dt, EntityID entity, EntityID parent ) +{ + auto towerComponent = m_World->GetComponent(entity); + if(!towerComponent) + return; + + Components::Transform absoluteTowerGunTransform = m_World->GetSystem()->AbsoluteTransform(towerComponent->Gun); + + auto towerGunTransformComponent = m_World->GetComponent(towerComponent->Gun); + if(!towerGunTransformComponent) + return; + + auto towerGunBaseTransformComponent = m_World->GetComponent(towerComponent->GunBase); + if(!towerGunBaseTransformComponent) + return; + + auto players = m_World->GetComponentsOfType(); + + for(auto player : *players) + { + auto playerComponent = std::dynamic_pointer_cast(player); + if(towerComponent->ID != playerComponent->ID) //!= betyder att den bara targetar sitt eget lag, == fienden. + continue; + + auto playerTransform = m_World->GetComponent(player->Entity); + if(!playerTransform) + continue; + Components::Transform absolutePlayerTransform = m_World->GetSystem()->AbsoluteTransform(player->Entity); + + glm::quat baseLookAt = glm::inverse(glm::quat_cast(glm::lookAt(absoluteTowerGunTransform.Position, glm::vec3(absolutePlayerTransform.Position.x, absoluteTowerGunTransform.Position.y, absolutePlayerTransform.Position.z), glm::vec3(0, 1, 0)))); + glm::quat gunLookAt = glm::inverse(glm::quat_cast(glm::lookAt(absoluteTowerGunTransform.Position, glm::vec3(absolutePlayerTransform.Position.x, absolutePlayerTransform.Position.y, absolutePlayerTransform.Position.z ), glm::vec3(0, 1, 0)))); + + //glm::vec3 axisAngle = glm::eulerAngles(angle) - glm::pi(); + + //glm::quat yaw = glm::quat(axisAngle * glm::vec3(0, 1, 0)); + //glm::quat pitch = glm::quat(axisAngle * glm::vec3(1, 0, 0)); + + //LOG_INFO("yaw: %f", glm::degrees(axisAngle.y)); + + towerGunTransformComponent->Orientation = glm::inverse(baseLookAt) * gunLookAt; + towerGunBaseTransformComponent->Orientation = baseLookAt; + } + +} + diff --git a/src/Systems/TowerSystem.h b/src/Systems/TowerSystem.h new file mode 100644 index 0000000..fe1fa69 --- /dev/null +++ b/src/Systems/TowerSystem.h @@ -0,0 +1,36 @@ +#ifndef TowerSystem_h__ +#define TowerSystem_h__ + + +#include "System.h" +#include "Systems/TransformSystem.h" +#include "Components/Player.h" +#include "Components/Tower.h" + + + +namespace Systems +{ + class TowerSystem : public System + { + public: + + TowerSystem(World* world, std::shared_ptr<::EventBroker> eventBroker, std::shared_ptr<::ResourceManager> resourceManager) + : System(world, eventBroker, resourceManager) { } + + + void Initialize() override; + void RegisterComponents(ComponentFactory* cf) override; + + virtual void Update(double dt); + virtual void UpdateEntity(double dt, EntityID entity, EntityID parent); + + //EventRelay m_eDamage; + //bool Damage(const Events::Damage &event); + + private: + + }; + +} +#endif // TowerSystem_h__ diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 4f89884..741a5a3 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -122,6 +122,7 @@ + @@ -144,6 +145,7 @@ + @@ -250,6 +252,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index fed4ecf..3948d0f 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -78,15 +78,18 @@ Game\Systems - - Gameplay\Systems - Game\Systems Audio + + Game\Systems + + + Game\Systems + @@ -526,9 +529,6 @@ Rendering\Components - - Gameplay\Systems - Physics\Events @@ -565,9 +565,6 @@ GUI - - Gameplay\Events - Game\Events @@ -577,6 +574,16 @@ Game\Components + + + Game\Systems + + + Game\Systems + + + Game\Components +