#東方弾幕風 #Title[Collision_Obj_Objのサンプル] #Text[ボスの周りをぐるぐる大玉、発射された丸弾がそれに触れると色が変わる。スピードがランダム+触れたとき角度が-10~10度変化] #Image[] #BackGround[User()] #BGM[] #Player[FREE] #ScriptVersion[2] script_enemy_main { let bossimg="script\img\ExRumia.png"; let frame=0; let ODAMAobj=0; //ShotAとShotBの橋渡しをする役目の変数。 let x_progress=0; // オブジェクト弾を作成する汎用関数。 // CreateShot01のような感覚で使え、結構便利。 // オブジェクト弾の番号を返しますので、必要な場合は受け取るようにしてください。 function CreateShotObj(let x,let y,let spd,let ang,let gp,let dly) { let obj=Obj_Create(OBJ_SHOT); Obj_SetPosition(obj,x,y); Obj_SetSpeed(obj,spd); Obj_SetAngle(obj,ang); ObjShot_SetGraphic(obj,gp); ObjShot_SetDelay(obj,dly); return obj; } task Tmain() { let MARGIN=6; let XMARGIN=10; let x=0; loop(120) {yield;} // 大玉発射 ShotA(); loop(NULL) { if (GetLife<2000){break;} // 一定時間ごとに大玉に触れると色の変わる全方位弾。 let angle=rand(0,360); loop(60) { ShotB(angle); SetX_progress; x+=x_progress; angle=angle+MARGIN*(1+sin(x))/2; } loop(30) {SetX_progress;yield;} } SetDamageRate(50,50); loop(NULL) { // 一定時間ごとに大玉に触れると色の変わる全方位弾。 let angle=rand(0,360); loop(60) { ShotBB(angle+180); ShotB(angle); SetX_progress; x+=x_progress; angle=angle+MARGIN*(1+sin(x))/2; } loop(30) {SetX_progress;yield;} } } task SetX_progress{ let FRAMEUNIT=36; loop{ loop(prand(1,4)*FRAMEUNIT){ yield; } x_progress=10*prand(1,5); yield; } } // 大玉をつくり、ボスの周りをぐるぐる回す。 // 何らかの事情で大玉が消えてももう一度作り直すので安心w task ShotA() { let x; let y; let length; let angle; let frame=0; loop(NULL) { let obj=CreateShotObj(GetX(),GetY(),0,0,RED03(),0); // 大玉を作成&オブジェク番号を取得。 ODAMAobj=obj; // 橋渡し用変数に上記の番号を入れる。 // 作った大玉が消えていない間、ずっとループする。 while(Obj_BeDeleted(obj)==false) { angle=frame*2; length=70+sin(frame*3)*30; x=GetX()+cos(angle)*length; y=GetY()+sin(angle)*length; Obj_SetPosition(obj,x,y); frame++; yield; } } } // 白い丸弾発射。 // 大玉に触れると赤くなり、ちょっとスピードダウン。 task ShotB(let angle) { let sw=0; // スイッチ。色が変わるとコレが1になり、ループを終わらせます。 let speed = rand(0.1,2.2); let obj=CreateShotObj(GetX(),GetY(),speed,angle,WHITE01(),0); // 丸弾を作成&オブジェク番号を取得。 // 丸玉が消えていない、かつswが0の間、ずっとループする。 while(Obj_BeDeleted(obj)==false && sw==0) { if(Collision_Obj_Obj(ODAMAobj,obj)==true) { //Obj_SetSpeed(obj,1); ObjShot_SetGraphic(obj,RED01()); Obj_SetAngle(obj,Obj_GetAngle(obj)+rand(-10,10)); } yield; } } task ShotBB(let angle) { let sw=0; // スイッチ。色が変わるとコレが1になり、ループを終わらせます。 let speed = rand(0.1,2.2); let obj=CreateShotObj(GetX(),GetY(),speed,angle,PURPLE01(),0); // 丸弾を作成&オブジェク番号を取得。 ObjShot_SetBombResist(obj,true); // 丸玉が消えていない、かつswが0の間、ずっとループする。 while(Obj_BeDeleted(obj)==false && sw==0) { if(Collision_Obj_Obj(ODAMAobj,obj)==true) { //Obj_SetSpeed(obj,1); ObjShot_SetGraphic(obj,AQUA01()); Obj_SetAngle(obj,Obj_GetAngle(obj)+rand(-10,10)); } yield; } } @Initialize() { SetScore(1000000); CutIn(KOUMA,"","",0,0,0,0); SetDamageRate(100,100); SetLife(6000); SetTimer(99); LoadGraphic(bossimg); SetMovePosition03(GetCenterX(),GetCenterY()-100,10,8); Tmain(); } @MainLoop() { SetCollisionA(GetX(),GetY(),30); SetCollisionB(GetX(),GetY(),30); yield; } @DrawLoop() { SetTexture(bossimg); SetGraphicRect(64,0,127,63); DrawGraphic(GetX(),GetY()); } @Finalize() { DeleteGraphic(bossimg); } } //script_enemy_main-----------------------------------------------------------