#東方弾幕風 #Title[サテライトマスタースパーク] #Text[] #Image[] #BackGround[] #ScriptVersion[2] script_enemy_main { let imgExRumia=GetCurrentScriptDirectory~"img\ExRumia.png"; let csd = GetCurrentScriptDirectory; let imgFam = csd ~ "img\fam.png"; let shotData = csd ~ "data_usershot.txt"; let imgEffect= csd~"\img\shot_all.png"; let id = 0; let ScreenX = 0; let ScreenY = 0; let enemyID = []; @Initialize() { SetLife(2000);//敵のライフを2000に設定 SetDamageRate(45, 30); SetScore(400000); SetTimer(99); CutIn(YOUMU ,"サテライトマスタースパーク" ,csd ~ "img\cutin_marisa.png" ,0 ,0 ,190 ,320); SetGraphicRect(64,1,127,64);//描画元の矩形を(64,1)-(127,64)に設定 LoadGraphic(imgExRumia);//画像「img\ExRumia.png」を読みこむ LoadGraphic(imgFam);//画像「img\fam.png」を読みこむ LoadGraphic(imgEffect); LoadUserShotData(shotData); Tmain; } @MainLoop() { SetCollisionA(GetX(),GetY(),32);//敵の座標に当たり判定を登録 SetCollisionB(GetX(),GetY(),24);//敵の座標に当たり判定(体当たり用)を登録 enemyID = [];//IDを初期化 //敵IDを列挙して保存 ascent(enemy in EnumEnemyBegin..EnumEnemyEnd) { enemyID = enemyID ~ [EnumEnemyGetID(enemy)]; } yield;//毎フレームタスク復帰 } @DrawLoop() { SetTexture(imgExRumia); DrawGraphic(GetX+ScreenX ,GetY+ScreenY);//敵の座標にExルーミアを描画; } @Finalize() { DeleteGraphic(imgExRumia); } //------------------------------------------------------- //親メインタスク task Tmain { yield; MagicCircle(false); SetMovePosition02(GetCenterX() ,GetClipMinY +100 ,100);//移動 wait(100); Concentration01(60); wait(60); Tfamiliar;//使い魔召喚 wait(30); SetMovePosition02(GetCenterX() ,GetClipMinY -100 ,100);//移動 wait(100); loop { SetX(GetClipMaxX() -GetPlayerX()); SuperLaser(GetX() ,GetY() ,0 ,GetAngleToPlayer ,850 ,400 ,imgEffect ,183, 431, 207, 459 ,50 ,300); wait(350 +150); } } //-------------------------------------------------------- //使い魔召還タスク task Tfamiliar { CreateEnemyFromScript("Familiar" ,GetX() ,GetY() ,5 ,0 ,true);//召還一回目 wait(60); //使い魔の座標を取得してそこにTstarを実行 let i = length(enemyID);//現在存在している敵の数を取得 Tstar(GetEnemyInfo(enemyID[i-1] ,ENEMY_X) ,GetEnemyInfo(enemyID[i-1] ,ENEMY_Y) ,enemyID[i -1]); loop { let x = GetCenterX() +rand(-160,160); let y = GetClipMinY(); wait(140); CreateEnemyFromScript("Familiar" ,x ,y ,5 ,0 ,false);//使い魔召喚 wait(60); //使い魔の座標を取得してそこにTstarを実行 let i = length(enemyID);//現在存在している敵の数を取得 Tstar(GetEnemyInfo(enemyID[i-1] ,ENEMY_X) ,GetEnemyInfo(enemyID[i-1] ,ENEMY_Y) ,enemyID[i-1]); } } //自機揺らしタスク task ShakeScreen(let time,let pow){ let ax; let ay; loop(time){ ax = rand(-1,1)*pow; ay = rand(-1,1)*pow; SetPlayerX(GetPlayerX+ax-ScreenX); SetPlayerY(GetPlayerY+ay-ScreenY); ScreenX=ax; ScreenY=ay; //使い魔でも使うため共通にする SetCommonData("ScreenX" ,ScreenX); SetCommonData("ScreenY" ,ScreenY); yield; } } task SuperLaser(x, y, d, ang, length, width, img, sx, sy, dx, dy, del, time){ let hy = absolute(dy-sy)/2; let scaleY = 0.1; let wid = 0; let obj=Obj_Create(OBJ_EFFECT); Obj_SetPosition(obj ,x ,y); ObjEffect_SetTexture(obj,img); ObjEffect_SetRenderState(obj,ADD); ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP); ObjEffect_SetScale(obj,length/(dy-sy),width/(dx-sx) ); ObjEffect_SetLayer(obj,5); ObjEffect_SetAngle(obj,0,0,ang); ObjEffect_CreateVertex(obj,4); ObjEffect_SetVertexXY(obj,0,dx-sx,-hy*scaleY); ObjEffect_SetVertexXY(obj,1,0,-hy*scaleY); ObjEffect_SetVertexXY(obj,2,dx-sx,hy*scaleY); ObjEffect_SetVertexXY(obj,3,0,hy*scaleY); ObjEffect_SetVertexUV(obj,0,dx,sy); ObjEffect_SetVertexUV(obj,1,dx,dy); ObjEffect_SetVertexUV(obj,2,sx,sy); ObjEffect_SetVertexUV(obj,3,sx,dy); let obj2 = Obj_Create(OBJ_LASER); Obj_SetPosition(obj2,x,y); Obj_SetAutoDelete(obj2 ,false); Obj_SetAngle(obj2,ang); ObjLaser_SetLength(obj2,length); ObjLaser_SetWidth(obj2,wid); ObjShot_SetGraphic(obj2,255); ObjShot_SetDelay(obj2,del); wait(del); ascent(i in 0..9*5){//広がる速度1/5 scaleY+=0.02;//デフォルトは0.1 ObjEffect_SetVertexXY(obj,0,dx-sx,-hy*scaleY); ObjEffect_SetVertexXY(obj,1,0,-hy*scaleY); ObjEffect_SetVertexXY(obj,2,dx-sx,hy*scaleY); ObjEffect_SetVertexXY(obj,3,0,hy*scaleY); ObjLaser_SetWidth(obj2,wid); wid +=400/45; ShakeScreen(1,i/(45/6)); Obj_SetX(obj ,x +ScreenX); Obj_SetY(obj ,y +ScreenY); yield; } //画面揺らし ShakeScreen(time -19 ,6); loop(time -19){ Obj_SetX(obj,x+ScreenX); Obj_SetY(obj,y+ScreenY); yield; } ascent(i in 0..10){ ascent(j in 0..4){ ObjEffect_SetVertexColor(obj,j,255-i*25,255,255,255); } //画面揺らし ShakeScreen(1,6/(i+1)); Obj_SetX(obj ,x +ScreenX); Obj_SetY(obj ,y +ScreenY); yield; } let ang_flash2 = Obj_GetAngle(obj2); let enemy_x = GetX(); let enemy_y = GetY(); Obj_Delete(obj); Obj_Delete(obj2); let id = 0; loop(10) { loop(10) {//残光エフェクト2 let l = rand(0,length); let x = enemy_x + l * cos(ang_flash2) +rand(-60,60); let y = enemy_y + l * sin(ang_flash2) +rand(-20,20); CreateShotA(id ,x ,y ,20); SetShotDataA(id ,0 ,0 ,0 ,0 ,0 ,0 ,WHITE01); SetShotKillTime(id ,0); FireShot(id); } wait(1); } } //全方位星タスク task Tstar(x ,y ,enemy_id) { let count = 0; let spd = 3; let grp; let enemy_life; loop { //使い魔のライフが0になったらタスク終了 enemy_life = GetEnemyInfo(enemy_id ,ENEMY_LIFE); if(enemy_life == 0) {break;} let a = rand(0,30); let ang = 0; grp = rand(161,168); while(ang < 360) { Tstarshot(x ,y ,ang +a ,spd ,grp); ang +=36; } if(count%3 == 0) { a = rand(0,30); ang = 0; grp = rand(161,168); while(ang < 360) { Tstarshot(x ,y ,ang +a ,spd-2 ,grp); ang +=36; } } count ++; wait(40); }//masterloop } //星単体 task Tstarshot(x ,y ,ang ,spd ,grp) { let obj = Obj_Create(OBJ_SHOT); Obj_SetPosition(obj,x,y); Obj_SetAngle(obj,ang); ObjShot_SetGraphic(obj,grp); while(!Obj_BeDeleted(obj)){ Obj_SetX(obj ,x +ScreenX); Obj_SetY(obj ,y +ScreenY); //速度と角度をXY座標に変換して動かす x+=cos(ang)*spd; y+=sin(ang)*spd; yield; } } // w フレームだけ待つ function wait(w) { loop(w) { yield; } } } } //------------------------------------------------------- //使い魔 script_enemy Familiar { let ang_fam = 0; @Initialize { SetLife(500); SetScore(10000); SetDamageRateEx(100 ,0 ,100 ,0); SetTexture(GetCurrentScriptDirectory~"img\fam.png"); setGraphicFast; Tmain; } @MainLoop { SetCollisionA(GetX, GetY, 32); SetCollisionB(GetX(),GetY(),24);//敵の座標に当たり判定(体当たり用)を登録 yield; } @DrawLoop { let ScreenX = GetCommonData("ScreenX"); let ScreenY = GetCommonData("ScreenY"); DrawGraphic(GetX+ScreenX ,GetY+ScreenY); } //------------------------------------------------------- //使い魔メインタスク task Tmain { yield; let x; let y = GetClipMinY() +80;//yは一定なので先に定義しとく //GetArgumentがtrueなら初回召還時の動き if(GetArgument) { x = GetCenterX() +rand(-160,160); SetMovePosition03(x ,y ,18 ,4); } else { x = GetX(); SetMovePosition03(x ,y ,18 ,4); } SetInvincibility(60); wait(60); } //自機揺らしタスク task ShakeScreen(let time,let pow){ let ax; let ay; loop(time){ ax = rand(-1,1)*pow; ay = rand(-1,1)*pow; SetPlayerX(GetPlayerX+ax-ScreenX); SetPlayerY(GetPlayerY+ay-ScreenY); let ScreenX = GetCommonData("ScreenX"); let ScreenY = GetCommonData("ScreenY"); ScreenX=ax; ScreenY=ay; yield; } } sub setGraphicFast { SetGraphicRect( 0, 48, 48, 96); } // w フレームだけ待つ function wait(w) { loop(w) { yield; } } }