Add Vector2D angleTo and Vector3D horizAngleTo function.
Use it to illustrate the building placement preview rotation and focusing of attacked units. Split from D1037 Patch By: temple This was SVN commit r20496.
This commit is contained in:
parent
7e8849366b
commit
8ee2a8aca2
@ -155,6 +155,15 @@ Vector2D.prototype.distanceTo = function(v)
|
||||
return Math.euclidDistance2D(this.x, this.y, v.x, v.y);
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the angle going from this position to v.
|
||||
* Angles are between -PI and PI. E.g., north is 0, east is PI/2.
|
||||
*/
|
||||
Vector2D.prototype.angleTo = function(v)
|
||||
{
|
||||
return Math.atan2(v.x - this.x, v.y - this.y);
|
||||
};
|
||||
|
||||
// Static 2D functions
|
||||
//
|
||||
// Static functions that return a new vector object.
|
||||
@ -334,6 +343,14 @@ Vector3D.prototype.horizDistanceTo = function(v)
|
||||
return Math.sqrt(this.horizDistanceToSquared(v));
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the angle going from this position to v.
|
||||
*/
|
||||
Vector3D.prototype.horizAngleTo = function(v)
|
||||
{
|
||||
return Math.atan2(v.x - this.x, v.z - this.z);
|
||||
};
|
||||
|
||||
// Static 3D functions
|
||||
//
|
||||
// Static functions that return a new vector object.
|
||||
|
@ -666,8 +666,7 @@ function handleInputBeforeGui(ev, hoveredObject)
|
||||
if (Math.abs(dragDeltaX) >= maxDragDelta || Math.abs(dragDeltaY) >= maxDragDelta)
|
||||
{
|
||||
// Rotate in the direction of the mouse
|
||||
var target = Engine.GetTerrainAtScreenPoint(ev.x, ev.y);
|
||||
placementSupport.angle = Math.atan2(target.x - placementSupport.position.x, target.z - placementSupport.position.z);
|
||||
placementSupport.angle = placementSupport.position.horizAngleTo(Engine.GetTerrainAtScreenPoint(ev.x, ev.y));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -4597,16 +4597,15 @@ UnitAI.prototype.FaceTowardsTarget = function(target)
|
||||
var cmpTargetPosition = Engine.QueryInterface(target, IID_Position);
|
||||
if (!cmpTargetPosition || !cmpTargetPosition.IsInWorld())
|
||||
return;
|
||||
var pos = cmpPosition.GetPosition();
|
||||
var targetpos = cmpTargetPosition.GetPosition();
|
||||
var angle = Math.atan2(targetpos.x - pos.x, targetpos.z - pos.z);
|
||||
var targetpos = cmpTargetPosition.GetPosition2D();
|
||||
var angle = cmpPosition.GetPosition2D().angleTo(targetpos);
|
||||
var rot = cmpPosition.GetRotation();
|
||||
var delta = (rot.y - angle + Math.PI) % (2 * Math.PI) - Math.PI;
|
||||
if (Math.abs(delta) > 0.2)
|
||||
{
|
||||
var cmpUnitMotion = Engine.QueryInterface(this.entity, IID_UnitMotion);
|
||||
if (cmpUnitMotion)
|
||||
cmpUnitMotion.FaceTowardsPoint(targetpos.x, targetpos.z);
|
||||
cmpUnitMotion.FaceTowardsPoint(targetpos.x, targetpos.y);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -124,6 +124,16 @@ var brokenVector = {
|
||||
TS_ASSERT_EQUALS(v8.y, 0);
|
||||
}
|
||||
|
||||
// Test Vector2D angleTo
|
||||
{
|
||||
let v1 = new Vector2D(1, 1);
|
||||
let v2 = new Vector2D(1, 3);
|
||||
let v3 = new Vector2D(3, 1);
|
||||
TS_ASSERT_EQUALS(v1.angleTo(v2), 0);
|
||||
TS_ASSERT_EQUALS(v1.angleTo(v3), Math.PI / 2);
|
||||
TS_ASSERT_EQUALS(v3.angleTo(v2), -Math.PI / 4);
|
||||
}
|
||||
|
||||
// Test Vector3D distance and compareLength
|
||||
{
|
||||
let v1 = new Vector3D(2, 5, 14);
|
||||
@ -160,3 +170,13 @@ var brokenVector = {
|
||||
TS_ASSERT_EQUALS(v5.y, 6);
|
||||
TS_ASSERT_EQUALS(v5.z, -3);
|
||||
}
|
||||
|
||||
// Test Vector3D horizAngleTo
|
||||
{
|
||||
let v1 = new Vector3D(1, 1, 1);
|
||||
let v2 = new Vector3D(1, 2, 3);
|
||||
let v3 = new Vector3D(3, 10, 1);
|
||||
TS_ASSERT_EQUALS(v1.horizAngleTo(v2), 0);
|
||||
TS_ASSERT_EQUALS(v1.horizAngleTo(v3), Math.PI / 2);
|
||||
TS_ASSERT_EQUALS(v3.horizAngleTo(v2), -Math.PI / 4);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user