大砲から砲弾を発射し、現実的な経路をたどらせようとしています。大砲の向きによって発射角度が変化します(マウスポインタの向きに自動で向きます)。だから私が理解しようとしているのは、角度と設定された速度が与えられたときに、放物線の経路に沿って砲弾を動かす方法です。
これは複雑な三角法を使用せずに行うことができ (高校では聞いたことがない)、ティックごとに 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);
}
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;
}
}
}