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 physics = AddComponent<Components::Physics>(towerBase);
|
||||
physics->Mass = 100.f;
|
||||
physics->MotionType = Components::Physics::MotionTypeEnum::Fixed;
|
||||
// auto physics = AddComponent<Components::Physics>(towerBase);
|
||||
// physics->Mass = 100.f;
|
||||
// physics->MotionType = Components::Physics::MotionTypeEnum::Fixed;
|
||||
|
||||
auto model = AddComponent<Components::Model>(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<Components::Health>(towerBase);
|
||||
health->Amount = 50.f;
|
||||
|
||||
auto shape = CreateEntity(towerBase);
|
||||
auto shapetransform = AddComponent<Components::Transform>(shape);
|
||||
auto shapemesh = AddComponent<Components::MeshShape>(shape);
|
||||
shapemesh->ResourceName = "Models/Turret/Base/Base.obj";
|
||||
// auto shape = CreateEntity(towerBase);
|
||||
// auto shapetransform = AddComponent<Components::Transform>(shape);
|
||||
// auto shapemesh = AddComponent<Components::MeshShape>(shape);
|
||||
// shapemesh->ResourceName = "Models/Turret/Base/Base.obj";
|
||||
|
||||
CommitEntity(shape);
|
||||
//CommitEntity(shape);
|
||||
{
|
||||
auto towerGunRotation = CreateEntity(towerBase);
|
||||
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->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 transform = AddComponent<Components::Transform>(towerGunModel);
|
||||
@@ -696,11 +730,12 @@ EntityID GameWorld::CreateTower(EntityID parent, glm::vec3 pos, int playerID)
|
||||
towerComponent->GunBase = towerGunRotation;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
towerComponent->ID = playerID;
|
||||
|
||||
auto turretComponent = AddComponent<Components::Turret>(towerBase);
|
||||
turretComponent->ShotTemplate = m_ShotTemplate;
|
||||
turretComponent->ShotSpeed = 40.f;
|
||||
|
||||
CommitEntity(towerBase);
|
||||
|
||||
return towerBase;
|
||||
|
||||
@@ -88,6 +88,7 @@ private:
|
||||
void CreateTerrain();
|
||||
void CreateBase(glm::quat orientation, int playerID);
|
||||
std::vector<EntityID> m_WallDebrisTemplates;
|
||||
EntityID m_ShotTemplate;
|
||||
};
|
||||
|
||||
#endif // GameWorld_h__
|
||||
|
||||
+106
-12
@@ -5,18 +5,16 @@
|
||||
void Systems::TowerSystem::RegisterComponents( ComponentFactory* cf )
|
||||
{
|
||||
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()
|
||||
{
|
||||
//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<Components::Turret>(entity);
|
||||
if(!turretComponent)
|
||||
return;
|
||||
|
||||
auto players = m_World->GetComponentsOfType<Components::Player>();
|
||||
|
||||
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);
|
||||
if(!playerTransform)
|
||||
continue;
|
||||
|
||||
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 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;
|
||||
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 "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<EntityID, double> m_TimeSinceLastShot;
|
||||
float Temp_m_TimeSinceLastShot;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -173,6 +173,8 @@
|
||||
<ClInclude Include="..\..\src\Components\Transform.h" />
|
||||
<ClInclude Include="..\..\src\Components\Trigger.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\SpawnPoint.h" />
|
||||
<ClInclude Include="..\..\src\Components\Viewport.h" />
|
||||
|
||||
@@ -584,6 +584,12 @@
|
||||
<ClInclude Include="..\..\src\Components\Tower.h">
|
||||
<Filter>Game\Components</Filter>
|
||||
</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>
|
||||
<None Include="..\..\src\Shaders\Fragment2.glsl">
|
||||
|
||||
Reference in New Issue
Block a user