ballistic projectile, range set by clicking
// forked from John_Blackburne's PB's ballistic code
package
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
[SWF(backgroundColor="#000000", frameRate=30)]
public class Main extends Sprite
{
private var ball : Shape = new Shape;
private var target : Shape = new Shape;
private var velocity : Number = 10.0;
private var vx : Number;
private var vy : Number;
private var tx:Number, ty:Number;
private var gravity : Number = 10 / stage.frameRate;
private var bHigh:Boolean = true;
private var txt: TextField;
public function Main():void
{
stage.addEventListener(MouseEvent.MOUSE_DOWN, click);
txt = new TextField();
txt.width = txt.height = 465;
txt.textColor = 0xffffff;
addChild(txt);
init();
}
private function init(_x:Number = 100, _y:Number = 200):void
{
// entry point
addEventListener(Event.ENTER_FRAME, update);
// create a ball to throw
// create the target
target.graphics.lineStyle(2, 0xffff00);
target.graphics.drawCircle( -5, -5, 10);
target.x = tx = _x;
target.y = ty = _y;
addChild(target);
ball.graphics.beginFill(0xffffff);
ball.graphics.drawCircle(-5, -5, 10);
ball.graphics.endFill();
ball.x = 400.0;
ball.y = ty;
addChild(ball);
// work out the angle to throw it at
var dx : Number = tx - ball.x; // try to make the ball land at (tx, ty)
var angle : Number = 0.5 * Math.asin(gravity * dx / (velocity * velocity));
if (bHigh) {angle = (-0.5 * Math.PI) - angle};
bHigh = !bHigh;
txt.text = "launch angle: " + String( 180 / Math.PI * angle);
// work out the velocity x,y components to start at that angle
vx = -Math.cos(angle) * velocity;
vy = Math.sin(angle) * velocity;
trace("launch velocity: ", vx, vy);
}
private function click(e:MouseEvent):void {
graphics.clear();
init(e.stageX, e.stageY);
}
private function update(e:Event = null):void
{
// apply gravity
vy += gravity;
// move the ball
ball.x += vx;
ball.y += vy;
graphics.beginFill(0x303030, 0.3);
graphics.drawCircle(ball.x - 5, ball.y - 5, 10);
// stop when we land on the ground
if (ball.y >= ty)
{
trace("ball landed at:", ball.x, ball.y);
removeEventListener(Event.ENTER_FRAME, update);
ball.y = ty;
}
}
}
}