Libgdx Melee Attack Collision Detection
Solution 1:
If you just want to avoid enemies in your back being hit you could check if you are facing them. I'll take it you have a direction Vector for movement, check the difference in rotation of that Vector vs the vector calculated based on your position and the enemy.
Something like this (Disclaimer: out of my head, not sure if this work and just to give you an idea):
float yourAngle = direction.angle();
float enemyAngle = newVector2(enemyPos.x - playerPos.X, enemyPos.y - playerPos.y).angle();
if (yourAngle - enemyAngle < 30 && yourAngle - enemyAngle > -30) //enemy within a 60 degree cone in front of you.
This might not be the ideal solution but it sure is a cheap solution and it might work very well.
Solution 2:
These are what I used to check if the enemy object is within the 'field of view' of the hero (Working code):
/**
*
* @param localAngle - the current yaw of the Player
* @param angleTarget - the angle between the player and the target receipent of the attack -- use RotationHelper.angle() method
* @param offset - the difference in localAngle(hero) and angleTarget(enemy)
* @return
*/publicstaticfloatangleDifference(float localAngle, float angleTarget, int offset){
float newLocalAngle = (convert180to360(localAngle) + offset) % 360;
AppLog.log("ANGLE_DIFFERENCE2", "localAngle(yaw, degrees, with offset): " + newLocalAngle + ", angleTarget: " + angleTarget);
float result = 180 - Math.abs(Math.abs(newLocalAngle - angleTarget) - 180);
AppLog.log("ANGLE_DIFFERENCE2", "result : " + result);
AppLog.log("ANGLE_DIFFERENCE2", "==================================");
return result;
}
publicstaticfloatangle(Vector3 vectorA, Vector3 vectorB){
returnnewVector2(vectorB.x - vectorA.x, (-vectorB.z) - (-vectorA.z)).angle();
}
publicstaticfloatconvert180to360(float originalAngle){
float newAngle = 0;
if(originalAngle < 0) {
newAngle = (originalAngle + 180) + 180;
} else {
newAngle = originalAngle;
}
return newAngle;
}
Thanks to @Menno Gouw for the idea on getting the angle from Vector3.
And the code below is how I used these helper methods:
float angleTarget = RotationHelper.angle(hero.transform.getTranslation(hero.tmpVector), enemy.transform.getTranslation(enemy.tmpVector));
float angleDifference = RotationHelper.angleDifference(hero.transform.getRotation(playerObject.tmpRotation).nor().getYaw(), angleTarget, CHARACTER_TO_WORLD_ROTATION_OFFSET);
AppLog.log("ANGLE_DIFFERENCE2", " angle from point hero to enemy): " + angleTarget);
if(angleDifference < VIEW_ANGLE_THRESHOLD) { //use 'angleDifference < VIEW_ANGLE_THRESHOLD'
enemy.hurt(hero.stats.damage);
AppLog.log("HERO_STATE", "Enemy monkey hit!");
}
if(enemy.stats.hp <= 0) {
AppLog.log("ENEMY_STATE", "Dead monkey");
//TODO: Remove monkey from game
enemy.die();
instances.removeValue(gameObject, true);
}
Hope this helps you if you're encountering the same issue. Feel free to make changes if there are improvements or issues with this.
Post a Comment for "Libgdx Melee Attack Collision Detection"