黒の時代

弾幕風ph3初心者による弾幕風講座。まだ難しいことは出来ませんが、質問要望あればコメントにどうぞ。

no.4 nway弾頑張る

しばらく弾を撃つことに専念しましょう。

nway弾です。


@MainLoopに入れた

  if (frame%4==0&&frame>60) {
      CreateShotA1(ex,ey,3,angle,DS_RICE_S_RED,0);
      CreateShotA1(ex,ey,3,angle-10,DS_RICE_S_RED,0);
      CreateShotA1(ex,ey,3,angle-20,DS_RICE_S_RED,0);
      CreateShotA1(ex,ey,3,angle-30,DS_RICE_S_RED,0);
      angle+=12;
}

これ、 いっぱい書くのめんどくさいですよね。全方位弾とか超めんどくさい。

とゆーわけでifの中身を

let a = -30;
loop(7) {
      CreateShotA1(ex,ey,3,GetAngleToPlayer(objEnemy)+a,
      DS_BALL_M_BLUE,20);
      a+=10;
}

 にしてみましょう。7way弾の出来上がり。
loop(数字) { }は文字通り数字の回数だけ{}内を行います。
数字を書かずにloop() { }ってやると無限回を1フレーム内に実行させることが出来ます。すると弾幕風がくそ真面目に処理しようとしてフリーズします。PCもフリーズするので気をつけてください。助けてタスクマネージャー。回数指定の無いループは、loopを終了させる条件(break)を{ }内に書き込んで使います。注意深く。

あと、変数をひたすらangle*=3とかやってても処理落ちするので気をつけてください。大きすぎる値は扱えません。

と言うわけで、今回は変数aの初期値を-30にして、そっからloopで7回aを10ずつ大きくしてみました。

let a = -30;
loop(7) {
   let speed = 2.5;
   loop(5) {
      CreateShotA1(ex,ey,speed,GetAngleToPlayer(objEnemy)+a,
      DS_BALL_M_BLUE,20);
      speed+=0.5;

   }
   a+=10;
}

みたいにループを2つ使うこともできます。

…これどんな弾幕になるか想像できますか?
スクリプトだけ見てても中々難しいですね。逆に弾幕の見た目からスクリプトを作るのもそう簡単じゃないです。その代表格が、粒と波の境界。あれどうやって作るんでしょうね。(答えは検索すれば出て来ると思いますが)

【while】

じゃあ次は全方位弾。これもループで作れますね。でも今回はちょい違うループwhileを使います。whileは条件付き無限ループ。

let a = 0;
while(a<360) {
   CreateShotA1(ex,ey,2.5,GetAngleToPlayer(objEnemy)+a,
   DS_KUNAI_BLUE,20);
   a+=8;
}

できあがり。「aが360未満」っていう条件を満たしている間はループします。今回はa=352まで。360になったら条件に合わないのでループの中身が実行されなくなります。お手軽だけど、条件操作間違えたり(>と<間違えたり)a+=8;を書かなかったりして条件文が常にtrueだと、やっぱりフリーズしますので気をつけましょう。

【ascent】 

最後のループがascentです。変数宣言しなくてすむっていう理由で黒の時代はこれを一番使ってます。ものぐさ。

ascent( i in 0..45) {
      CreateShotA1(ex,ey,1.5,GetAngleToPlayer(objEnemy)+i*8,
      DS_KUNAI_WHITE,20);
      CreateShotA1(ex,ey,3,GetAngleToPlayer(objEnemy)+i*8,
      DS_KUNAI_BLUE,20);
}

ascentの中では、()内ででっち上げた変数(今回はi)が一ずつ増えていきます。0..45って書いた場合は、0から44まで。45にはなりません。と言うわけで、+i*8の部分で8の倍数をどんどん作っていってるわけです。

ちょっとした速度をずらした弾を作りたい時とか便利です。

【function】

さらに赤白の全方位弾を順番に打つことを考えます。
2色なら全部書けますが、例えば7色は…めんどくさいですね。
if(frame%60=0) {赤のnway弾}
if(frame%30=30) {白のnway弾}

の『nway弾』の部分をまとめて書きます。それが関数functionです。
ちなみにCreateShotA1()もsin()もObjEnemy_SetIntersectionCircleToShot()も関数です。
パラメーターを入力したら、動作とか値とかが出て来る。それが関数。
慣れれば特に難しく考える必要も無くなります。大事なのは、taskとは違うってこと。

さて見てから考えましょう。

function nway(color) {
   let a = 0;
   while(a<360) {
      CreateShotA1(ex,ey,2.5,GetAngleToPlayer(objEnemy)+a,
      color,30);
      a+=8;
   }
}

これをスクリプトの最後にくっつけて、@MainLoopに

if(frame%60==0) {
   nway(DS_BALL_S_RED);
}
if(frame%60==30) {
   nway(DS_BALL_S_WHITE);
}

を書き込みます。

 もちろんnwayの引数は2個以上でもOK。引数はfunction内部で変数として扱われます。他で使ってる変数は使わないでください(使ってもフリーズはしませんが)。

内部でもただの変数なので、値を足したり引いたり変えたりできます。

function nway(speed,color) {
   loop(4) {
   let a = 0;
      while(a<360) {
         CreateShotA1(ex,ey,speed,GetAngleToPlayer(objEnemy)+a,
         color,30);
         a+=15;
      }
      speed-=0.5;
   }
}

みたいに。

 

これで

  • ループ各種
  • functionの導入

終了。次は弾オブジェクトを弄る。ホーミング弾作ろう。

 

一応今回までの知識で、風神録4面、文のラストスペカ塞符「天孫降臨」とかは作れます。

>>目次:no.0