Joh*_*hnW 3 flash actionscript-3 game-physics flash-cs6
我正试图从大炮发射一个炮弹,让它遵循一条现实的道路.火焰的角度根据大炮的方向而变化(自动定向到鼠标指针).所以我想弄清楚的是,当给定角度和设定速度时,如何沿着抛物线路径移动炮弹.
我已经读到这可以在没有复杂三角学的情况下完成(从未在高中学习过),并且可以通过在每个刻度上向yVelocity添加重力来简单地计算.但是,此刻,我不知道如何计算初始yVelocity(再次,取决于大炮方向).
你可以在这里看到当前的动画:http://kate.ict.op.ac.nz/~welfajw1/portfolio/videos/task3-assignment2.swf
这一切都在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);
}
Run Code Online (Sandbox Code Playgroud)
ball_mc代码:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你需要一点物理学.
必须使用您自己添加的某些条件来计算初始速度.一个例子是在按下鼠标时通过使用鼠标和加农炮之间的距离来计算初始速度.如果距离更大,则射弹将具有更大的速度,并且如果距离更小,则射弹将具有更小的速度.
您添加一个类型为ENTER_FRAME的事件侦听器.
我想这是2维动画,所以你必须在任何时间点找到当前的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;
}
Run Code Online (Sandbox Code Playgroud)
现在这里是弹丸轨迹的等同物.
x = xo + vxo·t
y = yo + vyo·t - 0.5·g·t ^ 2
哟=你的炮弹的初始高度
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
}
Run Code Online (Sandbox Code Playgroud)
这应该工作.我已多次使用此代码,效率高,而且简单.