フメンピックlua解説②: YOU (実装編)

ザ☆汚物

f:id:paraphrohn:20200621185014j:plain

基本構造はこんな感じ。大量にActorFrameを入れてるだけで普通の構成。いや変な構成とかできないですけど。

f:id:paraphrohn:20200621185915p:plain

750行にわたるdefault.luaも、まとめてしまえば中身はこれだけ。実際の記述は大分違いますが、kaiさんのブログで紹介されていたものや、下手をすれば平成とかとほとんどやってることは変わりありません。全部を愚直に書き下した結果膨大な量になってしまっただけで。

f:id:paraphrohn:20200621190602p:plain

messagesとmodsに関してはいつも通り。この書き方分かりやすいんで便利なんですよね。

f:id:paraphrohn:20200621191849p:plain

aftsに関しては、child名と適用するコマンドを指定することで、異なるchildrenに個別に命令を出せるように。関数直指定のほうが良いんじゃないかみたいなことも言われましたが、直観的に読めて即座に修正できる使い慣れた形にしてあります。時間がなかったので。

f:id:paraphrohn:20200621194644p:plain

aft_rotationsは、2番目に生成コマンドの種類、3番目に回転方向を指定して回せるようにしてあります。今思えばこれもaftsと同じ形式で良かったんですが……もともと回転しかしない予定だったので。はて、どういうことでしょう。

ちなみに矢印モデルについてはU SAiDから直接流用しているのでここの書き方だけやたら古めかしいです。複数の長さを持つ生成コマンド類を並べて使いたかったのでUpdate形式になってるんですが、今回の使い方ならaftsと同じ動かし方をしてやればよかったかなと。時間がなかったので。

 

さて、luaの基本動作はここまでで全部なので、あとは細かい要素技術を組み合わせながら前回書いたような演出を作れば完成です。

・NoteField、Judgmentのテクスチャ化

aft.luaを見れば大体解決です。

f:id:paraphrohn:20200621203228p:plain

ActorFrameTextureは、そのchildren類をすべてまとめてテクスチャとして扱うActorFrameです。self:Create()によりテクスチャを生成します。なおSM5の仕様としてテクスチャ類の解像度は2^nに丸められますので適宜拡大縮小してやる必要があり、そのためにSCREEN縦横サイズとの比率を保存しています。で、上の画像はActorProxyをテクスチャ化している様子です。

ActorProxyは、SetTarget()により適当なActorを複製することができます。今回はPlayerP1またはPlayerP2のNoteFieldをターゲットとして複製し、これを中央に置いたものをテクスチャ化しているということです。

 

・ActorMultiVertexへのテクスチャ貼り付け

f:id:paraphrohn:20200621203521p:plain

ActorMultiVertex (またはsprite) にはテクスチャを貼り付けられます。そもそもLoadActor("画像.png") はspriteを生成してそこに画像をテクスチャとして貼り付ける動作を意味しています。

で、ActorMultiVertexのvertex情報は {xyz座標, 色, テクスチャの位置} から成っていて、第3要素を上手く設定してやることでテクスチャを貼り付けられるというわけです。ちなみにたとえ四角形単位で塗りつぶしをしていたとしてもテクスチャ貼り付けは三角形最小ポリゴン単位ですので、すべての頂点が同一平面上にない四角形に適当にテクスチャを貼り付けるとおかしな表示になります。

f:id:paraphrohn:20200621203815p:plain

というわけで、そのような四角形 (この関数は台形類にのみ適用可能) を細切れにして生成するための関数を用意して頂点類をまとめて適用しています。これはもともと別の目的のために作っていた関数を流用しているためめんどくさい書き方になっています。今回のように多角錐にのみ使うのならもっときれいに書き直して、かつCommand側ももっと短くなったと思います。これが「汎用性重視の関数」って書いた理由です。

 

・大量の立方体 & 三角形の用意

Requiem of the skyと同じ方法です。

f:id:paraphrohn:20200621204145p:plain

適当に数とか半径とかを決めてやって、ActorFrameにActorMultiVertexを大量導入します。

f:id:paraphrohn:20200621204219p:plain

で、愚直に立方体を書き下してActorMultiVertexを立方体とし、これにテクスチャを貼り付け、乱数を用いてz方向ギリギリの半径を持つ円柱内にランダム配置しています。xとyの中にある1個目のmath.sinが、半径方向の分布を一様ではなくしていて、およそ半径/2の辺りに多く立方体が配置されるようになっています。

三角形はグローがかかっていて、これをActorMultiVertexで表現するのはかなり難しいのでActorMultiVertexではなくspriteで用意しています。

f:id:paraphrohn:20200621204519p:plain

 それで、これらの立方体及び三角形が分布する領域を全部覆うような円柱状のActorMultiVertexを生成し、そこにブラーonlyのテクスチャを貼り付けることで全体としてぼんやり光っている効果を出しています。それだけです。

 

これで全部です。他に変な技術とかは使っておらず、本当に愚直にすべてのオブジェクトの動きを1個ずつ指定して全体を構成しています。最低限の要素技術さえ使えるようになれば、あとは頑張れば頑張るだけ画面が豪華になる底なし沼が待っているだけです。welcome to my world...

もし要素技術が理解できないなら

https://twitter.com/paraphrohn/status/1259473847046115328?s=20 (ActorFrameTexture & ActorMultiVertexへのテクスチャ貼り付け)

https://twitter.com/paraphrohn/status/1245347180790943744?s=20 (for文でのActor読み込み)

https://twitter.com/teneno22/status/1236284293841743872?s=20 (ActorFrame全体の操作)

この辺の譜面を参照すれば一発だと思います。