Actionscript 3 在闪光灯中给定角度和速度时,计算对象的轨迹

Actionscript 3 在闪光灯中给定角度和速度时,计算对象的轨迹,actionscript-3,flash,game-physics,flash-cs6,Actionscript 3,Flash,Game Physics,Flash Cs6,我正试图从大炮上发射一个炮弹,并让它沿着一条现实的路径行进。射击角度根据大炮的方向而变化(自动定位到鼠标指针)。所以我想弄清楚的是,当给定一个角度和一个设定的速度时,如何沿着抛物线路径移动炮弹 我读过,这可以不用复杂的三角学(高中时从未听过),也可以简单地通过在每一个刻度上加上重力来计算。然而,在这一刻,我不知道如何计算初始yVelocity(同样,取决于大炮方向) 您可以在此处看到当前动画: 这些都是在AS3中完成的,我的代码如下: 主时间线代码: import flash.display.*

我正试图从大炮上发射一个炮弹,并让它沿着一条现实的路径行进。射击角度根据大炮的方向而变化(自动定位到鼠标指针)。所以我想弄清楚的是,当给定一个角度和一个设定的速度时,如何沿着抛物线路径移动炮弹

我读过,这可以不用复杂的三角学(高中时从未听过),也可以简单地通过在每一个刻度上加上重力来计算。然而,在这一刻,我不知道如何计算初始yVelocity(同样,取决于大炮方向)

您可以在此处看到当前动画:

这些都是在AS3中完成的,我的代码如下:

主时间线代码:

import flash.display.*;
import flash.events.*;
import flash.geom.*;

var cannonball:ball_mc;
var angleDegree;

myCannon.addEventListener(Event.ENTER_FRAME, cannonEnterFrame);

function cannonEnterFrame(pEvt)
{
    var mc = myCannon;
    var mg = myCannon.myGun;

    //find angle for orientation
    var angleRadian = Math.atan2(mouseY - mc.y, mouseX - mc.x);

    //convert to degrees
    angleDegree = angleRadian * 180 / Math.PI;

    //limit rotation
    if(angleDegree > -63 && angleDegree < 20)
        mg.rotation = angleDegree;
}

stage.addEventListener(Event.ENTER_FRAME, stageRefresh);

function stageRefresh(pEvt)
{
    if (cannonball)
    {
        //move every "tick"
        cannonball.move();
    }
}

stage.addEventListener(MouseEvent.CLICK, mouseClicked);

function mouseClicked(pEvt)
{
    //starting position of the ball
    cannonball = new ball_mc(100, 475);

    //SEND IN INITIAL x, y VELOCITIES
    cannonball.fire(20, angleDegree);

    //add to stage
    stage.addChild(cannonball);
}
package 
{

    import flash.display.MovieClip;
    import flash.sensors.Accelerometer;
    import flashx.textLayout.formats.Float;


    public class ball_mc extends MovieClip
    {
        //constant gravity
        public static const g:Number = 2;

        //starting velocities
        private var ux:Number;
        private var uy:Number;

        public function ball_mc(startX:int, startY:int)
        {
            x = startX;
            y = startY;
        }

        public function fire(vx:Number, vy:Number):void
        {
            ux = vx;
            uy = vy;
        }

        public function move():void
        {
            //distance moved in x dir
            var sx:Number = ux; 
            //new velocity in y dir
            var vy:Number = uy + g;
            //distance moved in y dir
            var sy:Number = uy + g/2;

            //apply movement
            x += sx;
            y += sy;

            //save new y velocity
            uy = vy;
        }
    }
}

你需要一点物理知识

必须使用您自己添加的一些标准来计算初始速度。例如,按下鼠标时,使用鼠标和大炮之间的距离计算初始速度。如果距离越大,射弹的速度越大,如果距离越小,射弹的速度越小

您可以添加类型为ENTER\ U FRAME的事件侦听器

我猜这是二维动画,所以你必须在任何时间点找到当前的x和y

下面是一些代码:

var TimeperFrame:Number = 1/fps //fps is not a constant, here you should add a number, a value that you previously added in fla. document properties. I usualy use 60 fps
var Time:Number = 0;

addEventListener(ENTER_FRAME, movingCannonBall);
function movingCannonBall(e:Event):void
{
   Time += TimeperFrame;
}
这是弹丸的弹道方程

x=xo+vxo·t

y=yo+vyo·t-0.5·g·t^2

yo=炮弹的初始高度

vyo=初始y速度;vyo=vo·sinθ

t=时间流逝,我们通过上限代码控制它

g=地球表面的加速度(9,81 m/s^2)

xo=起动的初始距离

vxo=初始x速度;vxo=vo·cosθ

现在在上面的代码中,我们添加了这些等式,它应该如下所示:

var TimeperFrame:Number = 1/fps
var Time:Number = 0;
var initx: Number = cannonball.x;
var inity: Number = cannonball.y;
var initVelocity: Number = (you define initial Velocity by your criteria)
var G: Number = 9.81;

addEventListener(ENTER_FRAME, movingCannonBall);
function movingCannonBall(e:Event):void
{
   Time += TimeperFrame;
   cannonball.x = initx + Math.cos(angle) * initVelocity * Time;
   cannonball.y = inity + Math.sin(angle) * initVelocity * Time - G * Time * Time * 0.5
}

这应该行得通。我已经多次使用此代码,它既高效又简单。

它可以正常工作。这段代码的问题在于Flash的坐标系与生成的圆弧相反。因此,物体射击下降(在上升弧期间,当cannonball.y增加时),然后上升(当cannonball.y减少时)。需要有一种方法来转换为Flash的坐标系。