我有点惭愧地问这个问题,但是我尝试了很多不同的事情并且无法使它发挥作用。
我有一个射击子弹的游戏,我已经制作了一个计算抛物线轨迹的代码,给出了一个角度和一个速度,但我正在尝试制作微积分以获得达到X所需的角度和速度点(用户敌人坦克),我无法按需要使它工作。
我目前的代码是:
var startingPointX:Number = globalCoord.x;
var startingPointY:Number = globalCoord.y;
var targetX:Number = tankPlayer.x;
var targetY:Number = tankPlayer.y;
//distance between user and enemy tank
var distanceTarget = Math.sqrt(( startingPointX - targetX ) * ( startingPointX - targetX ) + ( startingPointY - targetY ) * ( startingPointY - targetY ));
var fixedVel = (distanceTarget/10)*2;
var fixedG = bullet.g;
// launch angle
var o:Number = -(Math.asin((0.5 * Math.atan(fixedG * distanceTarget / fixedVel * fixedVel))) * 180 / Math.PI);
bullet.init(startingPointX, startingPointY, o, fixedVel);
并且子弹对象中实际将子弹定位在抛物线轨迹中的函数是:
public function init(x, y:Number, rot:Number, speed:Number) {
// set the start position
var initialMove:Number = 35.0;
this.x = x + initialMove * Math.cos(2 * Math.PI * rot / 360);
this.y = y + initialMove * Math.sin(2 * Math.PI * rot / 360);
this.rotation = rot;
//get speed
dx = speed * Math.cos(2 * Math.PI * rot / 360);
dy = speed * Math.sin(2 * Math.PI * rot / 360);
//animation
lastTime = getTimer();
addEventListener(Event.ENTER_FRAME,moveBullet);
}
public function moveBullet(event:Event)
{
//get the time passed
var timePassed:int = getTimer() - lastTime;
lastTime += timePassed;
//move bullet
dy += g * timePassed / 1000;
this.x += dx * timePassed / 1000;
this.y += dy * timePassed / 1000;
//bullet past the top of the screen
if (this.y < 0)
{
deleteBullet();
}
}
任何帮助都非常有用,谢谢! :d
此致 阴影。
答案 0 :(得分:4)
如果这是一个弹道学问题,那么你从A
点以v
的角度theta
投射一个粒子并且你想要它点{{1}其中T
和A
的y坐标匹配(即它们位于垂直于重力矢量矢量的平面上),然后您可以根据此等式计算所需的角度和速度(请参阅维基链接在哪里定义):
T
此处 R = (v * v * sin(2 * theta))/g
是从起点R
开始沿x
方向行进的距离。你面临的问题是你试图通过仅仅2点插入抛物线。有无限量的抛物线将插入2个点,而抛物线通过3个点是唯一的。从本质上讲,速度和角度有无限的选择,这样你就可以击中你的目标。
您需要修正角度或子弹的速度才能使用上面的等式来找到您需要的值。如果没有,你有无限数量的抛物线可以击中你的目标。
以上假设忽略了空气阻力。
编辑:因此,如果您已知道速度A
已经可以从上面的简单重新排列中获得v
:
theta
答案 1 :(得分:0)
根据@ mathematician1975的建议,我将代码解析为完美且完美无缺:D
var distanceTarget = startingPointX - targetX ;
var fixedVel = 100;
var fixedG = tmpB.g;
var o:Number = (0.5 * Math.atan((fixedG * distanceTarget / (fixedVel * fixedVel)))) * 180 / Math.PI;
//this is only necessary why the enemy tank is facing left
o -= 180;
我所做的是:
我希望有人会在将来发现它有用:D
此致 阴影。