/* 基準角度±ズレ で交差弾が作れるというのが偶然わかった */ script_enemy Spirit { let csd = GetCurrentScriptDirectory; let imgSprt = csd~ "img\spirit.png"; let xIni = GetCenterX; let yIni = GetClipMinY + 128; let sprtCenterX = xIni; let sprtCenterY = yIni; //使い魔の初期半径、角度 //実際の角度は"angBase + angle" let r = 256; let angBase = GetAngle; let angle = 0; let wSetSprt = 60; //使い魔の出現にかかるフレーム数 let laser = [BLUE01, GREEN01, AQUA01, YELLOW01]; let type; //結界レーザーの色・初期角度 @Initialize { SetLife(50); SetScore(1000); SetTexture(imgSprt); if(GetAngle == 0) { setGraphicBLUE; type = 0; } else if(GetAngle == 90) { setGraphicGREEN; type = 1; } else if(GetAngle == 180) { setGraphicAQUA; type = 2; } else if(GetAngle == 270) { setGraphicYELLOW; type = 3; } TMain; } @MainLoop { yield; } @DrawLoop { DrawGraphic(GetX, GetY); } //------------------------------------------------------------ task TMain { yield; standBy; TBorder(type); TShot(type); TMove; } //------------------------------------------------------------ sub standBy { let dr = 176 / wSetSprt; let w = 180 / wSetSprt; loop(wSetSprt) { if(r > 80) { r -= dr; } move(w); yield; } wait(30); } task TMove { loop { move(1); yield; } } //使い魔の回転 function move(w) { angle += w; SetX(sprtCenterX + r * cos(angBase + angle)); SetY(sprtCenterY + r * sin(angBase + angle)); SetGraphicAngle(0, 0, angle); } //結界レーザー task TBorder(n) { let obj = Obj_Create(OBJ_LASER); let x = GetX; let y = GetY; let angLaser = (angBase + angle) +135; if(n == 0) { //レーザー(左) Obj_SetX(obj, x); Obj_SetY(obj, y); ObjShot_SetGraphic(obj, laser[n]); //青 } else if(n == 1) { //レーザー(上) Obj_SetX(obj, x); Obj_SetY(obj, y); ObjShot_SetGraphic(obj, laser[n]); //緑 } else if(n == 2) { //レーザー(右) Obj_SetX(obj, x); Obj_SetY(obj, y); ObjShot_SetGraphic(obj, laser[n]); //水色 } else if(n == 3) { //レーザー(下) Obj_SetX(obj, x); Obj_SetY(obj, y); ObjShot_SetGraphic(obj, laser[n]); //黄 } ObjShot_SetDelay(obj, 150); Obj_SetAngle(obj, angLaser); ObjLaser_SetLength(obj, r * (2^0.5)); ObjLaser_SetWidth(obj, 10); while(!Obj_BeDeleted(obj)) { /*レーザーの回転*/ angLaser ++; Obj_SetAngle(obj, angLaser); x = GetX; y = GetY; Obj_SetX(obj, x); Obj_SetY(obj, y); yield; } } /*それぞれの使い魔毎の攻撃パターン*/ task TShot(n) { let dir; let way; let v = [1.0, 1.5, 2.0, 4.5]; let type = [BLUE31, GREEN31, AQUA31, YELLOW32]; let delay = 0; let i = 0; loop { dir = rand(-10, 10); way = rand_int(20, 30); if (n == 0) { /*低速自機狙い*/ shotToPlayer(dir, v[n], type[n]); wait(120); } else if (n == 1){ /*通常全方位弾*/ allRangeShot01(way, dir, v[n], type[n]); wait(75); } else if (n == 2) { /*収束→展開型全方位弾*/ allRangeShot02(way, dir, v[n], type[n]); wait(100); } else if (n == 3) { /*高速自機狙い*/ TAimingShot(v[n], type[n]); wait(60); } yield; } } /*低速自機狙い*/ function shotToPlayer(dir, va, type) { let way = 7; let id = 0; let vb = 2; let angle = dir; let span = 360 / way; loop(way) { SetShotDirectionType(ABSOLUTE); CreateShotA(id, GetX, GetY, 0); SetShotDataA(id, 0, vb, angle, 0, -0.05, 0, type); SetShotDirectionType(PLAYER); //自機の方向を0°とする SetShotDataA(id, 75, va, 0, 0, 0, va, type); FireShot(id); SetShotDirectionType(ABSOLUTE);//これが無かった為に高速弾の挙動が変になっていました。 angle += span; } } /*通常全方位弾*/ function allRangeShot01(way, dir, v, type) { let angle = dir; let span = 360 / way; loop(way){ CreateShot01(GetX, GetY, v, angle, type, 0); angle += span; } } /*全方位弾の生成(収束→展開型)*/ function allRangeShot02(way, dir, va, type) { let id = 0; let vb = 3; let angle = dir; let dif = 160; let span = 360 / way; loop(way) { SetShotDirectionType(ABSOLUTE); CreateShotA(id, GetX, GetY, 0); SetShotDataA(id, 0, vb, angle , 0, -0.05, 0, type); SetShotDataA(id, 60, va, angle + dif, 0, 0, va, type); FireShot(id); angle += span; } dif = -dif; } /*高速自機狙い*/ task TAimingShot(v, type) { let x = GetX; let y = GetY; let angle = GetAngleToPlayer; let obj = Obj_Create(OBJ_LASER); Obj_SetX(obj, x); Obj_SetY(obj, y); Obj_SetAngle(obj, angle); ObjShot_SetGraphic(obj, YELLOW01); ObjShot_SetDelay(obj, 500); //予告線のみ ObjLaser_SetLength(obj, 500); ObjLaser_SetWidth(obj, 8); ObjLaser_SetSource(obj, false); while(!Obj_BeDeleted(obj)) { loop(30){//30フレーム追尾の後、高速弾発射。 Obj_SetX(obj, GetX);//発射元の位置を毎フレーム書き換え Obj_SetY(obj, GetY);//発射元の位置を毎フレーム書き換え Obj_SetAngle(obj, GetAngleToPlayer);//発射元からの角度を毎フレーム書き換え yield; } CreateShot01(GetX, GetY,v, GetAngleToPlayer,type,0); wait(60); Obj_Delete(obj); } } sub setGraphicAQUA { SetGraphicRect( 48, 48, 96, 96); } sub setGraphicYELLOW { SetGraphicRect(144, 48, 192, 96); } sub setGraphicBLUE { SetGraphicRect( 0, 48, 48, 96); } sub setGraphicGREEN { SetGraphicRect( 96, 48, 144, 96); } #include_function ".\include\dat_wait.txt" }