DeathExplosion is now an XML file, changed PlayerDeathSystem accordingly. The effect should show as soon as the explosioneffect-fix is merged into master. TODO: remove the test
This commit is contained in:
@@ -10,8 +10,6 @@ namespace Events
|
|||||||
struct PlayerDeath : Event
|
struct PlayerDeath : Event
|
||||||
{
|
{
|
||||||
//KilledBy,KilledByWhat is optional for now. It might be used later in the playerlog-system
|
//KilledBy,KilledByWhat is optional for now. It might be used later in the playerlog-system
|
||||||
EntityID KilledBy;
|
|
||||||
EntityID PlayerID;
|
|
||||||
EntityWrapper Player;
|
EntityWrapper Player;
|
||||||
std::string KilledByWhat;
|
std::string KilledByWhat;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,7 +7,11 @@
|
|||||||
#include "Rendering/ESetCamera.h"
|
#include "Rendering/ESetCamera.h"
|
||||||
#include "Core/ConfigFile.h"
|
#include "Core/ConfigFile.h"
|
||||||
|
|
||||||
|
#include "Core/EntityFile.h"
|
||||||
|
#include "Core/EntityFileParser.h"
|
||||||
|
|
||||||
#include "Core/EPlayerDeath.h"
|
#include "Core/EPlayerDeath.h"
|
||||||
|
#include "Core/EPlayerDamage.h"
|
||||||
|
|
||||||
class PlayerDeathSystem : public ImpureSystem
|
class PlayerDeathSystem : public ImpureSystem
|
||||||
{
|
{
|
||||||
@@ -19,5 +23,9 @@ public:
|
|||||||
private:
|
private:
|
||||||
EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath;
|
EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath;
|
||||||
bool OnPlayerDeath(Events::PlayerDeath& e);
|
bool OnPlayerDeath(Events::PlayerDeath& e);
|
||||||
|
|
||||||
|
EventRelay<PlayerDeathSystem, Events::InputCommand> m_OnInputCommand;
|
||||||
|
bool OnInputCommand(const Events::InputCommand& e);
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Entity name="Explosion" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<Name>Hold Pos</Name>
|
||||||
|
<Time>0</Time>
|
||||||
|
<Speed>0</Speed>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Lifetime>
|
||||||
|
<Lifetime>8</Lifetime>
|
||||||
|
</c:Lifetime>
|
||||||
|
<c:ExplosionEffect>
|
||||||
|
<TimeSinceDeath>0</TimeSinceDeath>
|
||||||
|
<ExplosionDuration>8</ExplosionDuration>
|
||||||
|
<ExplosionOrigin X="-60.9153252" Y="0.767338753" Z="-76.4729843"/>
|
||||||
|
</c:ExplosionEffect>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/AssaultAnimated.mesh</Resource>
|
||||||
|
<Color A="1" B="0" G="0" R="1"/>
|
||||||
|
<Transparent>true</Transparent>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-60.9153252" Y="0.767338753" Z="-76.4729843"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
|
||||||
|
<Children>
|
||||||
|
<Entity name="Camera">
|
||||||
|
<Components>
|
||||||
|
<c:Lifetime>
|
||||||
|
<Lifetime>1</Lifetime>
|
||||||
|
</c:Lifetime>
|
||||||
|
<c:Camera>
|
||||||
|
<FOV>120</FOV>
|
||||||
|
<NearClip>0.1</NearClip>
|
||||||
|
<FarClip>10000</FarClip>
|
||||||
|
</c:Camera>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-60.9153252" Y="0.767338753" Z="-76.4729843"/>
|
||||||
|
<Orientation X="-0.7" Y="1.46" Z="0.8"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
|
||||||
|
</Entity>
|
||||||
@@ -21,7 +21,6 @@ bool HealthSystem::OnPlayerDamaged(Events::PlayerDamage& e)
|
|||||||
|
|
||||||
if (health <= 0.0) {
|
if (health <= 0.0) {
|
||||||
Events::PlayerDeath ePlayerDeath;
|
Events::PlayerDeath ePlayerDeath;
|
||||||
ePlayerDeath.PlayerID = e.Player.ID;
|
|
||||||
ePlayerDeath.Player = e.Player;
|
ePlayerDeath.Player = e.Player;
|
||||||
m_EventBroker->Publish(ePlayerDeath);
|
m_EventBroker->Publish(ePlayerDeath);
|
||||||
//Note: we will delete the entity in PlayerDeathSystem
|
//Note: we will delete the entity in PlayerDeathSystem
|
||||||
|
|||||||
@@ -3,69 +3,75 @@
|
|||||||
PlayerDeathSystem::PlayerDeathSystem(World* m_World, EventBroker* eventBroker)
|
PlayerDeathSystem::PlayerDeathSystem(World* m_World, EventBroker* eventBroker)
|
||||||
: System(m_World, eventBroker)
|
: System(m_World, eventBroker)
|
||||||
{
|
{
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_OnInputCommand, &PlayerDeathSystem::OnInputCommand);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_OnPlayerDeath, &PlayerDeathSystem::OnPlayerDeath);
|
EVENT_SUBSCRIBE_MEMBER(m_OnPlayerDeath, &PlayerDeathSystem::OnPlayerDeath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PlayerDeathSystem::OnInputCommand(const Events::InputCommand& e)
|
||||||
|
{
|
||||||
|
//testing: Jump > playerdamage
|
||||||
|
if (e.Command != "Jump") {
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0 = released
|
||||||
|
if (e.Value != 0) {
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
auto players = m_World->GetComponents("Player");
|
||||||
|
|
||||||
|
for (auto& cPlayer : *players) {
|
||||||
|
EntityWrapper player(m_World, cPlayer.EntityID);
|
||||||
|
Events::PlayerDamage e;
|
||||||
|
e.Player = player;
|
||||||
|
e.Damage = 50;
|
||||||
|
m_EventBroker->Publish(e);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void PlayerDeathSystem::Update(double dt)
|
void PlayerDeathSystem::Update(double dt)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PlayerDeathSystem::OnPlayerDeath(Events::PlayerDeath& e)
|
bool PlayerDeathSystem::OnPlayerDeath(Events::PlayerDeath& e)
|
||||||
{
|
{
|
||||||
//current components for player that we need
|
//LOAD THE XML
|
||||||
auto playerModelEWrapper = e.Player.FirstChildByName("PlayerModel");
|
auto deathEffect = ResourceManager::Load<EntityFile>("Schema/Entities/PlayerDeathExplosionWithCamera.xml");
|
||||||
auto playerEntityModel = playerModelEWrapper["Model"];
|
|
||||||
auto playerEntityAnimation = playerModelEWrapper["Animation"];
|
|
||||||
auto playerEntityTransform = playerModelEWrapper["Transform"];
|
|
||||||
|
|
||||||
//create new entity with those components
|
EntityFileParser parser(deathEffect);
|
||||||
//graphics bug: model must have an animationcomponent to be able to display it
|
EntityID deathEffectID = parser.MergeEntities(m_World);
|
||||||
auto newEntity = m_World->CreateEntity();
|
EntityWrapper deathEffectEW = EntityWrapper(m_World, deathEffectID);
|
||||||
ComponentWrapper& newEntityModel = m_World->AttachComponent(newEntity, "Model");
|
|
||||||
ComponentWrapper& newAnimationModel = m_World->AttachComponent(newEntity, "Animation");
|
//current components for player that we need
|
||||||
ComponentWrapper& newTransformModel = m_World->AttachComponent(newEntity, "Transform");
|
auto playerModelEW = e.Player.FirstChildByName("PlayerModel");
|
||||||
playerEntityModel.Copy(newEntityModel);
|
auto playerEntityModel = playerModelEW["Model"];
|
||||||
playerEntityAnimation.Copy(newAnimationModel);
|
auto playerEntityTransform = playerModelEW["Transform"];
|
||||||
playerEntityTransform.Copy(newTransformModel);
|
|
||||||
|
//copy the data from player to new playermodel
|
||||||
|
playerEntityModel.Copy(deathEffectEW["Model"]);
|
||||||
|
playerEntityTransform.Copy(deathEffectEW["Transform"]);
|
||||||
|
|
||||||
//change the animation speed and make sure the explosioneffect spawns at the players position
|
//change the animation speed and make sure the explosioneffect spawns at the players position
|
||||||
newAnimationModel["Speed"] = (double)0.0;
|
|
||||||
newEntityModel["Color"] = glm::vec4(1, 0, 0, 1);
|
|
||||||
newTransformModel["Position"] = (glm::vec3)e.Player["Transform"]["Position"];
|
|
||||||
newTransformModel["Scale"] = glm::vec3(1, 1, 1);
|
|
||||||
|
|
||||||
//add the explosion with a lifetime
|
|
||||||
ComponentWrapper& explosionEffect = m_World->AttachComponent(newEntity, "ExplosionEffect");
|
|
||||||
ComponentWrapper& lifeTime = m_World->AttachComponent(newEntity, "Lifetime");
|
|
||||||
(glm::vec3)explosionEffect["ExplosionOrigin"] = (glm::vec3)e.Player["Transform"]["Position"];
|
|
||||||
(double)explosionEffect["TimeSinceDeath"] = 0.0;
|
|
||||||
(double)explosionEffect["ExplosionDuration"] = 8.0;
|
|
||||||
(glm::vec4)explosionEffect["EndColor"] = glm::vec4(0, 0, 0, 1);
|
|
||||||
(bool)explosionEffect["Randomness"] = false;
|
|
||||||
(double)explosionEffect["RandomnessScalar"] = 1.0;
|
|
||||||
(glm::vec2)explosionEffect["Velocity"] = glm::vec2(0.1f, 0.1f);
|
|
||||||
(bool)explosionEffect["ColorByDistance"] = false;
|
|
||||||
(bool)explosionEffect["ExponentialAccelaration"] = false;
|
|
||||||
lifeTime["Lifetime"] = (double)8.0;
|
|
||||||
|
|
||||||
//create a camera (with lifetime) slightly above the player and look down at the player
|
|
||||||
auto cameraEntity = m_World->CreateEntity();
|
|
||||||
ComponentWrapper& thirdPersonCameraLifeTime = m_World->AttachComponent(cameraEntity, "Lifetime");
|
|
||||||
ComponentWrapper& thirdPersonCamera = m_World->AttachComponent(cameraEntity, "Camera");
|
|
||||||
ComponentWrapper& thirdPersonCameraTransform = m_World->AttachComponent(cameraEntity, "Transform");
|
|
||||||
auto pos = (glm::vec3)e.Player["Transform"]["Position"];
|
|
||||||
pos.y += 10.0f;
|
|
||||||
thirdPersonCameraTransform["Position"] = (glm::vec3)pos;
|
|
||||||
//http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/
|
//http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/
|
||||||
thirdPersonCameraTransform["Orientation"] = glm::vec3(-0.7f, 1.46f, 0.8f);
|
auto playerPosition = (glm::vec3)e.Player["Transform"]["Position"];
|
||||||
thirdPersonCamera["FOV"] = 120.0;
|
deathEffectEW["Transform"]["Position"] = playerPosition;
|
||||||
thirdPersonCamera["NearClip"] = 0.1;
|
deathEffectEW["ExplosionEffect"]["ExplosionOrigin"] = playerPosition;
|
||||||
thirdPersonCamera["FarClip"] = 10000.0;
|
|
||||||
thirdPersonCameraLifeTime["Lifetime"] = (double)1.0;
|
|
||||||
|
|
||||||
//set 3rd person camera
|
//camera (with lifetime) slightly above the player and looking down at the player
|
||||||
|
//camera will be positioned just above the player
|
||||||
|
glm::vec3 cameraPosition = glm::vec3(0, 10, 0);
|
||||||
|
auto cam = deathEffectEW.FirstChildByName("Camera");
|
||||||
|
cam["Transform"]["Position"] = cameraPosition;
|
||||||
Events::SetCamera eSetCamera;
|
Events::SetCamera eSetCamera;
|
||||||
eSetCamera.CameraEntity = EntityWrapper(m_World, cameraEntity);
|
eSetCamera.CameraEntity = cam;
|
||||||
m_EventBroker->Publish(eSetCamera);
|
m_EventBroker->Publish(eSetCamera);
|
||||||
|
|
||||||
//on deathanim done -> del entity
|
//on deathanim done -> del entity
|
||||||
|
|||||||
@@ -255,14 +255,14 @@ void CapturePointTest::TestSetup8()
|
|||||||
}
|
}
|
||||||
void CapturePointTest::DoTouchEvent(EntityID whoDidSomething, EntityID onWhatObject) {
|
void CapturePointTest::DoTouchEvent(EntityID whoDidSomething, EntityID onWhatObject) {
|
||||||
Events::TriggerTouch touchEvent;
|
Events::TriggerTouch touchEvent;
|
||||||
touchEvent.Entity = whoDidSomething;
|
touchEvent.Entity = EntityWrapper(m_World, whoDidSomething);
|
||||||
touchEvent.Trigger = onWhatObject;
|
touchEvent.Trigger = EntityWrapper(m_World, onWhatObject);
|
||||||
m_EventBroker->Publish(touchEvent);
|
m_EventBroker->Publish(touchEvent);
|
||||||
}
|
}
|
||||||
void CapturePointTest::DoLeaveEvent(EntityID whoDidSomething, EntityID onWhatObject) {
|
void CapturePointTest::DoLeaveEvent(EntityID whoDidSomething, EntityID onWhatObject) {
|
||||||
Events::TriggerLeave leaveEvent;
|
Events::TriggerLeave leaveEvent;
|
||||||
leaveEvent.Entity = whoDidSomething;
|
leaveEvent.Entity = EntityWrapper(m_World, whoDidSomething);
|
||||||
leaveEvent.Trigger = onWhatObject;
|
leaveEvent.Trigger = EntityWrapper(m_World, onWhatObject);
|
||||||
m_EventBroker->Publish(leaveEvent);
|
m_EventBroker->Publish(leaveEvent);
|
||||||
}
|
}
|
||||||
void CapturePointTest::TestSuccess1() {
|
void CapturePointTest::TestSuccess1() {
|
||||||
|
|||||||
Reference in New Issue
Block a user