[ITG] Lua講座(第1回) ランダムでMVを分岐させる – SPACE OF SOUL

f:id:kai_yuki:20200322232206p:plain

やりたいこと

複数のMVを用意しランダムで表示させたい

動画


ダウンロード


Lua

説明

ITGの譜面作成において、「一定確率で当たりMVに分岐させたい」と思うことはあると思います。例えばDJMAXのネバセ(Never Say)で低確率で旧MVに分岐させたり、MVではないですがSTRAIGHT JETで当たり/外れジャケットをランダムに表示させるなどの場面が考えられます。

サンプルを用意しましたので、まずは手元のOpenITGでそのまま動かしてみて動作を確認してもらえればと思います(luaはOpenITG前提で記述しています。StepMania5では動きません)。その後、MVを差し替えてみたり、分岐の確率を変えてみたりと手を動かしてみると理解しやすいと思います。

以下は実装の解説です。
実装方法はいくつか考えられますが、ここではConditionを使用した実装方法を紹介します。

Conditionは各レイヤの早いタイミング(InitCommandより先)で一度だけ実行され、“ ”内の条件に合致すればそのあとの処理が実行されます。合致しなければそこで処理が終了します(「存在しない」レイヤのようになります)。
今回はSecond()命令でluaが実行されたタイミングでの”秒”の値(0~59)を取得し、30秒以上であればBGA1を、30秒未満であればBGA2を表示するようにしています。
このように実装している理由ですが、選曲タイミングである程度どちらのMVが選ばれるかをプレイヤーが制御できた方が良いかなと考えたためです。
その他の実装としては、別のレイヤで乱数を発生させ変数に代入しておいて、Condition内でその変数を参照し分岐させる方法が考えられます(単純にCondition内で乱数を発生させると別の乱数を参照することになるのでおそらく上手くいかない)
Conditionを使わない実装としては、同じく別レイヤで変数を発生させ、if文で分岐させてself:diffusealpha(0)やself:animate(0)とすれば同じような効果が得られます。

コマンドの解説

self:stretchto(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM)

 画像やMVを画面サイズに引き伸ばします。実行環境や元ファイルの縦×横を意識しなくて良くなるので基本的に入れる。

self:diffusealpha(1)

 透明度を制御します。0~1の間の値を入れることができます。1だと不透明、0だと透明になります。デフォルトは1なので今回の実装では無くても動きます。

self:animate(1)

 MVの動きを制御します。0か1の値を入れることができます。0で停止、1で再生します。デフォルトは1なので今回の実装では無くても動きます。

参考URL

Lua API for OpenITG / NotITG(英語)
https://sm.heysora.net/doc/
ITGのLuaを書くのにまず参照するページです。OpenITGで使用できる各種命令が記載されています。今回使用したConditionの話も記載があります。

paraphrohn’s diary
https://paraphrohn.hateblo.jp/
日本語でLuaの解説が書かれた貴重なページです。Luaの基本から譜面のワープ、ハイスピ変更ギミックなど様々な実装についての解説があります。