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
|
||||
{
|
||||
//KilledBy,KilledByWhat is optional for now. It might be used later in the playerlog-system
|
||||
EntityID KilledBy;
|
||||
EntityID PlayerID;
|
||||
EntityWrapper Player;
|
||||
std::string KilledByWhat;
|
||||
};
|
||||
|
||||
@@ -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>
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user