DamageIndicatorSystem code looking good. Test working well. Sprite display fixed by Viktor

This commit is contained in:
verysecrethero
2016-02-09 15:38:21 +01:00
parent 0e9fb16399
commit 971fee4a0c
4 changed files with 37 additions and 15 deletions
+33 -9
View File
@@ -21,22 +21,46 @@ bool DamageIndicatorSystem::OnPlayerDamageTaken(Events::PlayerDamage& e)
{
auto test1 = (glm::vec3)e.PlayerShooter["Transform"]["Orientation"];
auto test2 = (glm::vec3)e.Player["Transform"]["Orientation"];
//calculate direction
auto enemyOrientation = glm::quat(((glm::vec3)e.PlayerShooter["Transform"]["Orientation"]));
//grab players direction
auto playerOrientation = glm::quat((glm::vec3)e.Player["Transform"]["Orientation"]);
//calculate difference in angle (quaternion math)
auto angle1 = glm::angle(playerOrientation);
auto angle2 = glm::angle(enemyOrientation);
auto quat = glm::angleAxis(angle2 - angle1, glm::vec3(0, 1, 0));
auto vec3Orientation = glm::eulerAngles(quat);
//get the position vectors, but ignore the y-height
auto enemyPosition = (glm::vec3) e.PlayerShooter["Transform"]["Position"];
auto playerPosition = (glm::vec3) e.Player["Transform"]["Position"];
enemyPosition.y = 0.0f;
playerPosition.y = 0.0f;
//calculate the enemy to player vector
auto enemyPlayerVector = glm::normalize((glm::vec3) playerPosition - enemyPosition);
//get angle from players current rotation, this angle is how much you rotate around the y-axis
auto playerAngle = glm::angle(playerOrientation);
auto playerRotationVector = glm::normalize(glm::rotateY(glm::vec3(0, 0, 1), playerAngle));
//dot product of players direction-vector and enemys-to-playervector will give the cos of the angle between the vectors
auto playerRotationDot = glm::dot(playerRotationVector, enemyPlayerVector);
//to get the angle between the vectors just do cos-inverse
auto angleBetweenVectors = glm::acos(playerRotationDot);
//rotate the direction-vector 90 degrees to get the players side-vector
auto playerSideVector = glm::normalize(glm::rotateY(glm::vec3(0, 0, 1), playerAngle + 1.57f));
//dot of sidevector positive = enemy is on the right side, dot sidevector negative = left side
auto playerSideVectorDot = glm::dot(playerSideVector, enemyPlayerVector);
if (playerSideVectorDot < 0) {
angleBetweenVectors = -angleBetweenVectors;
}
//LOG_INFO("vector angle %f %f %f %f", t1, t3, t4, enemyPlayerVector.x);
//load & set the "2d" sprite
auto entityFile = ResourceManager::Load<EntityFile>("Schema/Entities/SpriteTestTemporary.xml");
EntityFileParser parser(entityFile);
EntityID spriteID = parser.MergeEntities(m_World);
m_World->SetParent(spriteID, m_CurrentCamera);
auto cameraWrapper = EntityWrapper(m_World, spriteID);
cameraWrapper["Transform"]["Orientation"] = vec3Orientation;
auto spriteWrapper = EntityWrapper(m_World, spriteID);
//simply set the rotation z-wise to the angleBetweenVectors
spriteWrapper["Transform"]["Orientation"] = glm::vec3(0, 0, angleBetweenVectors);
return true;
}