From ccb3d6d84feabd595e68a30188d8e5b2f35779a2 Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 5 Jun 2014 02:54:44 +0200 Subject: [PATCH] Turret able to shoot, no collision event yet. --- src/Components/Turret.h | 22 ++++ src/Components/TurretShot.h | 25 ++++ src/GameWorld.cpp | 57 +++++++-- src/GameWorld.h | 1 + src/Systems/TowerSystem.cpp | 118 ++++++++++++++++-- src/Systems/TowerSystem.h | 6 + vs11/Returngeance/Returngeance.vcxproj | 2 + .../Returngeance/Returngeance.vcxproj.filters | 6 + 8 files changed, 214 insertions(+), 23 deletions(-) create mode 100644 src/Components/TurretShot.h diff --git a/src/Components/Turret.h b/src/Components/Turret.h index e69de29..50abdfa 100644 --- a/src/Components/Turret.h +++ b/src/Components/Turret.h @@ -0,0 +1,22 @@ +#ifndef Components_Turret_h__ +#define Components_Turret_h__ + +#include "Component.h" + +namespace Components +{ + + struct Turret : Component + { + Turret() + : ShotSpeed(1.0f) { } + + EntityID ShotTemplate; + float ShotSpeed; + + virtual Turret* Clone() const override { return new Turret(*this); } + }; + +} + +#endif // BarrelSteering_h__ \ No newline at end of file diff --git a/src/Components/TurretShot.h b/src/Components/TurretShot.h new file mode 100644 index 0000000..aa0ec00 --- /dev/null +++ b/src/Components/TurretShot.h @@ -0,0 +1,25 @@ +#ifndef Components_TurretShot_h__ +#define Components_TurretShot_h__ + +#include "Component.h" + +namespace Components +{ + + struct TurretShot : Component + { + TurretShot() + : Damage(1.0f), + ExplosionRadius(1.0f), + ExplosionStrength(100.0f) { } + + float Damage; + float ExplosionRadius; + float ExplosionStrength; + + virtual TurretShot* Clone() const override { return new TurretShot(*this); } + }; + +} + +#endif // Components_TurretShot_h__ diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index d27d827..43aebed 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -636,9 +636,9 @@ EntityID GameWorld::CreateTower(EntityID parent, glm::vec3 pos, int playerID) auto towerComponent = AddComponent(towerBase); - auto physics = AddComponent(towerBase); - physics->Mass = 100.f; - physics->MotionType = Components::Physics::MotionTypeEnum::Fixed; +// 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"; @@ -646,12 +646,12 @@ EntityID GameWorld::CreateTower(EntityID parent, glm::vec3 pos, int playerID) 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"; +// auto shape = CreateEntity(towerBase); +// auto shapetransform = AddComponent(shape); +// auto shapemesh = AddComponent(shape); +// shapemesh->ResourceName = "Models/Turret/Base/Base.obj"; - CommitEntity(shape); + //CommitEntity(shape); { auto towerGunRotation = CreateEntity(towerBase); auto transform = AddComponent(towerGunRotation); @@ -676,6 +676,40 @@ EntityID GameWorld::CreateTower(EntityID parent, glm::vec3 pos, int playerID) transform->Position = glm::vec3(0.f, 4.12801f, 1.18125f); //transform->Orientation = glm::quat(glm::vec3(0, -glm::pi() / 2.f, 0)); +#pragma region Turret_Shot_Template + + { + auto shot = CreateEntity(towerGun); + auto transform = AddComponent(shot); + transform->Position = glm::vec3(0.f, 0.f, -4.f); + transform->Orientation = glm::angleAxis(-glm::pi() / 2.f, glm::vec3(1, 0, 0)); + transform->Scale = glm::vec3(2.f); + AddComponent(shot); + auto physics = AddComponent(shot); + physics->Mass = 25.f; + physics->MotionType = Components::Physics::MotionTypeEnum::Dynamic; + physics->CollisionEvent = true; + auto modelComponent = AddComponent(shot); + modelComponent->ModelFile = "Models/Placeholders/rocket/Rocket.obj"; + auto TurretShotComponent = AddComponent(shot); + TurretShotComponent->Damage = 20.f; + TurretShotComponent->ExplosionRadius = 30.f; + TurretShotComponent->ExplosionStrength = 300000.f; + { + auto shape = CreateEntity(shot); + auto transform = AddComponent(shape); + auto boxShape = AddComponent(shape); + boxShape->Width = 0.5f; + boxShape->Height = 0.5f; + boxShape->Depth = 0.5f; + CommitEntity(shape); + } + CommitEntity(shot); + m_ShotTemplate = shot; + } + +#pragma endregion + auto towerGunModel = CreateEntity(towerGun); { auto transform = AddComponent(towerGunModel); @@ -696,11 +730,12 @@ EntityID GameWorld::CreateTower(EntityID parent, glm::vec3 pos, int playerID) towerComponent->GunBase = towerGunRotation; } - - - towerComponent->ID = playerID; + auto turretComponent = AddComponent(towerBase); + turretComponent->ShotTemplate = m_ShotTemplate; + turretComponent->ShotSpeed = 40.f; + CommitEntity(towerBase); return towerBase; diff --git a/src/GameWorld.h b/src/GameWorld.h index 511ae87..08d6796 100755 --- a/src/GameWorld.h +++ b/src/GameWorld.h @@ -88,6 +88,7 @@ private: void CreateTerrain(); void CreateBase(glm::quat orientation, int playerID); std::vector m_WallDebrisTemplates; + EntityID m_ShotTemplate; }; #endif // GameWorld_h__ diff --git a/src/Systems/TowerSystem.cpp b/src/Systems/TowerSystem.cpp index 85df1d3..313d4fb 100644 --- a/src/Systems/TowerSystem.cpp +++ b/src/Systems/TowerSystem.cpp @@ -5,18 +5,16 @@ void Systems::TowerSystem::RegisterComponents( ComponentFactory* cf ) { cf->Register([]() { return new Components::Tower(); }); + cf->Register([]() { return new Components::Turret(); }); + cf->Register([]() {return new Components::TurretShot(); }); } void Systems::TowerSystem::Initialize() { //EVENT_SUBSCRIBE_MEMBER(m_eDamage, &Systems::TowerSystem::Damage); + Temp_m_TimeSinceLastShot = 0; } -//bool Systems::TowerSystem::Damage( const Events::Damage &event ) -//{ -// return true; -//} - void Systems::TowerSystem::Update( double dt ) { @@ -38,6 +36,10 @@ void Systems::TowerSystem::UpdateEntity( double dt, EntityID entity, EntityID pa if(!towerGunBaseTransformComponent) return; + auto turretComponent = m_World->GetComponent(entity); + if(!turretComponent) + return; + auto players = m_World->GetComponentsOfType(); for(auto player : *players) @@ -49,20 +51,112 @@ void Systems::TowerSystem::UpdateEntity( double dt, EntityID entity, EntityID pa auto playerTransform = m_World->GetComponent(player->Entity); if(!playerTransform) continue; + Components::Transform absolutePlayerTransform = m_World->GetSystem()->AbsoluteTransform(player->Entity); + //Rotate the turret towards the enemy player 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; + +#pragma region GetShotDirectionAndLaunchShot + Temp_m_TimeSinceLastShot += dt; + if(Temp_m_TimeSinceLastShot > 1) + { + { + //Shoot code + EntityID clone = m_World->CloneEntity(turretComponent->ShotTemplate); + auto templateAbsoluteTransform = m_World->GetSystem()->AbsoluteTransform(turretComponent->ShotTemplate); + auto cloneTransform = m_World->GetComponent(clone); + cloneTransform->Position = templateAbsoluteTransform.Position - glm::vec3(0.97163f, 0.f, 0.f); + cloneTransform->Orientation = templateAbsoluteTransform.Orientation; + + Events::SetVelocity eSetVelocity; + eSetVelocity.Entity = clone; + eSetVelocity.Velocity = gunLookAt * glm::vec3(0.f, 0.f, -1.f) * turretComponent->ShotSpeed; + EventBroker->Publish(eSetVelocity); + + { + Events::CreateExplosion e; + e.LifeTime = 1.5; + e.ParticleScale.push_back(0.6); + e.ParticleScale.push_back(1.8); + e.ParticlesToSpawn = 1; + e.Position = cloneTransform->Position; + e.RelativeUpOrientation = glm::angleAxis(glm::pi() / 2, glm::vec3(1,0,0)); + e.Speed = 1.7; + e.SpreadAngle = glm::pi()/100; + e.spritePath = "Textures/Sprites/Smoke1.png"; + e.Emitting = true; + e.SpawnFrequency = 0.2; + e.Color = glm::vec4(0.6,0.6,0.6,1); + EventBroker->Publish(e); + } + { + Events::CreateExplosion e; + e.LifeTime = 0.2; + e.ParticleScale.push_back(1); + //e.ParticleScale.push_back(2); + e.ParticlesToSpawn = 1; + e.Position = cloneTransform->Position; + e.Speed = 0; + e.SpreadAngle = glm::pi(); + e.spritePath = "Textures/Sprites/MuzzleFlash.png"; + e.Color = glm::vec4(2, 2, 2, 0.2); + EventBroker->Publish(e); + } + } + + { + EntityID clone = m_World->CloneEntity(turretComponent->ShotTemplate); + auto templateAbsoluteTransform = m_World->GetSystem()->AbsoluteTransform(turretComponent->ShotTemplate); + auto cloneTransform = m_World->GetComponent(clone); + cloneTransform->Position = templateAbsoluteTransform.Position + glm::vec3(0.97163f, 0.f, 0.f); + cloneTransform->Orientation = templateAbsoluteTransform.Orientation; + + Events::SetVelocity eSetVelocity; + eSetVelocity.Entity = clone; + eSetVelocity.Velocity = gunLookAt * glm::vec3(0.f, 0.f, -1.f) * turretComponent->ShotSpeed; + EventBroker->Publish(eSetVelocity); + + { + Events::CreateExplosion e; + e.LifeTime = 1.5; + e.ParticleScale.push_back(0.6); + e.ParticleScale.push_back(1.8); + e.ParticlesToSpawn = 1; + e.Position = cloneTransform->Position; + e.RelativeUpOrientation = glm::angleAxis(glm::pi() / 2, glm::vec3(1,0,0)); + e.Speed = 1.7; + e.SpreadAngle = glm::pi()/100; + e.spritePath = "Textures/Sprites/Smoke1.png"; + e.Emitting = true; + e.SpawnFrequency = 0.2; + e.Color = glm::vec4(0.6,0.6,0.6,1); + EventBroker->Publish(e); + } + { + Events::CreateExplosion e; + e.LifeTime = 0.2; + e.ParticleScale.push_back(1); + //e.ParticleScale.push_back(2); + e.ParticlesToSpawn = 1; + e.Position = cloneTransform->Position; + e.Speed = 0; + e.SpreadAngle = glm::pi(); + e.spritePath = "Textures/Sprites/MuzzleFlash.png"; + e.Color = glm::vec4(2, 2, 2, 0.2); + EventBroker->Publish(e); + } + } + + Temp_m_TimeSinceLastShot = 0; + +#pragma endregion + + } } } diff --git a/src/Systems/TowerSystem.h b/src/Systems/TowerSystem.h index fe1fa69..bb72573 100644 --- a/src/Systems/TowerSystem.h +++ b/src/Systems/TowerSystem.h @@ -6,6 +6,10 @@ #include "Systems/TransformSystem.h" #include "Components/Player.h" #include "Components/Tower.h" +#include "Components/Turret.h" +#include "Components/TurretShot.h" +#include "Events/SetVelocity.h" +#include "Events/CreateExplosion.h" @@ -29,6 +33,8 @@ namespace Systems //bool Damage(const Events::Damage &event); private: + std::map m_TimeSinceLastShot; + float Temp_m_TimeSinceLastShot; }; diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 741a5a3..194ab46 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -173,6 +173,8 @@ + + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index 3948d0f..0c820a8 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -584,6 +584,12 @@ Game\Components + + Game\Components + + + Physics\Components +