Turret able to shoot, no collision event yet.

This commit is contained in:
Tleety
2014-06-05 02:54:44 +02:00
parent 93c4805a22
commit ccb3d6d84f
8 changed files with 214 additions and 23 deletions
+22
View File
@@ -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__
+25
View File
@@ -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
View File
@@ -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;
+1
View File
@@ -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
View File
@@ -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
View File
@@ -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;
};
+2
View File
@@ -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">