#東方弾幕風 #Title[魔鏡「光の狭間」] #Text[自作No.1] #ScriptVersion[2] script_enemy_main { let name = "魔鏡「光の狭間」"; let imgBoss = "script\img\ExRumia.png"; let maxLife = 3000; let spartLife = maxLife / 2; // 初期位置 let xIni = GetCenterX; let yIni = GetClipMinY + 128; //LaserObjectのオブジェクトを保存しておく let arrayLaser=[]; @Initialize { CutIn(YOUMU, name, "", 0, 0, 0, 0); SetLife(maxLife); SetTimer(70); SetScore(2500000); SetDamageRate(10, 10); LoadGraphic(imgBoss); SetTexture(imgBoss); setGraphicStop; TMain; } @MainLoop { SetCollisionA(GetX, GetY, 32); SetCollisionB(GetX, GetY, 16); yield; } @DrawLoop { DrawGraphic(GetX, GetY); } @Finalize { DeleteGraphic(imgBoss); } // メインタスク task TMain { let wShot1 = 64; yield; TRate; standBy; readyLaser; ready5Laser; TStartLS; TStart5Shot; loop { move; wait(16); let v; let w1; if(GetEnemyLife > spartLife){ v = 2; w1 = 8; }else{ v = 3; w1 = 4; } shot1(GetX, GetY, v, 5, w1, RED11); wait(wShot1); } } // ダメージレートの変更 task TRate { wait(1200); SetDamageRate(50, 50); } // 初期位置へ移動し、攻撃開始 sub standBy { let wIni = 120; SetMovePosition02(xIni, yIni, wIni); setGraphicMove; SetInvincibility(wIni); wait(wIni); setGraphicPose; } // n重の円状 5-way 弾 // v : 速度 // type : 弾のタイプ function shot1(x, y, v, n, w, type) { let type; loop(n){ let dir = atan2(GetPlayerY-y, GetPlayerX-x); nwayCircle(x, y, 5, v, dir, type); v -= 0.2; wait(w); } } function shot2(x, y, v, n, w, type) { let type; loop(n){ let dir = atan2(GetPlayerY-y, GetPlayerX-x); nwayCircle(x, y, 5, v, dir + 180, type); wait(w); } } task ShotObject(let x, let y, let grf) {//レーザーに当たったら爆発する配置弾 let obj = Obj_Create(OBJ_SHOT); Obj_SetX(obj, x); Obj_SetY(obj, y); ObjShot_SetGraphic(obj, grf); let v = 0.5; while( !Obj_BeDeleted(obj) ) { let i=0; loop(length(arrayLaser)) { if(Collision_Obj_Obj(arrayLaser[i], obj)) { x = Obj_GetX(obj); y = Obj_GetY(obj); Explosion01(x, y, 10, 0.5, 5); shot2(x, y, v, 1, 0, RED01); Obj_Delete(obj); break; } i++; } yield; } } task LaserObject(x, y, angle, colorType) {//弾の爆発させるレーザー let h = 0; let i = 0; let ii = 0; let iii = 0; let v = 3; let grf; alternative(colorType) case(0){grf = RED01;} case(1){grf = ORANGE01;} case(2){grf = BLUE01;} case(3){grf = AQUA01;} case(4){grf = GREEN01;} case(5){grf = PURPLE01;} case(6){grf = YELLOW01;} let obj = Obj_Create(OBJ_LASER); if(colorType == 0){ arrayLaser = arrayLaser~[obj];//オブジェクトをarrayLaserに登録 } Obj_SetAngle(obj, angle); ObjShot_SetGraphic(obj, grf); ObjLaser_SetLength(obj, 50); ObjLaser_SetWidth(obj, 10); ObjLaser_SetSource(obj, false); while( !Obj_BeDeleted(obj) ) { Obj_SetX(obj, x + v * cos(angle) * i); Obj_SetY(obj, y + v * sin(angle) * i); i++; if(ii != 0){ if(Obj_GetX(obj) <= GetClipMinX + 20 || Obj_GetX(obj) >= GetClipMaxX - 20){ angle = 180 - angle; h = 1; } if(Obj_GetY(obj) <= GetClipMinY + 20 || Obj_GetY(obj) >= GetClipMaxY - 20){ angle = - angle; h = 1; } if(h == 1){ if(colorType!=6){ colorType++; v = v + 0.5; alternative(colorType) case(0){grf = RED01;} case(1){grf = ORANGE01;} case(2){grf = BLUE01;} case(3){grf = AQUA01;} case(4){grf = GREEN01;} case(5){grf = PURPLE01;} case(6){grf = YELLOW01;} Obj_SetAngle(obj, angle); ObjShot_SetGraphic(obj, grf); x = Obj_GetX(obj); y = Obj_GetY(obj); if(Obj_GetX(obj) <= GetClipMinX + 20){x = GetClipMinX + 21;} else if(Obj_GetX(obj) >= GetClipMaxX - 20){x = GetClipMaxX - 21;} if(Obj_GetY(obj) <= GetClipMinY + 20){y = GetClipMinY + 21;} else if(Obj_GetY(obj) >= GetClipMaxY - 20){y = GetClipMaxY - 21;} i = 0; h = 0; }else{ iii = 0; loop(length(arrayLaser)) {//オブジェクトを削除 if(arrayLaser[iii] == obj) {//配列arrayLaserからiii番目の要素を削除 arrayLaser = erase(arrayLaser, iii); break; } iii++; } Obj_Delete(obj); break; } } }else{ii = 1;} yield; } } task TStartLS { loop { let i = 0; loop(4){ let x = GetClipMinX + 21; let y = GetClipMinY + 21; alternative(i) case(1){x = GetClipMaxX - 21;} case(2){ x = GetClipMaxX - 21; y = GetClipMaxY - 21; } case(3){y = GetClipMaxY - 21;} LaserObject(x, y, atan2(GetPlayerY-y, GetPlayerX-x), 0); i++; } if(GetEnemyLife > maxLife / 2){ wait(256); }else{ wait(128); } yield; } } task TStart5Shot { let r = 100; let t = 0; loop{ let i= 0; loop(5){ let x = GetPlayerX + r * cos(-90 + 72 * i + t); let y = GetPlayerY + r * sin(-90 + 72 * i + t); ShotObject(x, y, RED03); i++; } wait(180); t+=180; if(t>=360){t-=360;} yield; } } sub readyLaser { let spanX = (GetClipMaxX - GetClipMinX) / 30; let spanY = (GetClipMaxY - GetClipMinY) / 30; let v; let vlen; CreateLaserA(0, GetClipMinX + 20, GetClipMinY + 20, 0, 10, YELLOW01, 0); CreateLaserA(1, GetClipMaxX - 20, GetClipMinY + 20, 0, 10, YELLOW01, 0); CreateLaserA(2, GetClipMaxX - 20, GetClipMaxY - 20, 0, 10, YELLOW01, 0); CreateLaserA(3, GetClipMinX + 20, GetClipMaxY - 20, 0, 10, YELLOW01, 0); let id = 0; loop(4){ if(id == 0 || id == 2){vlen = spanX;}else{vlen = spanY;} SetLaserDataA(id, 0 , 90 * id, 0, vlen, 0, 0); SetLaserDataA(id, 30, 90 * id, 0, 0 , 0, 0); FireShot(id); id++; } } task ready5Laser{ let i = 0; let r = 100; let t = 0; let arrayObj=[]; loop(5){ let obj = Obj_Create(OBJ_LASER); arrayObj = arrayObj~[obj]; Obj_SetX(obj, GetPlayerX + r * cos(-90 + 72 * i + t)); Obj_SetY(obj, GetPlayerY + r * sin(-90 + 72 * i + t)); Obj_SetAngle(obj, 72 + 36 * 2 * i + t); ObjShot_SetGraphic(obj, YELLOW01); ObjLaser_SetLength(obj, r * cos(18) * 2); ObjLaser_SetWidth(obj, 4);//レーザーの幅:4 ObjLaser_SetSource(obj, false); i++; } loop{ i= 0; loop(5){ let obj = arrayObj[i]; Obj_SetAngle(obj, 72 + 36 * 2 * i + t); Obj_SetX(obj, GetPlayerX + r * cos(-90 + 72 * i + t)); Obj_SetY(obj, GetPlayerY + r * sin(-90 + 72 * i + t)); i++; } t++; if(t>=360){t-=360;} yield; } } // 円状 n-way 弾 // way : way 数 // v : 速度 // dir : 基準とする方向 // type : 弾のタイプ function nwayCircle(x, y, way, v, dir, type) { let span = 360 / way; let angle = dir; loop(way) { CreateShot01(x, y, v, angle, type, 0); angle += span; } } // 移動 sub move { let wMove = 40; moveToPlayer(rand(40, 80), rand(-40, 40), wMove, GetClipMinX + 32, GetClipMinY + 32, GetClipMaxX - 32, GetClipMinY + 128); setGraphicMove; wait(wMove); setGraphicStop; } // なるべくプレイヤーの方向に移動 // xMove : x 方向の移動量(正の数) // yAdd : y 方向の移動量 // frame : 移動に要するフレーム数 // left : 以下、可動範囲 // top : // right : // bottom : function moveToPlayer(xMove, yAdd, frame, left, top, right, bottom) { let x; let y; if(GetPlayerX < GetX) { // プレイヤーより右に敵がいれば、敵は左に動きます。 x = GetX - xMove; // 但し、敵が可動領域の左端よりも左にいくようなら、右に動きます。 if(x < left) { x = GetX + xMove; } } else { // さもなくば、敵は右に動きます。 x = GetX + xMove; // 但し、敵が可動領域の右端よりも右にいくようなら、左に動きます。 if(right < x) { x = GetX - xMove; } } // 可動領域の外に行く場合は、端っこで止めます。 y = GetY + yAdd; if(y < top) { y = top; } else if(bottom < y) { y = bottom; } SetMovePosition02(x, y, frame); } // グラフィックの設定 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) { setGraphicLeft; } else { setGraphicRight; } } // w フレームだけ待つ function wait(w) { loop(w) { yield; } } }