■ 斜方投射のシミュレーション

<Flash教材>

 Flash CS3で作成した斜方投射のシミュレーション教材です。

V速度
a角度
e反発係数

<教材の説明>

物体を投げるときの初速度vと角度a、地面との反発係数eを、 下のボックスから選択します。

再生ボタンを押すと物体が投射されます。

長さの単位はすべてメートルで、 時間的なスケールも実際と同じにしてあります。

<ActionScript>

1フレーム目の ActionScript
//斜方投射の初期値
var v:Number = 20 ;//速度
var a:Number = 30;//角度
var e:Number = 0.8;//反発係数

2フレーム目の ActionScript
//enterFrameイベントや、マウスクリックを無効にする
_mc.removeEventListener(Event.ENTER_FRAME, xEnter1);
playB_btn.removeEventListener(MouseEvent.CLICK, xBClick);
playC_btn.removeEventListener(MouseEvent.CLICK, xCClick);
playA_btn.removeEventListener(MouseEvent.CLICK, xA_Click);

//一時停止ボタンを隠して、再生ボタンを表示
playA_btn.visible = true;
playC_btn.visible = false;

//座標フィールド、物体、矢印の初期位置
x_txt.x = 75;
y_txt.y = 262.3;
x_txt.text = "0.000";
y_txt.text = "0.000";
_mc.x = 90;
_mc.y = 270.3;
_mc.visible = true;
x_mc.x = 90;
y_mc.y = 270.3;

stop();//再生が押されるまでストップ

playA_btn.addEventListener(MouseEvent.CLICK, xAClick);
function xAClick(evt) {
	gotoAndPlay("a2");//3フレーム目に移動
	
	//再生ボタンを隠して、一時停止ボタンを表示
	playA_btn.visible = false;
	playC_btn.visible = true;
}

//コンボボックスの設定
combB1.addEventListener(Event.CHANGE, changeHandlerCB1);
combB2.addEventListener(Event.CHANGE, changeHandlerCB2);
combB3.addEventListener(Event.CHANGE, changeHandlerCB3);

//コンボボックスからv,a,eを選択
function changeHandlerCB1(e1:Event):void {
  var c1:String = ComboBox(e1.target).selectedItem.data;
  v = Number(c1)*2 + 20;
}

function changeHandlerCB2(e2:Event):void {
  var c2:String = ComboBox(e2.target).selectedItem.data;
  a = Number(c2)*5 + 30;
}

function changeHandlerCB3(e3:Event):void {
  var c3:String = ComboBox(e3.target).selectedItem.data;
  e = Number(c3)*0.1 + 0.2;
}

3フレーム目の ActionScript
var vx:Number = v*Math.cos(a*Math.PI/180);//水平速度
var vy:Number = v*Math.sin(a*Math.PI/180);//鉛直速度

function fun1(t1:Number):Number {
return vx*t1;//時刻t1におけるx変位
}
function fun2(t2:Number):Number {
return vy*t2 - 0.5*9.8* t2 * t2;//時刻t2におけるy変位
}

//t1,t2の初期値
var t1:Number = 0.04;
var t2:Number = 0.04;

playA_btn.removeEventListener(MouseEvent.CLICK, xAClick);
	//50fpsなので1フレームにつき0.02秒経過するため、まずt1=t2=0.02(s)を計算する。
	//また物体の変位のスケールを5倍にする。
	_mc.x = 90 + 5*fun1(0.02);
	_mc.y = 270.3 - 5*fun2(0.02);//上向きがy<0なためマイナス符号がつく
	//矢印と物体の位置
	x_mc.x = _mc.x;
	y_mc.y = _mc.y;
	//座標フィールドと矢印の位置
	x_txt.x = x_mc.x - 15;
	y_txt.y = y_mc.y - 8;
	//時刻0.02(s)での座標を表示
	x_txt.text = String(fun1(0.02));
	y_txt.text = String(fun2(0.02));
	gotoAndPlay("a2");//同じフレームに戻る。次は0.04(s)
	
_mc.addEventListener(Event.ENTER_FRAME, xEnter1);
function xEnter1(evt) {
	_mc.x = 90 + 5*fun1(t1);
	_mc.y = 270.3 - 5*fun2(t2);
	//矢印と物体の位置
	x_mc.x = _mc.x;
	y_mc.y = _mc.y;
	//座標フィールドと矢印の位置
	x_txt.x = x_mc.x - 15;
	y_txt.y = y_mc.y - 8;
	//時刻t1,t2での座標を表示
	x_txt.text = String(fun1(t1));
	y_txt.text = String(fun2(t2));
	//t1,t2を0.02増やして、同じフレームに戻る
	t1 += 0.02;	
	t2 += 0.02;
	gotoAndPlay("a2");		
	
	//x軸から下にはみ出した場合
	if (fun2(t2) < 0){
		_mc.y = 270.3;//物体の位置を修正する
		y_mc.y = 270.3;
		y_txt.text = "0.000";
		t2 = 0.02;//y時刻を投射のときに戻す
		vy *= e;//y方向の速さは、反発係数だけ遅くなる
	}
	//x軸の右端を越えた場合
	if (_mc.x > 512){
		gotoAndPlay("a1");//初期状態に戻る
	}
		
playB_btn.addEventListener(MouseEvent.CLICK, xBClick);
playC_btn.addEventListener(MouseEvent.CLICK, xCClick);
}

//停止
function xBClick(evt) {
	_mc.removeEventListener(Event.ENTER_FRAME, xEnter1);
	gotoAndPlay("a1");//初期状態へ
}

//一時停止
function xCClick(evt) {
	stop();
	//再生ボタンを出現させる	
	playC_btn.visible = false;
	playA_btn.visible = true;
	_mc.removeEventListener(Event.ENTER_FRAME, xEnter1);
	playA_btn.addEventListener(MouseEvent.CLICK, xA_Click);
}

function xA_Click(evt) {
	_mc.addEventListener(Event.ENTER_FRAME, xEnter1);
	//一時停止ボタンに変わる
	playC_btn.visible = true;
	playA_btn.visible = false;
}


>>TOP