寻的导弹在AS3 [英] Homing missile in AS3
问题描述
我试图创建一个AS3寻的导弹。很容易,当你想将它遵循一个点完美的 - 但我努力让火箭不得不掉头如果目标(目标)绕过它
。下面是我已经得到了 - 这几乎是工作,但你可以看到它是相当出问题(尤其是如果鼠标到离开火箭(似乎工作确定,如果它的移动权)。
http://projectavian.com/rocket.swf
下面是我的火箭类:
包
{
进口flash.display.Sprite;
进口flash.geom.Point;
进口对象类型:flash.events.Event;
公共类火箭扩展Sprite
{
//瓦尔
公共变种目标:点;
私人常量_vel:数= 5;
私人常量_steer:数= Math.PI / 36;
私人VAR _destAng:数= 0;
私人VAR _ang:数= 0;
私人VAR _xv:数= 0;
私人VAR _yv:数= 0;
/ **
*构造函数
* /
公共职能火箭()
{
//临时图形
graphics.lineStyle(2,0);
graphics.lineTo(26,0);
的addEventListener(Event.ENTER_FRAME,_handle);
}
/ **
*拜会Event.ENTER_FRAME的派遣
* /
私有函数_handle(五:事件):无效
{
_destAng = _getAng();
_xv = Math.cos(_ang)* _vel;
_yv = Math.sin(_ang)* _vel;
X + = _xv;
Y + = _yv;
如果(_ang> _destAng)_ang - = _steer;
如果(_ang< _destAng)_ang + = _steer;
旋转= _ang * 180 / Math.PI;
}
/ **
*获取的角度为目标
* /
私有函数_getAng():数
{
如果(目标)
{
VAR YP:数= target.y - ÿ;
VAR XP:数= target.x - X;
返回Math.atan2(YP,XP);
}
返回0;
}
}
}
我猜这个逻辑不迎合任何导致导弹行事诡异左移:
如果(_ang> _destAng)_ang - = _steer;
如果(_ang< _destAng)_ang + = _steer;
这里也是code我都用来创建我的火箭,如果是有帮助的:
VAR点:点=新的点();
VAR火箭:火箭=新火箭();
rocket.target =点;
的addChild(火箭);
的addEventListener(Event.ENTER_FRAME,_handle);
功能_handle(五:事件):无效
{
point.x = mouseX;
point.y = mouseY的;
}
这应该为你工作。
公共类火箭扩展Sprite
{
//瓦尔
公共变种目标:点;
私人常量_vel:数= 5;
私人常量_steer:数= Math.PI / 36;
私人VAR _destAng:数= 0;
私人VAR _ang:数= 0;
私人VAR _xv:数= 0;
私人VAR _yv:数= 0;
公共常量速度:UINT = 50;
// TODO:从固定timespet得到这个
公共常量TIME_DELTA:数= 0.05;
公共常量RAD:数= 57.2957795;
公共常量DEG:数= 0.0174532925;
公共职能火箭()
{
//临时图形
graphics.lineStyle(2,0);
//机构应遵循的头
graphics.moveTo(-26,0);
graphics.lineTo(0,0);
的addEventListener(Event.ENTER_FRAME,_handle);
}
/ **
*拜会Event.ENTER_FRAME的派遣
* /
私有函数_handle(五:事件):无效
{
VAR一:数= _turnToFace(新点(x,y)的目标,this.rotation * Math.PI / 180,0.1);
VAR加载dirX:数= Math.cos(一);
VAR dirY中:数= Math.sin(一);
X + =(加载dirX)*速度* TIME_DELTA;
Y + =(dirY中)*速度* TIME_DELTA;
旋转= A * RAD;
}
私有函数_turnToFace(号码:点,F:点,CA:号码,turnSpeed:号码):号码
{
VAR XP:数= F.X - p.x;
VAR YP:数= f.y - p.y;
VAR desiredAngle:数= Math.atan2(YP,XP);
VAR的区别:数= _wrapAngle(desiredAngle - CA);
差= Math.max(-turnSpeed,Math.min(turnSpeed,差));
返回_wrapAngle(CA +差);
}
私有函数_wrapAngle(弧度:编号):号码
{
VAR PI2:数= Math.PI * 2;
而(弧度< -Math.PI)弧度+ = PI2;
而(弧度> Math.PI)弧度 - = PI2;
返回弧度;
}
}
I'm trying to create a homing missile in AS3. Easy enough when you want it to simply follow a point perfectly - but I'm trying to make the rocket have to turn around if the destination (target) bypasses it.
Here's what I've got - it almost works, but as you can see it's quite glitchy (particularly if the mouse is to the left of the rocket (seems to work OK if it's moving right).
http://projectavian.com/rocket.swf
Here's my Rocket class:
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;
}
}
}
I'm guessing this logic isn't catering for whatever is causing the missile to act strange moving left:
if(_ang > _destAng) _ang -= _steer;
if(_ang < _destAng) _ang += _steer;
Here is also the code I have used to create my Rocket, if it's helpful:
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;
}
This should work for you.
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;
public const SPEED:uint = 50;
// TODO: get this from fixed timespet
public const TIME_DELTA:Number = 0.05;
public const RAD:Number = 57.2957795;
public const DEG:Number = 0.0174532925;
public function Rocket()
{
// temp graphics
graphics.lineStyle(2, 0);
// body should follow head
graphics.moveTo(-26, 0);
graphics.lineTo(0, 0);
addEventListener(Event.ENTER_FRAME, _handle);
}
/**
* Called on dispatch of Event.ENTER_FRAME
*/
private function _handle(e:Event):void
{
var a:Number = _turnToFace(new Point(x, y), target, this.rotation * Math.PI / 180, 0.1);
var dirX:Number = Math.cos(a);
var dirY:Number = Math.sin(a);
x += (dirX) * SPEED * TIME_DELTA;
y += (dirY) * SPEED * TIME_DELTA;
rotation = a * RAD;
}
private function _turnToFace(p:Point, f:Point, ca:Number, turnSpeed:Number):Number
{
var xp:Number = f.x - p.x;
var yp:Number = f.y - p.y;
var desiredAngle:Number = Math.atan2(yp, xp);
var difference:Number = _wrapAngle(desiredAngle - ca);
difference = Math.max(-turnSpeed, Math.min(turnSpeed, difference));
return _wrapAngle(ca + difference);
}
private function _wrapAngle(radians:Number):Number
{
var pi2:Number = Math.PI * 2;
while(radians < -Math.PI) radians += pi2;
while(radians > Math.PI) radians -= pi2;
return radians;
}
}
这篇关于寻的导弹在AS3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!