task move { }について



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

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

「task shot { }」から呼び出されています。

サブルーチン(sub **** { })でも良かったのですが、
サブルーチンだと引数が渡せないので、タスクスレッドで作成しました。
いや、中で変数作っても良かったんですけどね……
何と言うか、色々いじられてみたいじゃん?みたいな?
移動先指定は引数部分で設定させてた方がいじりやすいじゃん?みたいな?


さて、これはかなり簡単に作ってます。
まずは、呼び出された「task move { }」は、



task move(let x, let movex, let movey)



によって、引数x、引数movex、引数moveyが渡されています。
「引数x」は、「現在の\射命丸!/(敵)のx軸座標」が、
「引数movex」は、「移動先x軸座標」が、
「引数movex」は、「移動先y軸座標」が、
入るようになっています。
(左端+50pixel〜右端−50pixel・上端+50pixel〜上端+150pixelにランダムで移動します。
縦横無尽に飛び回る姿は、射命丸にこそ相応しいとか思ってる私がいますが、気にしないで下さい)


呼び出された「task move { }」は次に条件尽き処理を行います。



  if (movex >= x) {
    mover;
  }
  else {
    movel;
  }




これは、
「もし、次の移動x軸先が現在のx軸より大きければ(右行き)「task mover { }」を、
そうでなければ(左行き)「task movel { }」を呼び出しなさい」

と言う条件尽き処理です。

呼び出されるタスクは次のどちらかです。



  task mover {
    SetGraphicRect(256, 256, 384, 384);
    w(5);
    SetGraphicRect(256, 384, 384, 512);
  }

  task movel {
    SetGraphicRect(256, 0, 384, 128);
    w(5);
    SetGraphicRect(256, 128, 384, 256);
  }




呼び出されたのは良いのですが、スクリプトを見て気づいた事はないでしょうか?

そう、「「task move { }」の中に、「task mover { }」と「task movel { }」がある」のです。

これは、「「task mover { }」と「task movel { }」呼び出す必要があるのは、「task move { }」だけ」なので、 中に入れ込んでしまったのです。
こうした場合、「他のタスク(task move { }以外)からは呼び出せない」ので、ご注意を。

っと、話がずれてしまいました。

それぞれの処理はこうです。(中身の意味は同じなので一律で説明)
「この矩形範囲で画像を設定し、5フレーム間処理を待機状態に、そして次はこの矩形範囲で画像を設定しなさい」
(KMAP氏のドット絵1枚の表示フレーム数は15が推奨(?)のようですが、私は5フレーム間隔が大好きです)

ここで、「移動開始→移動中」のグラフィックの変化を与えています。


次の処理はこうなっています。



  SetMovePosition02(movex, movey, 25);



これは、
「移動先x軸座標、移動先y軸座標に25フレーム掛けて移動しなさい」
と言う、実際の移動処理です。

処理はどんどん続きます。



  w(20);
  if (movex >= x) {
    SetGraphicRect(256, 256, 384, 384);
  }
  else {
    SetGraphicRect(256, 0, 384, 128);
  }




これは、
「20フレーム間処理を待機状態にし、もし右移動ならこの矩形で、左移動ならこの矩形で画像を設定しなさい」
と言う、処理です。

はて?何故「20フレームも処理を待機状態にした」のでしょう?

理由は簡単。
SetMovePosition02関数で指定されたフレーム数は、移動に掛かるフレーム数
と言う所がポイントです。

「移動した後にこんな事を敵にさせよう!」と思って意気込んで、



  SetMovePosition02(移動先x軸座標, 移動先y軸座標, 30);
  CreateShot01(GetX, GetY, 3, 90, RED01, 0);




と入力すると、実際の処理(ゲーム中)では、
移動を開始した瞬間に弾を発射」してしまいます。
その後はご想像の通り、 「移動終了(弾発射?ナニソレ?オイシイノ?)」です。

この様な事態を避ける為に、「20フレーム間処理を待機状態にした」のです。

しかしココで矛盾と思われる事態が生じます。
移動に25フレーム、待機状態が20フレーム、この5フレーム差は何?

この5フレーム差がミソなのです。
もし、待機状態を25フレームにすると、
移動を終了した後に、画像設定処理が行われる」ので、
弾が無い状態だと\射命丸!/(他のKAMP氏のドット絵も)の動きがビミョ〜なものになってしまいます。
その差を表したスクリプトをおいて置きますね。

移動フレームと待機フレームの関係(右クリックで保存)
(いや、別に保存しなくてもhtmlフォルダの中に弾幕スクリプトとして入っているので東方弾幕風本体で遊べたりします)

とりあえず、20フレーム待機したので、
「右移動だったのか、左移動だったのか」で画像の矩形処理を行います。

そして、この「task move { }」はその後の処理も無くループも無いので、全ての処理を終了します。


これが、「task move { }の実態」だったのです。


結構簡単な処理だったかな?
今回の移動は、「ランダムに、決まった範囲内で移動する」だけだったので、こんな感じですが、
「もっと複雑な移動をする場合には、また別の組み方」をする必要があります。
頑張れ!若人!