#東方弾幕風 #Title[リニアモーターカー] #Text[Xキー:上に加速 Cキー:下に加速] #ScriptVersion[2] script_enemy_main { //共通初期設定 #include_function ".\INCLUDE\BOSS_INI.txt" let name = "リニアモーターカー"; let wIni = 100; let objshot = []; let magshot = []; @Initialize { SetMovePosition02(GetCenterX, GetClipMinY + 120, wIni); SetX(GetCenterX - 120); SetY(GetClipMinY + 120); SetPlayerX(100); ForbidBomb(true); //thMCutIn(1,name); SetLife(2500); //ライフ SetTimer(350); //タイマー //SetScore(4000000); //ボーナススコア LoadGraphicthM; SetTexture(imgBoss); SetInvincibility(wIni); SetDamageRate(50, 50); TMain; } @MainLoop { SetCollisionA(GetX, GetY, 24); SetCollisionB(GetX, GetY, 24); yield; } @DrawLoop { BossDraw(1); } @Finalize { SpellClear; DeleteGraphic(imgBoss); } @BackGround { BgDraw; } //========================================================================================== // メインタスク(普通はここ以降から編集してください) task TMain { yield; loop(wIni) { yield; } Shot; } //通常ショット task Shot{ let y = 80; loop(11){ CreateShot01(GetCenterX - 40, y, 0, 90, US_BALL_M_WHITE, 0); CreateShot01(GetCenterX + 40, y, 0, 90, US_BALL_M_WHITE, 0); y += 32; } ShotA(GetCenterX , 20, 0, 90, -3.5, 5, 8, false); ShotA(GetCenterX - 40, 300, 0, 90, +1, 5, 8, true); ShotA(GetCenterX + 40, 300, 0, 90, +1, 5, 8, true); } //========================================================================================== // w フレームだけ待つ function __wait(w) { loop(w) { yield; } } //ショットA本体タスク //◆主な動作 // 磁力を表します(赤色:負 緑色:正) // このタスクは相当重たいので、あまり多く呼び出すのは止めましょう // //位置、磁力(正負)、初速度、角度、半径、最大速度、その場で停止するかどうか task ShotA(let x, let y, let speed, let angle, let mag, let r, let maxspeed, let stopflag){ //弾タスク初期化 let count = 0; //カウント let stop = false; //停止するかどうか let i = 0; //ループカウンタ let K = 500; //透磁率の定数のつもり(詳しくは電気関係の本を読んで下さい) let tcolor = [US_BALL_M_GREEN, US_BALL_M_RED,US_BALL_M_WHITE][mag < 0]; let obj = Obj_Create(OBJ_SHOT);//弾オブジェクトを作成 objshot = objshot ~ [obj]; magshot = magshot ~ [mag]; Obj_SetX(obj, x);//x座標設定 Obj_SetY(obj, y);//y座標設定; Obj_SetSpeed(obj, speed);//速度設定 Obj_SetAngle(obj, angle);//移動角度設定 ObjShot_SetGraphic(obj, tcolor);//画像設定 Obj_SetAutoDelete(obj,false);//画面外に出たら弾を消す ObjShot_SetDelay(obj, 5); ObjShot_SetBombResist(obj,true); ObjShot_ToItem(obj,false); while( !Obj_BeDeleted(obj) ){ //削除されるまでループを実行 //初期設定 i = 0; speed *= 0.98; //前フレームでの速度を持つ割合(1以下) stop = false; loop(length(objshot)){ //自身以外を計算の対象とする if(objshot[i] != obj){ let AngleToShot = atan2(Obj_GetY(objshot[i]) - Obj_GetY(obj), Obj_GetX(objshot[i]) - Obj_GetX(obj)) - 180; let DistToShot = Dist(Obj_GetX(objshot[i]), Obj_GetY(objshot[i]), Obj_GetX(obj), Obj_GetY(obj)); let MagShot = magshot[i]; //力の計算(参考:磁気力クーロンの法則) let Farad = K * (MagShot * mag) / (DistToShot^2); //力がマイナスであれば方向を180転換して力をプラスにする if(Farad < 0){ Farad *= -1; AngleToShot += 180; if(AngleToShot > 360){ AngleToShot -= 360; } } //現在の速度角度から、次の速度角度を求める let tmp_speed = VectorAdd_r(speed, angle, Farad, AngleToShot); let tmp_angle = VectorAdd_t(speed, angle, Farad, AngleToShot); speed = tmp_speed; angle = tmp_angle; //引き寄せの限界 if((DistToShot < r) && ((MagShot < 0 && mag >= 0) || (MagShot > 0 && mag <= 0))){ stop = true; break; } } i++; } yield; if(speed > maxspeed){ speed = maxspeed; } //最大速度に抑える if(stop || stopflag){ speed = 0; angle = 0; } //速度と角度をゼロにする Obj_SetSpeed(obj, speed);//速度設定 Obj_SetAngle(obj, angle);//移動角度設定 if(stopflag){ let y = trunc(Obj_GetY(objshot[0]) / 32) * 32 + 16; if(GetKeyState(VK_BOMB)==KEY_HOLD){ y -= 32; } if(GetKeyState(VK_USER)==KEY_HOLD){ y += 32; } if(y < 80){y = 80;} if(y > 400){y = 400;} Obj_SetY(obj, y); } if(IsStageClip(Obj_GetX(obj), Obj_GetY(obj), 0)){ ObjShot_FadeDelete(obj); break; } } i = 0; loop(length(objshot)){ if(objshot[i] == obj){ objshot = erase(objshot, i); magshot = erase(magshot, i); break; } i++; } } }