Turret able to shoot, no collision event yet.
This commit is contained in:
@@ -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__
|
||||||
@@ -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__
|
||||||
+46
-11
@@ -636,9 +636,9 @@ EntityID GameWorld::CreateTower(EntityID parent, glm::vec3 pos, int playerID)
|
|||||||
|
|
||||||
auto towerComponent = AddComponent<Components::Tower>(towerBase);
|
auto towerComponent = AddComponent<Components::Tower>(towerBase);
|
||||||
|
|
||||||
auto physics = AddComponent<Components::Physics>(towerBase);
|
// auto physics = AddComponent<Components::Physics>(towerBase);
|
||||||
physics->Mass = 100.f;
|
// physics->Mass = 100.f;
|
||||||
physics->MotionType = Components::Physics::MotionTypeEnum::Fixed;
|
// physics->MotionType = Components::Physics::MotionTypeEnum::Fixed;
|
||||||
|
|
||||||
auto model = AddComponent<Components::Model>(towerBase);
|
auto model = AddComponent<Components::Model>(towerBase);
|
||||||
model->ModelFile = "Models/Turret/Base/Base.obj";
|
model->ModelFile = "Models/Turret/Base/Base.obj";
|
||||||
@@ -646,12 +646,12 @@ EntityID GameWorld::CreateTower(EntityID parent, glm::vec3 pos, int playerID)
|
|||||||
auto health = AddComponent<Components::Health>(towerBase);
|
auto health = AddComponent<Components::Health>(towerBase);
|
||||||
health->Amount = 50.f;
|
health->Amount = 50.f;
|
||||||
|
|
||||||
auto shape = CreateEntity(towerBase);
|
// auto shape = CreateEntity(towerBase);
|
||||||
auto shapetransform = AddComponent<Components::Transform>(shape);
|
// auto shapetransform = AddComponent<Components::Transform>(shape);
|
||||||
auto shapemesh = AddComponent<Components::MeshShape>(shape);
|
// auto shapemesh = AddComponent<Components::MeshShape>(shape);
|
||||||
shapemesh->ResourceName = "Models/Turret/Base/Base.obj";
|
// shapemesh->ResourceName = "Models/Turret/Base/Base.obj";
|
||||||
|
|
||||||
CommitEntity(shape);
|
//CommitEntity(shape);
|
||||||
{
|
{
|
||||||
auto towerGunRotation = CreateEntity(towerBase);
|
auto towerGunRotation = CreateEntity(towerBase);
|
||||||
auto transform = AddComponent<Components::Transform>(towerGunRotation);
|
auto transform = AddComponent<Components::Transform>(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->Position = glm::vec3(0.f, 4.12801f, 1.18125f);
|
||||||
//transform->Orientation = glm::quat(glm::vec3(0, -glm::pi<float>() / 2.f, 0));
|
//transform->Orientation = glm::quat(glm::vec3(0, -glm::pi<float>() / 2.f, 0));
|
||||||
|
|
||||||
|
#pragma region Turret_Shot_Template
|
||||||
|
|
||||||
|
{
|
||||||
|
auto shot = CreateEntity(towerGun);
|
||||||
|
auto transform = AddComponent<Components::Transform>(shot);
|
||||||
|
transform->Position = glm::vec3(0.f, 0.f, -4.f);
|
||||||
|
transform->Orientation = glm::angleAxis(-glm::pi<float>() / 2.f, glm::vec3(1, 0, 0));
|
||||||
|
transform->Scale = glm::vec3(2.f);
|
||||||
|
AddComponent<Components::Template>(shot);
|
||||||
|
auto physics = AddComponent<Components::Physics>(shot);
|
||||||
|
physics->Mass = 25.f;
|
||||||
|
physics->MotionType = Components::Physics::MotionTypeEnum::Dynamic;
|
||||||
|
physics->CollisionEvent = true;
|
||||||
|
auto modelComponent = AddComponent<Components::Model>(shot);
|
||||||
|
modelComponent->ModelFile = "Models/Placeholders/rocket/Rocket.obj";
|
||||||
|
auto TurretShotComponent = AddComponent<Components::TurretShot>(shot);
|
||||||
|
TurretShotComponent->Damage = 20.f;
|
||||||
|
TurretShotComponent->ExplosionRadius = 30.f;
|
||||||
|
TurretShotComponent->ExplosionStrength = 300000.f;
|
||||||
|
{
|
||||||
|
auto shape = CreateEntity(shot);
|
||||||
|
auto transform = AddComponent<Components::Transform>(shape);
|
||||||
|
auto boxShape = AddComponent<Components::BoxShape>(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 towerGunModel = CreateEntity(towerGun);
|
||||||
{
|
{
|
||||||
auto transform = AddComponent<Components::Transform>(towerGunModel);
|
auto transform = AddComponent<Components::Transform>(towerGunModel);
|
||||||
@@ -696,11 +730,12 @@ EntityID GameWorld::CreateTower(EntityID parent, glm::vec3 pos, int playerID)
|
|||||||
towerComponent->GunBase = towerGunRotation;
|
towerComponent->GunBase = towerGunRotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
towerComponent->ID = playerID;
|
towerComponent->ID = playerID;
|
||||||
|
|
||||||
|
auto turretComponent = AddComponent<Components::Turret>(towerBase);
|
||||||
|
turretComponent->ShotTemplate = m_ShotTemplate;
|
||||||
|
turretComponent->ShotSpeed = 40.f;
|
||||||
|
|
||||||
CommitEntity(towerBase);
|
CommitEntity(towerBase);
|
||||||
|
|
||||||
return towerBase;
|
return towerBase;
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ private:
|
|||||||
void CreateTerrain();
|
void CreateTerrain();
|
||||||
void CreateBase(glm::quat orientation, int playerID);
|
void CreateBase(glm::quat orientation, int playerID);
|
||||||
std::vector<EntityID> m_WallDebrisTemplates;
|
std::vector<EntityID> m_WallDebrisTemplates;
|
||||||
|
EntityID m_ShotTemplate;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GameWorld_h__
|
#endif // GameWorld_h__
|
||||||
|
|||||||
+106
-12
@@ -5,18 +5,16 @@
|
|||||||
void Systems::TowerSystem::RegisterComponents( ComponentFactory* cf )
|
void Systems::TowerSystem::RegisterComponents( ComponentFactory* cf )
|
||||||
{
|
{
|
||||||
cf->Register<Components::Tower>([]() { return new Components::Tower(); });
|
cf->Register<Components::Tower>([]() { return new Components::Tower(); });
|
||||||
|
cf->Register<Components::Turret>([]() { return new Components::Turret(); });
|
||||||
|
cf->Register<Components::TurretShot>([]() {return new Components::TurretShot(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void Systems::TowerSystem::Initialize()
|
void Systems::TowerSystem::Initialize()
|
||||||
{
|
{
|
||||||
//EVENT_SUBSCRIBE_MEMBER(m_eDamage, &Systems::TowerSystem::Damage);
|
//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 )
|
void Systems::TowerSystem::Update( double dt )
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -38,6 +36,10 @@ void Systems::TowerSystem::UpdateEntity( double dt, EntityID entity, EntityID pa
|
|||||||
if(!towerGunBaseTransformComponent)
|
if(!towerGunBaseTransformComponent)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
auto turretComponent = m_World->GetComponent<Components::Turret>(entity);
|
||||||
|
if(!turretComponent)
|
||||||
|
return;
|
||||||
|
|
||||||
auto players = m_World->GetComponentsOfType<Components::Player>();
|
auto players = m_World->GetComponentsOfType<Components::Player>();
|
||||||
|
|
||||||
for(auto player : *players)
|
for(auto player : *players)
|
||||||
@@ -49,20 +51,112 @@ void Systems::TowerSystem::UpdateEntity( double dt, EntityID entity, EntityID pa
|
|||||||
auto playerTransform = m_World->GetComponent<Components::Transform>(player->Entity);
|
auto playerTransform = m_World->GetComponent<Components::Transform>(player->Entity);
|
||||||
if(!playerTransform)
|
if(!playerTransform)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Components::Transform absolutePlayerTransform = m_World->GetSystem<Systems::TransformSystem>()->AbsoluteTransform(player->Entity);
|
Components::Transform absolutePlayerTransform = m_World->GetSystem<Systems::TransformSystem>()->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 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::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<float>();
|
|
||||||
|
|
||||||
//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;
|
towerGunTransformComponent->Orientation = glm::inverse(baseLookAt) * gunLookAt;
|
||||||
towerGunBaseTransformComponent->Orientation = baseLookAt;
|
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<Systems::TransformSystem>()->AbsoluteTransform(turretComponent->ShotTemplate);
|
||||||
|
auto cloneTransform = m_World->GetComponent<Components::Transform>(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<float>() / 2, glm::vec3(1,0,0));
|
||||||
|
e.Speed = 1.7;
|
||||||
|
e.SpreadAngle = glm::pi<float>()/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<float>();
|
||||||
|
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<Systems::TransformSystem>()->AbsoluteTransform(turretComponent->ShotTemplate);
|
||||||
|
auto cloneTransform = m_World->GetComponent<Components::Transform>(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<float>() / 2, glm::vec3(1,0,0));
|
||||||
|
e.Speed = 1.7;
|
||||||
|
e.SpreadAngle = glm::pi<float>()/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<float>();
|
||||||
|
e.spritePath = "Textures/Sprites/MuzzleFlash.png";
|
||||||
|
e.Color = glm::vec4(2, 2, 2, 0.2);
|
||||||
|
EventBroker->Publish(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Temp_m_TimeSinceLastShot = 0;
|
||||||
|
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,10 @@
|
|||||||
#include "Systems/TransformSystem.h"
|
#include "Systems/TransformSystem.h"
|
||||||
#include "Components/Player.h"
|
#include "Components/Player.h"
|
||||||
#include "Components/Tower.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);
|
//bool Damage(const Events::Damage &event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::map<EntityID, double> m_TimeSinceLastShot;
|
||||||
|
float Temp_m_TimeSinceLastShot;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -173,6 +173,8 @@
|
|||||||
<ClInclude Include="..\..\src\Components\Transform.h" />
|
<ClInclude Include="..\..\src\Components\Transform.h" />
|
||||||
<ClInclude Include="..\..\src\Components\Trigger.h" />
|
<ClInclude Include="..\..\src\Components\Trigger.h" />
|
||||||
<ClInclude Include="..\..\src\Components\TriggerRotate.h" />
|
<ClInclude Include="..\..\src\Components\TriggerRotate.h" />
|
||||||
|
<ClInclude Include="..\..\src\Components\Turret.h" />
|
||||||
|
<ClInclude Include="..\..\src\Components\TurretShot.h" />
|
||||||
<ClInclude Include="..\..\src\Components\Vehicle.h" />
|
<ClInclude Include="..\..\src\Components\Vehicle.h" />
|
||||||
<ClInclude Include="..\..\src\Components\SpawnPoint.h" />
|
<ClInclude Include="..\..\src\Components\SpawnPoint.h" />
|
||||||
<ClInclude Include="..\..\src\Components\Viewport.h" />
|
<ClInclude Include="..\..\src\Components\Viewport.h" />
|
||||||
|
|||||||
@@ -584,6 +584,12 @@
|
|||||||
<ClInclude Include="..\..\src\Components\Tower.h">
|
<ClInclude Include="..\..\src\Components\Tower.h">
|
||||||
<Filter>Game\Components</Filter>
|
<Filter>Game\Components</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\Components\Turret.h">
|
||||||
|
<Filter>Game\Components</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\Components\TurretShot.h">
|
||||||
|
<Filter>Physics\Components</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="..\..\src\Shaders\Fragment2.glsl">
|
<None Include="..\..\src\Shaders\Fragment2.glsl">
|
||||||
|
|||||||
Reference in New Issue
Block a user