Я пытаюсь создать самонаводящуюся ракету в AS3.Достаточно легко, когда вы хотите, чтобы она просто точно следовала точке - но я пытаюсь заставить ракету развернуться, если цель (цель) обходит ее.
Вот что у меня есть - это почтиработает, но, как вы можете видеть, это довольно глючно (особенно если мышь находится на влево ракеты (кажется, работает нормально, если она движется вправо).
http://projectavian.com/rocket.swf
Вот мой класс по Ракете:
package
{
import flash.display.Sprite;
import flash.geom.Point;
import flash.events.Event;
public class Rocket extends Sprite
{
// vars
public var target:Point;
private const _vel:Number = 5;
private const _steer:Number = Math.PI / 36;
private var _destAng:Number = 0;
private var _ang:Number = 0;
private var _xv:Number = 0;
private var _yv:Number = 0;
/**
* Constructor
*/
public function Rocket()
{
// temp graphics
graphics.lineStyle(2, 0);
graphics.lineTo(26, 0);
addEventListener(Event.ENTER_FRAME, _handle);
}
/**
* Called on dispatch of Event.ENTER_FRAME
*/
private function _handle(e:Event):void
{
_destAng = _getAng();
_xv = Math.cos(_ang) * _vel;
_yv = Math.sin(_ang) * _vel;
x += _xv;
y += _yv;
if(_ang > _destAng) _ang -= _steer;
if(_ang < _destAng) _ang += _steer;
rotation = _ang * 180 / Math.PI;
}
/**
* Get the angle to target
*/
private function _getAng():Number
{
if(target)
{
var yp:Number = target.y - y;
var xp:Number = target.x - x;
return Math.atan2(yp, xp);
}
return 0;
}
}
}
Я предполагаю, что эта логика не учитывает то, что заставляет ракету действовать странно, двигаясь влево:
if(_ang > _destAng) _ang -= _steer;
if(_ang < _destAng) _ang += _steer;
Здесьэто также код, который я использовал для создания моей ракеты, если это полезно:
var point:Point = new Point();
var rocket:Rocket = new Rocket();
rocket.target = point;
addChild(rocket);
addEventListener(Event.ENTER_FRAME, _handle);
function _handle(e:Event):void
{
point.x = mouseX;
point.y = mouseY;
}