実践方法については過去の解説やサンプルデータを解析して貰うとして
スクリプトのお作法と、キャラ間の変数のやりとりについて
初心者が躓きやすい要素を中心に
覚えておいた方が良いポイントを解説しようと思います。
スクリプトの組み方は大別して
「①ループする」「②ループしない」の2種が存在します。
「①ループする」場合、最低限1周するのに1フレーム必要です。
0フレームでループさせると「無限ループ」状態に陥り、処理が正常に機能せず
エラーメッセージが表示されるので注意が必要です。
自機やメニュー等、入力に対して反応のあるスクリプトを組む場合
1周1フレーム(毎割込み処理)が基本となります。
・パネルの「進行方向」は「下」か「右」を選択する事ができます。
・移動先が「空白」の場合、下に移動します。
・パネルとパネルの間に「空白」があっても問題ありません。
・行数に関わらず、一番下まで移動すると「GATE」に戻ります。
パネルを増やす際、「IN・OUT」を使った接続が基本となります。
1フレーム内の処理(空白やパネル数)が多すぎると
「無限ループ」を検出する事があるので、その場合は
空白を削る、タスクを分散する等の工夫が必要になる…筈ですが、
最新版のStgBuilderで確認した所、これだけ↓並べても「無限ループ」を
検出しなかったので、アップデートで上限が緩和されたのかも…?
「②ループしない」場合、最後のパネルが
「進行方向.無し(矢印を表示させない)」
「制御.通過(時間待ち.動作完了まで=無期限ウエイト)」
「制御.タスク停止(該当のタスク番号を指定)」
「制御.消滅」(キャラクタを消す時に使用)
のいずれかである必要があります。
スクリプトパネルは大別して
「移動」「回転」「拡大縮小」「カラー」などの
「①変化に要する時間が必要なパネル」と
「②変化に要する時間が不要なパネル」の2種が存在します。
①には「変化に要する時間」「移動に要するフレーム数」などの項目があり
項目がないものはほぼ②に該当します。
(以降1フレーム→1fと表記)
①のパネルが「変化に要する時間=1f(最小値)」の場合
「時間待ち.動作完了まで」を指定すると
1f経過してから次のパネルへ移動する事になり、
「時間待ち.なし」の場合、変化を待たずに次のパネルへ移動します。
同じ属性の「変化に砲する時間が必要なパネル」を
「時間待ち.なし」で複数並べると上書きされるので注意が必要です。
複数の属性の「変化に要する時間が必要なパネル」を
1fで同時に処理したい場合は
最後のパネルに「時間待ち.動作完了まで」を指定します。
「変化に要する時間」が60fの場合、「時間待ち.動作完了まで」
を指定すると、60fの間はそれ以外の処理ができなくなりますが、
「時間待ち」で手動でフレーム数を指定をする事で
「変化処理」をしながら任意のタイミングで
別の処理を挟む事が可能になります。
「変化に要する時間が不要なパネル」に関しては、一部を除き
「時間待ち.無し」と「時間待ち.動作完了」の設定に差異はないと思われます。
同じループ番号同士を、ループ回数分繰り返します。
「同じ動作を数回繰り返した後、次の動作に移行」等を作る時に役立ちます。
(緑キャラが自機に向かって3way弾を発射しているイメージ)
①「攻撃.ショット」が「発射回数:1」の場合
「時間待ち」の有無に関わらず、同時にAとBを重ねる事が出来ます。
②「攻撃.ショット」が「発射回数:2~」の場合
「発射間隔」によるウエイトが発生する為、「時間待ち:動作完了まで」
が入っていると、Aの処理が完了してから、Bの処理に移行します。
③「発射回数:2~」「時間待ち:なし」の場合
AがBで上書きされるので、Aは初弾を除き発射されなくなります。
④「発射回数:2~」の「攻撃.ショット」を同時に複数出したい場合
「攻撃.ショット」後に「消滅」する、「ショット用キャラクタ」を作成
それを「子生成」で貼り付ける事で、同時に複数発射が可能になります。
(シグナル送信を扱うキャラの場合、IDの重複に注意が必要です)
①時計回りに240度回転させたい場合、目標角度を「240」にすると
角度AからBに近い方が優先される為、目標角度「-120」と同じ挙動になります。
②目標角度を「120」「120」に分割すると、時計回りに240度回転します。
①目標座標を絶対値で指定する
→画面の座標に対して絶対値で移動します
②目標座標を相対値で指定する
→自分のいる位置から相対値で移動します
※①②は、「移動に要するフレーム数」を指定します。
「等速」以外に「加減速」の指定も可能です。
「☑目標到達時に停止する」で移動後に停止させる事もできます。
③移動力を絶対値で指定する
→「移動力100=1fに1ピクセルの移動」という解釈で大丈夫そうです。
④移動力を相対値で指定する
→相対値なので、重ねがけが可能です。毎フレームY値を加算する事で
自由落下のような表現が可能です。
※③④は、「移動に要するフレーム数」「加減速」の影響は受けません。
パッドを振動させる「制御.振動」パネルは少し特殊で
「モーター0」と「モーター1」の振動情報はゲーム全体で1つだけです。
キャラAで「モーター0」を振動中、キャラBで「モーター0」を振動させると
キャラAの「制御.振動」パネルが、キャラBの「制御.振動」パネルに
置き換わるような挙動をします。
その際、振動強度だけでなく指定した振動フレーム数も置き換わるので
キャラAのタスクのf数に影響を与えてしまう事になります。
(回避方法)振動のみ担当の「振動キャラ」を作成
キャラA、キャラBが、振動させたいタイミングで「振動キャラ」を発射
→f数に影響を与える可能性を「振動キャラ」のみに限定する
「移動」パネルを使わず「変数.ローカル」パネルで
直接変数で「座標・移動量・回転・拡大」等の値を指定する事も可能です。
(但し直接指定なので「数フレームかけて変化」等の処理は苦手)
例えば「移動.拡大縮小」パネルでは、縮尺を「整数%」で指定する為
「99%と100%の中間」を指定する事はできませんが
変数で指定する場合は「0~100%→0~65536」になる為
「99.5%→65028」といった、細かな指定が可能です。
逆に、現在のローカルの「拡大率」を変数として取得する事も可能です。
その他、色々な情報を「変数.ローカル」経由で取得&指定できるので
一度種類を確認しておく事をオススメします。
(メイン)メインで使用するタスク
(ユーザー用1~)ユーザーが自由に使えるタスク
(攻撃ヒット)「攻撃」がヒットした時に起動するタスク
(防御ヒット)「防御」がヒットした時に起動するタスク
(破壊)攻撃を受けてHPが0になると起動するタスク
最低限これだけ理解しておけばOKです。
(ユーザー用1~)のタスクを使用する時は
「右クリック→ゲート作成」で「GATE」を作成した上で
「タスク編集→自動実行☑」か「制御.タスク開始」パネルを使って
指定のタスクを起動する必要があります。
(攻撃ヒット)(防御ヒット)のタスクは
ヒット判定が発生する度にタスクが再起動されるので
毎フレームヒット判定が発生すると
最初の1fの処理を繰り返す事になります。
(破壊)タスクも同様に
攻撃を受けてHPが0になる、という状態が毎フレーム続くと
最初の1fの処理を繰り返す事になります。
破壊タスク起動直後に「制御.消滅」で消す場合は問題ありませんが
(スコア計算や演出の都合等で)1f以上の処理が必要な場合は
最初に「制御.フラグ 防御判定を持つ→OFF」を設定して
防御判定を外し、タスクの再起動を防止する必要があります。
余談ですが、HPを-1以下に設定すると、被弾してもHPが0には戻らず
破壊タスクが自動起動しなくなる為、無敵キャラになります。
その上で(防御ヒット)タスクの中に、特定の条件で
「制御.その他(破壊)」もしくは「制御.タスク開始(11)」
を設定する事で、破壊タスク条件の自作可が可能になります。
「キャラA」と「キャラB」の2種が存在すると仮定して
「キャラA」から「キャラB」に変数を渡すには
「システム変数」を介する必要があります。
「キャラA」→「システム変数」→「キャラB」
「キャラA」が「キャラB」を「攻撃.ショット」で発生させる場合
「☑自分のParam_A.Bを渡す」を使用して
2種の変数を渡す事が出来ます。
「キャラA」が「キャラB」を「攻撃.子生成」で発生させる場合
「シグナルの受送信」を利用して、変数を渡す事が出来ます。
親が消滅すれば子も消滅する等、親子関係には制約がありますが
最近のアップデートで「攻撃.親子解除」パネルが追加されたので
変数を渡した後に分離する事が可能になったようです。
(子生成時のIDについて)
子生成時に割り振ったIDを使用して、シグナルの受送信をします。
複数のキャラを「子生成」で発生させた際、子のIDが重複していると
シグナルが正しく受送信できなくなるので注意が必要です。
(シグナルを使う場合、子は最大16種まで設定可能です)