#東方弾幕風 #Title[撃って戻って周りますver添削] #Text[taskとyieldの勉強です、自力で出来るようになりたいです\H/] #ScriptVersion[2] /* yieldによって、まず@〜Hの順番で処理が進む */ script_enemy_main { let frame = 0; let frame2 = 0; let kakudo = 0; @Initialize{ SetX(GetCenterX); SetY(GetClipMinY+120); SetLife(2000); LoadGraphic("script\img\ExRumia.png"); SetTexture("script\img\ExRumia.png"); SetGraphicRect(0, 0, 63, 63); Main; /* Main を起動 …@ */ Main2; /* Main2 を起動 …C */ Main3; /* Main3 を起動 …F */ Main4; /* Main4 を起動 …I */ /* Hまで行ったら、@Initialize終了。@MainLoopへ。 */ } @MainLoop { frame++; // frame2++; if(frame == 1400){ frame=0 } // if(frame2 == 1400){ frame=0 } SetCollisionA(GetX, GetY, 24); SetCollisionB(GetX, GetY, 24); yield; /* ここで、一時中断していたtaskに処理が戻る。   以下、Main→(一時中断)→Main2→(一時中断)→Main3→(一時中断)→Main4→(一時中断)→Main→いt(ry という風に処理が続く。 */ } @DrawLoop{DrawGraphic(GetX, GetY);} @Finalize{DeleteGraphic("script\img\ExRumia.png");} task Main { /* Mainでの処理 …A */ loop(100){yield;} loop{ //frameが100から850の間繰り返すスクリプト if(frame>=100 && frame<=850){//100+(5*10)*5+100*5=850 loop(5){ loop(10){yield;} let angle=0; //角度を0にしておいて、while構文が終わって戻ってくるたびに0に初期化される //下のangleが360を満たすまで繰り返す while(angle<360){ SetShotDirectionType(PLAYER); //自機狙いにする方法 CreateShotA(1,300,150,0); //発射位置 SetShotDataA(1,0,0,angle,0,0,NULL,RED32); //0フレーム時の処理 //以下弾道動作 SetShotDataA(1,1,6,angle,0,0,6,RED32); SetShotDataA(1,30,-6,NULL,0,0,6,RED32); SetShotDataA(1,60,6,NULL,0.0,0,6,RED32); FireShot(1); //発射 SetShotDirectionType(ABSOLUTE);//絶対値を入れることで自機狙いの影響が他の弾幕に作用しないようにする angle+=5; //全方位弾の角度を決める } /* whileの終わり */ } /* loop(5)の終わり */ loop(100){yield;} } /* if(frame...)の終わり */ yield; /* これが無いと無限ループする。   ここでMainを一時中断して、Mainを起動したところ(…@)に戻る。 …B */ } /* loopの終わり */ } /* Mainの終わり */ task Main2 { /* Main2での処理 …D*/ loop(150){yield;} loop{ //frameが150から900の間だけ繰り返すスクリプト if(frame>=150 && frame<=900){//150+(5*10)*5+100*5=900 loop(5){ loop(10){yield;} let angle=0; //角度を0にしておいて、while構文が終わって戻ってくるたびに0に初期化される //下のangleが360を満たすまで繰り返す while(angle<360){ SetShotDirectionType(PLAYER); //自機狙いにする方法 CreateShotA(2,150,150,0); //発射位置 SetShotDataA(2,0,0,angle,0,0,NULL,BLUE32); //0フレーム時の処理 //以下弾道動作 SetShotDataA(2,1,6,angle,0,0,6,BLUE32); SetShotDataA(2,30,-6,NULL,0,0,6,BLUE32); SetShotDataA(2,60,6,NULL,0,0,6,BLUE32); FireShot(2); //発射 SetShotDirectionType(ABSOLUTE);//絶対値を入れることで自機狙いの影響が他の弾幕に作用しないようにする angle+=5; //全方位弾の角度を決める } /* whileの終わり */ } /* loop(5)の終わり */ loop(100){yield;} } /* if(frame...)の終わり */ yield; /* これが無いと無限ループする。   ここでMainを一時中断して、Main2を起動したところ(…C)に戻る。 …E */ } /* loopの終わり */ } /* Main2の終わり */ task Main3 { /* Main3での処理 …G*/ // loop(50){yield;}//発射するまでの待ち時間が100フレーム loop{ //カウントが900以上かつ1150以下なら繰り返すスクリプト if(frame>=900 && frame<1150){//900+(5*50)=1150 //5フレーム間隔の弾を50発撃つ loop(50){ loop(5){yield;} let angle=0; //角度を0にしておいて、while構文が終わって戻ってくるたびに0に初期化される //下のangleが360を満たすまで繰り返す while(angle<360){ CreateShotA(3,400,150,0); //発射位置 SetShotDataA(3,0,0,angle,0,0,NULL,RED32); //0フレーム時の操作 SetShotDataA(3,1,6,angle,0,0,6,RED32); //弾道操作 FireShot(3); angle+=10; } /* whileの終わり */ } /* loop(50)の終わり */ } /* if(frame2...)の終わり */ //カウントが1150以上かつ1400以下なら繰り返すスクリプト if(frame>=1150 && frame<1400){//1150+(5*50)=1400 //5フレーム間隔の弾を50発撃つ loop(50){ kakudo++; //角度を1ずつずらしていく loop(5){yield;} let angle=0; //角度を0にしておいて、while構文が終わって戻ってくるたびに0に初期化される //下のangleが360を満たすまで繰り返す while(angle<360){ CreateShotA(4,400,150,0); //発射位置 SetShotDataA(4,0,0,angle,0,0,NULL,RED32); //0フレーム時の操作 SetShotDataA(4,1,6,angle+kakudo,0,0,6,RED32); //弾道操作 FireShot(4); angle+=10; //全方位弾の角度を決める } /* whileの終わり */ } /* loop(50)の終わり */ } /* if(frame...)の終わり */ kakudo=0; // loop(100){yield;} yield; /* これが無いと無限ループする。   ここでMain3を一時中断して、Main3を起動したところ(…7)に戻る。 …\H/*/ } /* loopの終わり */ } /* Main3の終わり */ task Main4 { /* Main4での処理 …J */ // loop(50){yield;} loop{ //frameが900から1400の間繰り返すスクリプト if(frame>=900 && frame<1400){//900+(5*100)=1400 loop(100){ loop(5){yield;} let angle=0; //角度を0にしておいて、while構文が終わって戻ってくるたびに0に初期化される //下のangleが360を満たすまで繰り返す while(angle<360){ CreateShotA(1,50,150,0); //発射位置 SetShotDataA(1,0,0,angle,0,0,NULL,BLUE32); //0フレーム時の処理 //以下弾道動作 SetShotDataA(1,1,6,angle,0,0,6,BLUE32); FireShot(1); //発射 angle+=10; //全方位弾の角度を決める } /* whileの終わり */ } /* loop(5)の終わり */ // loop(100){yield;} } /* if(frame...)の終わり */ yield; /* これが無いと無限ループする。   ここでMainを一時中断して、Mainを起動したところ(…I)に戻る。 …K */ } /* loopの終わり */ } /* Mainの終わり */ }