■ 斜方投射のシミュレーション
<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