ITGギミックメモ: 判定をFGの手前に持ってくる

 以前断念したのでもう一回頑張ってきました。

 結論

以前紹介したparaph_HS.xmlを使用して*1

f:id:paraphrohn:20200322211001p:plain

これでOKです。

 

注)ここから下はテストプレイしてないのでバグるかもしれません

ただ、このままだと最初から最後まで判定しか表示されないので……

f:id:paraphrohn:20200322220448p:plain

こうやって「判定がFGの前にあるモード」のON/OFFを関数化しておいて、Update形式で適用したり解除したりするのが良いです。

(2020/03/22追記)

po1、po2を取得してApplyGameCommandしてますが、無意味でした。当然。

とりあえずApplyGameCommand('mod, *10000 no reverse, *10000 0% centered, *10000 nostealth')としておくのが良いと思います、そしてもちろん問題がありますので……

 

f:id:paraphrohn:20200322212041p:plain

こんな感じ。

ちなみにめんどくさかったら

GAMESTATE:ApplyGameCommand('mod, *10000 reverse, *10000 -220% centered, *10000 stealth')

だけでもだいたい望み通りの効果が得られます*2

問題点としては-220% centeredを解除するのに3秒ほどかかることで、ここを改善するにはplayeroptionsから(%d+)%% centeredを取得しておく必要があるわけですが……これは読者への宿題とさせていただきます(めんどくさいので)

 

原理

まず失敗したアプローチたち。

1. draworderを利用する

f:id:paraphrohn:20200322212254p:plain

描画の上下を変更できるdraworderですが、PlayerとFGの差を埋めるには不十分でした。

というか、そのLayerが生成された時点で上下が決まっている?感じがあって、後からdraworderを変更しても効果がありませんでした。

 

2. SetDrawByZPosition + GetChild('Judgment')の併用

f:id:paraphrohn:20200322212422p:plain

SetDrawByZPositionを利用することで、Z座標が大きいものほど手前に描画することができます。スクリーン全体にこれを適用することで、BG、FGなどの壁を越えて描画順序を変更できます。

というわけで、

f:id:paraphrohn:20200322212602p:plain

こうすればいい気がしたんですが*3、残念ながらテーマ側から常にz=0とする命令が出されているらしく効果がありませんでした。

ちなみに全オブジェクトのZ座標はデフォルトで0になっているようです。

 

3. stealth + darkの併用

というわけで、判定文字だけを手前に出すのは困難だろうということで逆にそれ以外を消すことを考えます。

矢印を消すのがstealth、そしてtarget(判定レーン)を消すのがdarkです。ただ、stealthの仕様として踏み逃した矢印が判定レーンの上から出現してしまうので極めてダサいです。まあこれに加えてハイスピを10000xにするとかすればいいんですけど(U SAiDはこの方式)、やっぱり1フレームだけ見えちゃったりするので没。

 

4. stealth + dark + P1:y(-120)の併用

3からさらに派生して、判定レーンの上から矢印が出てくるなら判定レーンを画面外に出してしまえばいいんじゃないかという考え。

ただ、どうも判定文字やコンボ数の表示はP1自体に紐づけされている?様子で、判定レーンといっしょに判定文字もさようならしてしまいました。よって没。

 

 

成功したアプローチ

上の3つのアプローチの結果、綺麗に目標を達成するのは無理だと感じました。そこで方針をごり押しに変更。4のアプローチがかなり理想に近かったので、これを改善する方向にしました。

CENTEREDは判定レーンを画面中央にもっていくオプションなんですが、これにマイナスの値を入れると画面外に向かって判定レーンが旅立っていきます。この時、判定文字とコンボ数の表示の上下が入れ替わるような挙動がありました。

 というわけでこれにreverseをつければ判定文字とコンボ数の上下関係が元に戻ります。後は判定文字とコンボ数が何もしてない状況と同じになるように各数値を弄って完成。

残りはFGの上に判定文字を表示させる部分ですが、これは2のアプローチを使って解決しました(地味にこれが最新の成果)。

 

ちなみに、TS:GetChild('SongForeground'):z(0.0001)の代わりにTS:GetChild('SongBackground'):z(0.0001)とすることで、BGをFGのように取り扱うこともできます。わざわざFGでメッセージ流して動画流したりする必要がなく、#BGCHANGESとの組み合わせで簡単に使えるのでこっちのほうが楽かもしれません。

*1:そういえばこのparaph_HS.xml、ミスがありましてC or M modを取得した直後をhispeed = tonumber(hispeed)/BPMとしなければなりませんでした。そのうち修正します

*2:ちなみに某GCの某TGのオプションにある「TARGET: UP/DOWN」では、それぞれ-20% centered、20% centeredがかかっています。これらを使っている場合にApplyGameCommandからcenteredを弄ると戻せないことがあるので必ず事前に取得しておきましょう。

*3:P1:GetChild('Judgment')は1pの判定文字のLayerを指します