#東方弾幕風 #Title[水符「スプラッシュウォーターガン」] #Text[夏の風物詩、水鉄砲遊び。 今は冬ですがね。 ちなみに扇状弾は水しぶき、自機狙いは水鉄砲、上から降ってくるのは水滴をイメージして作りました。 (イメージしただけです)] #Image[] #BackGround[] #ScriptVersion[2] script_enemy_main { let name = "水符「スプラッシュウォーターガン」"; let imgExRumia=GetCurrentScriptDirectory~"img\ExRumia.png"; let count= -90 ;//弾を出す間隔を制御するための変数 let cx=GetCenterX();//変数cxに中心x座標を代入 let cy=GetCenterY();//変数cxに中心y座標を代入 let arrayLaser=[];//LaserObjectのオブジェクトを保存しておく let Lflame = 36;//光源が端まで到達するフレーム、laserlength/Lflameでレーザーの伸びる速度:光源の速度 let laserlength = 180;//レーザーの長さ @Initialize() { CutIn(YOUMU, "水符「スプラッシュウォーターガン」", "", 0, 0, 0, 0); SetLife(2000);//敵のライフを2000に設定 SetDamageRate(40, 20); SetTimer(99); SetScore(4000000); SetGraphicRect(64,1,127,64);//描画元の矩形を(64,1)-(127,64)に設定 LoadGraphic(imgExRumia);//画像「img\ExRumia.png」を読みこむ TMain; } @MainLoop() { //30フレーム毎に弾をばらまく SetCollisionA(GetX(),GetY(),32);//敵の座標に当たり判定を登録 SetCollisionB(GetX(),GetY(),24);//敵の座標に当たり判定(体当たり用)を登録 count++;//1フレーム毎にcountが1増加 yield;//毎フレームタスク復帰 } @DrawLoop() { SetTexture(imgExRumia); DrawGraphic(GetX(),GetY());//敵の座標にExルーミアを描画; } @Finalize() { DeleteGraphic(imgExRumia); } //------------------------------------------------------- //メインタスク task TMain { yield; standBy; TLaser; Tsphere; Tshot; } // 初期位置へ移動 sub standBy { let wIni = 120; SetMovePosition02(GetCenterX, GetClipMinY + 90, wIni); setGraphicMove; SetInvincibility(wIni); wait(wIni); } //弾の軌道を変えるレーザータスク task TLaser { //上面反射レーザー let obj = Obj_Create(OBJ_LASER); let obj2 = Obj_Create(OBJ_LASER); //側面反射レーザー let obj3 = Obj_Create(OBJ_LASER); let obj4 = Obj_Create(OBJ_LASER); arrayLaser = arrayLaser~[obj,obj2,obj3,obj4];//オブジェクトをarrayLaserに登録 objSetting(obj ,GetX() ,GetY() ,0 ,BLUE11 ,12 ,true);//上面設定 objSetting(obj2 ,GetX() ,GetY() ,180 ,BLUE11 ,12 ,false); objSetting(obj3 ,GetX() + laserlength ,GetY() ,90 ,BLUE11 ,12 ,false);//側面設定 objSetting(obj4 ,GetX() - laserlength ,GetY() ,90 ,BLUE11 ,12 ,false); objSetLength(obj ,Lflame ,laserlength + 10);//伸び設定(右 objSetLength(obj3 ,Lflame * 2 ,laserlength * 2); objSetLength(obj2 ,Lflame ,laserlength + 10);//左 objSetLength(obj4 ,Lflame * 2 ,laserlength * 2); } task Tsphere { let right = 0; let left = 1; //発射元光球 loop { CreateLaserA(right ,GetX() ,GetY() ,0 ,0 ,BLUE01 ,0);//右側 SetLaserDataA(right ,0 ,0 ,0 ,0 ,laserlength/Lflame ,0);//レーザーに沿って発射 SetLaserDataA(right ,Lflame ,0 ,0 ,0 ,laserlength/Lflame ,90);//縦に折り返す SetLaserDataA(right ,Lflame + Lflame * 2 ,0 ,0 ,0 ,laserlength/Lflame ,180);//底で折り返す FireShot(right); wait(Lflame + Lflame * 2); CreateLaserA(left ,GetX() ,GetY() ,0 ,0 ,BLUE01 ,0); SetLaserDataA(left ,0 ,0 ,0 ,0 ,laserlength/Lflame ,180);//レーザーに沿って発射 SetLaserDataA(left ,Lflame ,0 ,0 ,0 ,laserlength/Lflame ,90);//縦に折り返す SetLaserDataA(left ,Lflame + Lflame * 2 ,0 ,0 ,0 ,laserlength/Lflame ,0);//底で折り返す FireShot(left); wait(Lflame + Lflame * 2); } } //自機狙い弾&全方位弾発射タスク task Tshot { let rightsetx = GetX() + laserlength - 10; let leftsetx = GetX() - laserlength + 10; let sety = GetY() + laserlength * 2 - 10; let flameset = 5;//光源の速度との関係で定数 let loopflame = 10;//発射回数 let angle = 0; wait(Lflame + Lflame * 2); loop { //右側発射 angle = rand(177,179); loop(10) { //全方位弾 Tshotobject(rightsetx - 10 ,sety ,2 ,angle ,AQUA12 ,0); angle += 10; } loop(loopflame) { //自機狙い弾 Tshotobject(rightsetx ,sety ,3 ,atan2(GetPlayerY - sety ,GetPlayerX - rightsetx) ,BLUE12 ,0); rightsetx -= flameset * 2; wait(flameset * 2 / 5); } rightsetx = GetX() + laserlength - 10;//rightsetx初期化 wait(Lflame * 2 - loopflame * flameset * 2 / 5);//弾を発射した残りの時間待機 wait(Lflame); //左側発射 angle = rand(1,3); loop(10) { //全方位弾 Tshotobject(leftsetx ,sety ,2 ,angle ,AQUA12 ,0); angle -= 10; } loop(loopflame) { Tshotobject(leftsetx ,sety ,3 ,atan2(GetPlayerY - sety ,GetPlayerX - leftsetx) ,BLUE12 ,0); leftsetx += flameset * 2; wait(flameset * 2 / 5); } leftsetx = GetX() - laserlength + 10;//leftsetx初期化 wait(Lflame * 2 - loopflame * flameset * 2 / 5); wait(Lflame); } } //レーザーに当たったら軌道を変える弾 task Tshotobject(let x, let y, let speed, let angle, let grf, let delay) { let obj = Obj_Create(OBJ_SHOT); Obj_SetX(obj, x); Obj_SetY(obj, y); Obj_SetSpeed(obj, speed); Obj_SetAngle(obj, angle); ObjShot_SetGraphic(obj, grf); ObjShot_SetDelay(obj, delay); while( !Obj_BeDeleted(obj) ) {//削除されるまでループを実行 let i = 0; loop(2) {//レーザーとの当り判定を調査 if(Collision_Obj_Obj(arrayLaser[i], obj)) { //Laserと接触したら //連続で判定されないよう普通の弾と入れ替える x = Obj_GetX(obj); y = Obj_GetY(obj); CreateShot01(x, y, 1, 90, BLUE05, 0); Obj_Delete(obj); } if(Collision_Obj_Obj(arrayLaser[2], obj)) { let angle = Obj_GetAngle(obj); Obj_SetAngle(obj ,angle - 180 - angle * 2); break; } if(Collision_Obj_Obj(arrayLaser[3], obj)) { let angle2 = Obj_GetAngle(obj); Obj_SetAngle(obj ,angle2 - 180 - angle * 2); break; } i++; } yield; } } //レーザーオブジェクトのいろいろ設定 function objSetting(let obj ,let x ,let y ,let angle ,let grf ,let width ,let source) { SetCoordinateType(COODINATE_TYPE_PARENT); Obj_SetX(obj, x);//X座標 Obj_SetY(obj, y);//Y座標 Obj_SetAngle(obj, angle);//角度 ObjShot_SetGraphic(obj, grf);//グラフィック ObjLaser_SetWidth(obj, width);//レーザーの幅 ObjLaser_SetSource(obj, source);//光源 } //レーザーオブジェクトの伸び設定 function objSetLength(let obj ,let lengthflame ,let maxlength) { let length = 0; while(length <= maxlength) { ObjLaser_SetLength(obj, length);//長さを0からlengthflameフレームでmaxlengthにする length += maxlength/lengthflame; yield; } } // グラフィックの設定 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; } } }