■ 斜方投射のシミュレーション
<Flash教材>
Flash CS3で作成した斜方投射のシミュレーション教材です。
|
<教材の説明>
物体を投げるときの初速度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