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:
verysecrethero
2016-02-02 17:18:12 +01:00
parent 7236da09b4
commit 5e472cd69c
6 changed files with 114 additions and 55 deletions
-2
View File
@@ -10,8 +10,6 @@ namespace Events
struct PlayerDeath : Event
{
//KilledBy,KilledByWhat is optional for now. It might be used later in the playerlog-system
EntityID KilledBy;
EntityID PlayerID;
EntityWrapper Player;
std::string KilledByWhat;
};
+8
View File
@@ -7,7 +7,11 @@
#include "Rendering/ESetCamera.h"
#include "Core/ConfigFile.h"
#include "Core/EntityFile.h"
#include "Core/EntityFileParser.h"
#include "Core/EPlayerDeath.h"
#include "Core/EPlayerDamage.h"
class PlayerDeathSystem : public ImpureSystem
{
@@ -19,5 +23,9 @@ public:
private:
EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath;
bool OnPlayerDeath(Events::PlayerDeath& e);
EventRelay<PlayerDeathSystem, Events::InputCommand> m_OnInputCommand;
bool OnInputCommand(const Events::InputCommand& e);
};
#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>
-1
View File
@@ -21,7 +21,6 @@ bool HealthSystem::OnPlayerDamaged(Events::PlayerDamage& e)
if (health <= 0.0) {
Events::PlayerDeath ePlayerDeath;
ePlayerDeath.PlayerID = e.Player.ID;
ePlayerDeath.Player = e.Player;
m_EventBroker->Publish(ePlayerDeath);
//Note: we will delete the entity in PlayerDeathSystem
+54 -48
View File
@@ -3,69 +3,75 @@
PlayerDeathSystem::PlayerDeathSystem(World* m_World, EventBroker* eventBroker)
: System(m_World, eventBroker)
{
EVENT_SUBSCRIBE_MEMBER(m_OnInputCommand, &PlayerDeathSystem::OnInputCommand);
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)
{
}
bool PlayerDeathSystem::OnPlayerDeath(Events::PlayerDeath& e)
{
//current components for player that we need
auto playerModelEWrapper = e.Player.FirstChildByName("PlayerModel");
auto playerEntityModel = playerModelEWrapper["Model"];
auto playerEntityAnimation = playerModelEWrapper["Animation"];
auto playerEntityTransform = playerModelEWrapper["Transform"];
//LOAD THE XML
auto deathEffect = ResourceManager::Load<EntityFile>("Schema/Entities/PlayerDeathExplosionWithCamera.xml");
//create new entity with those components
//graphics bug: model must have an animationcomponent to be able to display it
auto newEntity = m_World->CreateEntity();
ComponentWrapper& newEntityModel = m_World->AttachComponent(newEntity, "Model");
ComponentWrapper& newAnimationModel = m_World->AttachComponent(newEntity, "Animation");
ComponentWrapper& newTransformModel = m_World->AttachComponent(newEntity, "Transform");
playerEntityModel.Copy(newEntityModel);
playerEntityAnimation.Copy(newAnimationModel);
playerEntityTransform.Copy(newTransformModel);
EntityFileParser parser(deathEffect);
EntityID deathEffectID = parser.MergeEntities(m_World);
EntityWrapper deathEffectEW = EntityWrapper(m_World, deathEffectID);
//current components for player that we need
auto playerModelEW = e.Player.FirstChildByName("PlayerModel");
auto playerEntityModel = playerModelEW["Model"];
auto playerEntityTransform = playerModelEW["Transform"];
//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
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/
thirdPersonCameraTransform["Orientation"] = glm::vec3(-0.7f, 1.46f, 0.8f);
thirdPersonCamera["FOV"] = 120.0;
thirdPersonCamera["NearClip"] = 0.1;
thirdPersonCamera["FarClip"] = 10000.0;
thirdPersonCameraLifeTime["Lifetime"] = (double)1.0;
auto playerPosition = (glm::vec3)e.Player["Transform"]["Position"];
deathEffectEW["Transform"]["Position"] = playerPosition;
deathEffectEW["ExplosionEffect"]["ExplosionOrigin"] = playerPosition;
//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;
eSetCamera.CameraEntity = EntityWrapper(m_World, cameraEntity);
eSetCamera.CameraEntity = cam;
m_EventBroker->Publish(eSetCamera);
//on deathanim done -> del entity
+4 -4
View File
@@ -255,14 +255,14 @@ void CapturePointTest::TestSetup8()
}
void CapturePointTest::DoTouchEvent(EntityID whoDidSomething, EntityID onWhatObject) {
Events::TriggerTouch touchEvent;
touchEvent.Entity = whoDidSomething;
touchEvent.Trigger = onWhatObject;
touchEvent.Entity = EntityWrapper(m_World, whoDidSomething);
touchEvent.Trigger = EntityWrapper(m_World, onWhatObject);
m_EventBroker->Publish(touchEvent);
}
void CapturePointTest::DoLeaveEvent(EntityID whoDidSomething, EntityID onWhatObject) {
Events::TriggerLeave leaveEvent;
leaveEvent.Entity = whoDidSomething;
leaveEvent.Trigger = onWhatObject;
leaveEvent.Entity = EntityWrapper(m_World, whoDidSomething);
leaveEvent.Trigger = EntityWrapper(m_World, onWhatObject);
m_EventBroker->Publish(leaveEvent);
}
void CapturePointTest::TestSuccess1() {