task shot { }について



■ ▼ どんな事になってるの?コレ ▼ ■

スクリプトがどんな働きをしているのでしょう?
こちらと合わせてご参照下さい。

ショットタスクが呼び出されました。



  let setx;
  let sety;
  let count;
  let add_shot_angle;
  let add_shot_angle_span;
  let add_shot_angle_while_span;
  let start_add_shot_angle = 0;
  let start_add_shot_angle_span = [0, 0];
  let start_add_shot_angle_while_span = [0, 0];
  let radius = [18, 15];
  let shot_way = 12;
  let loop_value = [2, 3];
  let shot_loop_value = 24;
  let shot_speed = [1.7, 3];
  let shot_span = 1;
  let add_shot_span_mul = [15, 20];
  let blue_bullets_shot = true;
  let add_shot_angle_span_blue = 4;
  let shot_color = [22, 17];
  let delay = [10, 10];
  let roll_direction_type = [-1, 1];
  let move_count = 14;
  let shot_wait = 10;
  let wait = 30;




いきなり大量の変数宣言です。
この時点で通常なら意味不明です。
でも東方弾幕風はきちんと処理してくれます。スゴイ!

ひとつずつ見ていきましょう。



  let setx;
  弾が発射されるx軸座標位置の為の変数宣言

  let sety;
  弾が発射されるy軸座標位置の為の変数宣言

  let count;
  敵移動管理用の変数宣言

  let add_shot_angle;
  弾の発射される角度(回転専用)を設定をする為の変数宣言

  let add_shot_angle_span;
  弾がn-way方向に発射される際の角度の為の変数宣言

  let add_shot_angle_while_span;
  同一方向に発射される円形弾作成の為の変数宣言

  let start_add_shot_angle = 0;
  最初の円形弾がどの角度に発射されるかを設定する為の変数宣言と代入

  let start_add_shot_angle_span = [0, 0];
  赤と青の円形弾それぞれが初期で発射される角度の設定[青・赤]

  let start_add_shot_angle_while_span = [0, 0];
  赤と青の円形弾それぞれの生成される初期弾の位置設定[青・赤]

  let radius = [18, 15];
  円形弾を作成する際の、その円形弾の半径[青・赤]   

  let shot_way = 12;
  円形弾の円状に配置される弾の数

  let loop_value = [2, 3];
  円形弾を作成する量の設定[青2・赤3]

  let shot_loop_value = 24;
  実際に生成される円形弾の数の設定(但し、1wayに付き)

  let shot_speed = [1.7, 3];
  同一方向に発射される円形弾の発射速度[青1.7・赤3]

  let shot_span = 1;
  円形弾発射角度が回転する際の、加算角度(実際の回転角度ではない)

  let add_shot_span_mul = [15, 20];
  円形弾発射角度が回転する、実際の加算角度の乗数[青15・赤20]

  let blue_bullets_shot = true;
  後を追う青弾の発射管理(true=発射する・flase=発射しない)

  let add_shot_angle_span_blue = 4;
  青の円形弾が発射され、後を追うように追加で発射される際のズレ(4個ずれる)

  let shot_color = [22, 17];
  発射される弾の画像[青・赤](ユーザー定義された弾のID)

  let delay = [10, 10];
  弾が実体化されるまでの時間[青・赤]

  let roll_direction_type = [-1, 1];
  青の円形弾と赤の円形弾が発射され回転する方向の決定[青左回転・赤右回転]

  let move_count = 14;
  敵が弾発射中に移動を開始する数値(14回発射したら移動開始)

  let shot_wait = 10;
  弾の発射間隔(10フレーム毎)

  let wait = 30;
  第一波から第二波(以降続く)の発射終了→開始の間隔





になっています。
変数名考えるだけで苦労しました。

とりあえずは、「数値の代入が同時に終了している変数」に関しては、数値を変更すると
弾の発射の仕方などがかなり変わりますので、イジって遊んでみてください。
但し、変更した際に超難易度に異変し、地獄を見たとしても作者は一切責任を負いかねますので、
変更の際は、各自自己責任」でお願いします。
(設定次第では、簡単に本家EXTRAを凌駕し、東方弾幕風で過去最大の無理ゲーに化けます。逆もまた然り)


変数の設定が終了したら、ループに入ります。
ここで呼び出されているタスクは、「表示画像の設定」と「敵移動」になりますので、省きます。




  attack;
  add_shot_angle = start_add_shot_angle;
  count = 0;
  loop (shot_loop_value) {
    ascent (i in 0..2) {
      add_shot_angle_span = start_add_shot_angle_span[i];
      loop (loop_value[i]) {
        add_shot_angle_while_span = start_add_shot_angle_while_span[i];
        while (add_shot_angle_while_span < 360) {
          setx = GetEnemyX + radius[i] * cos(add_shot_angle_while_span);
          sety = GetEnemyY + radius[i] * sin(add_shot_angle_while_span);
          CreateShot01(setx, sety, shot_speed[i], ((add_shot_angle * add_shot_span_mul[i])
          + add_shot_angle_span) * roll_direction_type[i], shot_color[i], delay);
          if (i == 0 && blue_bullets_shot == true) {
            CreateShot01(setx, sety, shot_speed[i], ((add_shot_angle * add_shot_span_mul[i])
            + add_shot_angle_span + (add_shot_span_mul[i] * add_shot_angle_span_blue))
            * roll_direction_type[i], shot_color[i], delay);
          }
          add_shot_angle_while_span += (360 / shot_way);
        }
        add_shot_angle_span += 360 / loop_value[i];
      }
    }
    add_shot_angle += shot_span;
    w(shot_wait);
    count ++;
    if (count == move_count) {
      move(GetX, rand(GetClipMinX + 50, GetClipMaxX - 50), rand(GetClipMinY + 50, GetClipMinY + 150));
    }
  }
  blink(1);
  w(wait);




何してるのか分かりますか?
多分、分かる人居ないんじゃないかって位「とんでもない組み方」しています。

まずは、数字の殆どを変数で管理してしまっています。

しかも意味不明なことに、弾を発射する関数CreateShot01が2つしかありませんし、ひとつは条件まで付いてます。

しかし、このスクリプトで、


のような弾幕になるのです。

ちなみに待機状態があるのですが、それでも10フレームに一回の割合で弾を生成、生成は1フレームです。
その1フレーム内での弾生成数は、
“デフォルト”で赤3way×円形弾(12個)+青変則4way×円形弾(12個)」の計84個
「射命丸からの弾だけで平均画面内弾数900個超え安定」です。
(射命丸の場所によっては、1300個超え当たり前になります)

ですので、先ほども言ったように、変数代入の数値を変更して遊んでみたり、
そのまま流用などしても良いのですが、
余りにも数値を弄り過ぎて、超難易度に化けても作者はどうにも出来ませんので、
ホントに「ある程度、適度を保つ」等、暴走しないようにお願いします。

ちなみに、変数を鬼畜変更するだけで完成する弾幕はこちら
変数の数字以外、一切何にも触れてません。最悪です。汚いです。
この時の最大画面内弾数15,000超えでした。デバッグウィンドウ




さて、いよいよどのような処理をしてるのか説明したいと



思えません

流石にコレを口でどうこう説明するのは無理に等しいです。
代わりに「射命丸文_通常攻撃1.txt」と同じ位置にある「html」フォルダの中に、「内部処理解説スクリプト」を同伴しています。

「何がどう言う役割なのか」では無く、「どんな風に弾が作られていくのか」を実感していただければ〜とか思ってたりします。



ここで一言

弾幕を作る時は、下手に変更できないようなスクリプト組んだ方が吉