//-------------------------------------------------------------------------------------------------------- //SineCurveShot(引数:7) //名の通り、サインカーブを描くショットを放ちます。 // //<注意事項> //・必ずMainLoop内でyieldを行ってください。(タスク弾なので当たり前 //・方向性のある弾丸(座薬等)は向きが変わりません。 //・振幅調整機能も使いづらいです。 // //<変数内訳> //x : 発射点X座標 //y : 発射点Y座標 //speed : 弾速 //angle : 発射角度。曲線の軸の方向 //bullet : 弾の画像 //ample : 振幅調整。基準幅の何倍にするか。現段階では波長によって基準幅が変わってしまうのであまり意味はない //wavlen : 波長。『発射点から自機への距離の半分』の整数倍にすると直撃を狙える・・・と思う。 // ---更新履歴--------------------------------------------------------------------------------------------- // 2008/05/07 新規作成 //-------------------------------------------------------------------------------------------------------- task SineCurveShot(x, y, speed, angle, bullet, ample, wavlen) { //生成と基本設定 let obj = Obj_Create(OBJ_SHOT); Obj_SetPosition(obj, x, y); ObjShot_SetGraphic(obj, bullet); //軸となる動きの設定 let vfx = speed * cos(angle); let vfy = speed * sin(angle); //諸変数用意 let AngRate = speed/wavlen * 360;//指定された波長になるような基準角の角速度 let m;//各フレームでの瞬間の傾き let dx;//X軸方向の変化 let dy;//Y〃 let vx;//最終的なX軸方向の移動 let vy;//   〃  Y  〃 let Count = 0;//フレームカウンター //削除されるまで実行 while(! Obj_BeDeleted(obj)) { m = cos(Count*AngRate);//導関数から傾きを求める dx = ample*m*speed*cos(angle-90);//ベクトルの合成を用いて変化量算出 dy = ample*m*speed*sin(angle-90); vx = vfx - dx;//同様に最終的な変化量を算出 vy = vfy - dy; Obj_SetX(obj, Obj_GetX(obj) + vx);//移動 Obj_SetY(obj, Obj_GetY(obj) + vy); Count++;//カウンター増加 yield; } }