#東方弾幕風 #Title[花符「摘み取られた花」] #Text[スレでの正葉曲線の話題に対し横からうp。 正葉曲線自体何のことかわからないので、こういうことを言ってるかどうかは知らない・・・。] #ScriptVersion[2] //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ script_enemy_main { let name = "花符「摘み取られた花」"; let imgBoss = "script\img\ExRumia.png"; // 初期位置 let xIni = GetCenterX; let yIni = GetCenterY; let startwait = 120; //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ @Initialize { CutIn(YOUMU, name, "", 0, 0, 0, 0); SetLife(4000); SetTimer(110); SetScore(1000000); LoadGraphic(imgBoss); setGraphicStop; SetTexture(imgBoss); SetShotAutoDeleteClip(15, 15, 15, 15); Tmain; } @MainLoop { yield; } @DrawLoop { DrawGraphic(GetX, GetY); } @Finalize { DeleteGraphic(imgBoss); } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //メインタスク task Tmain { yield; Tenemy; standBy; Tshot; } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //弾幕制御 task Tshot { let intervalA = 48; //鉄の輪一発毎の待機時間 let intervalB = 48 * 3; //サイクル間の待機時間 let quantity = 10; //1サイクルにおける鉄の輪発射回数 let petal = 5; //花弁の数 loop { loop(quantity) { shotMoreyaA(petal); wait(intervalA); } wait(intervalB); } } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //洩矢の鉄の輪と似た動きをさせる弾1セットの制御 task shotMoreyaA(petal) { let x; let y; let radiusA = 20; //花の中心の半径 let radiusB = 80; //花の半径 let density = petal * 2; //弾の密度(数値が低いほど密度が高い) let quantity = 180 * petal / density; //弾の数。変更不可。 let shiftA = (petal - 2) / petal * density; //花を描くための角変化率1。変更不可。 let shiftB = (petal - 1) / petal * 2 * density; //花を描くための角変化率2。変更不可。 let shiftC = density; //花を描くための角変化率3。変更不可。 let frame = 0; let dir = rand(0, 360); //花全体の向き loop(quantity) { x = GetX + radiusA * cos(shiftB * frame - 90 + dir) + (radiusB - radiusA) * sin(shiftC * frame) * cos(shiftA * frame + dir); y = GetY + radiusA * sin(shiftB * frame - 90 + dir) + (radiusB - radiusA) * sin(shiftC * frame) * sin(shiftA * frame + dir); shotMoreyaB(x, y); frame ++; } } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //洩矢の鉄の輪と似た動きをさせる弾一つ一つの制御 task shotMoreyaB(x, y) { let angle = atan2(y - GetY, x - GetX); //敵機から設置位置への角度 let radius = (y - GetY) / sin(angle); //敵機から設置位置までの距離 let Ref; //反射回数 let ANGLE; //弾の進行方向 //弾を作成 let obj = Obj_Create(OBJ_SHOT); Obj_SetAngle(obj, angle); //敵機から設置位置までの距離に応じて色と反射回数を設定 if(radius > 65) { ObjShot_SetGraphic(obj, GREEN01); Ref = 0; } else if(radius < 40) { ObjShot_SetGraphic(obj, RED01); Ref = 2; } else { ObjShot_SetGraphic(obj, YELLOW01); Ref = 1; } //弾を敵機から設置位置まで減速しながら移動させる Obj_SetPosition(obj, GetX, GetY); let p = 1; while((1 - p) * 1.05 < 1) { Obj_SetPosition(obj, GetX + (1-p) * radius * 1.05 * cos(angle), GetY + (1-p) * radius * 1.05 * sin(angle)); p = p * 0.93; yield; } //敵機から自機への角度を取得 ANGLE = atan2(GetPlayerY - GetY, GetPlayerX - GetX); wait(15); //弾を取得した角度に設定 Obj_SetAngle(obj, ANGLE); //弾を加速させる while(Obj_GetSpeed(obj) < 1.5) { Obj_SetSpeed(obj, Obj_GetSpeed(obj) + 0.15); yield; } Obj_SetSpeed(obj, 1.5); //後は反射回数が0になるまで反射させる while(Obj_BeDeleted(obj) == false) { if(Obj_GetX(obj) <= GetClipMinX) { //左端反射 if(Ref <= 0) {break;} Obj_SetAngle(obj, 180 - Obj_GetAngle(obj)); Obj_SetX(obj, GetClipMinX * 2 - Obj_GetX(obj)); Ref--; } if(Obj_GetX(obj) >= GetClipMaxX) { //右端反射 if(Ref <= 0) {break;} Obj_SetAngle(obj, 180 - Obj_GetAngle(obj)); Obj_SetX(obj, GetClipMaxX * 2 - Obj_GetX(obj)); Ref--; } if(Obj_GetY(obj) <= GetClipMinY) { //上端反射 if(Ref <= 0) {break;} Obj_SetAngle(obj, - Obj_GetAngle(obj)); Obj_SetY(obj, GetClipMinY * 2 - Obj_GetY(obj)); Ref--; } if(Obj_GetY(obj) >= GetClipMaxY) { //下端反射 if(Ref <= 0) {break;} Obj_SetAngle(obj, - Obj_GetAngle(obj)); Obj_SetY(obj, GetClipMaxY * 2 - Obj_GetY(obj)); Ref--; } yield; } } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 初期位置へ移動 sub standBy { let wIni = 120; SetMovePosition02(xIni, yIni, wIni); setGraphicMove; wait(wIni); } // グラフィックの設定 sub setGraphicStop { SetGraphicRect( 0, 0, 64, 64); } sub setGraphicPose { SetGraphicRect( 64, 0, 128, 64); } sub setGraphicLeft { SetGraphicRect(128, 0, 192, 64); } sub setGraphicRight { SetGraphicRect(192, 0, 256, 64); } sub setGraphicMove { if(GetSpeedX < - 0.02) { setGraphicLeft; } else if(GetSpeedX > 0.02) { setGraphicRight; } else { setGraphicStop; } } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //敵の当たり判定を設置 task Tenemy { loop{ SetCollisionA(GetX, GetY, 24); SetCollisionB(GetX, GetY, 24); yield; } } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ //wフレーム待機 function wait(w) { loop(w) { yield; } } }