堕落街道まっしぐら。

現在のゲームプレイ状況: アリスギア = ウマ娘 > DMMブラゲ > Crossout >> それ以外

MUGEN/localcoord騒動まとめ

そもそもキャラ側のlocalcoordって何? →縮尺を決めるパラメータです。


「キャラクターが原寸大で表示される画面サイズ」とも言えます。
これとcnsファイル内にあるscaleパラメータで実際のサイズが決まってきます。

WinMUGENサイズとも言える、一般的なMUGENの画面サイズは640x480ですが、
ほとんどのD0仕様のキャラクターはlocalcoord=320,240で作られているはずです。
実際にMUGEN上で動かした人なら分かると思いますが、
これらのキャラクターはMUGEN上では2倍のサイズで表示されますよね。
それは「localcoord=320,240つまり画面サイズが320x240の時に原寸大になるサイズですよ」
って定義されてるため、その倍である640x480サイズの画面では当然のように表示される際も
倍のサイズで表示されてるからです。ポトレも2倍サイズ、キャラも2倍サイズ、縮尺も2倍サイズ。

ではlocalcoord=640,480のキャラクターはどういうものなのか。
理屈は同じで「画面サイズが640x480の時に原寸大になるサイズですよ」っていう意味です。
MUGEN側の画面サイズが640x480の場合、キャラクター側は等倍で処理されることになります。
ポトレも等倍サイズ、キャラも等倍サイズ、縮尺も等倍サイズ。
ポートレートも今までは25x25サイズで作られていたのを2倍に表示されていたわけですが、
640,480の場合は等倍ですから50x50サイズで作った小ポトレが原寸大のまま綺麗に表示されます。
大ポトレも240x280サイズで作ったものが拡大無しに表示されるので随分と綺麗に映せます。

しかし旧カンフーマンのようなD0ドットのキャラの場合、
このままだと画面上に表示されるキャラクターも等倍サイズのため、
想定サイズと比較すると半分になってしまい、かなり小さいカンフーマンになってしまいます。
そこでcnsファイル内のscaleパラメータの出番てわけでして、
これを弄ることで「キャラクター周りだけ」をサイズ変更することができます。
scaleの値を2にすればキャラクターは2倍サイズ(想定されたサイズ)で表示され、
ポートレート周りだけは等倍サイズの綺麗な画像として表示されるわけですね。
勿論その際のポトレは原寸大用のサイズで新しく用意しないといけませんが。

俗にD4と呼ばれるキャラクターがありますが、
これらはlocalcoord=320,240環境においてcnsのscale値を0.5にすることで、
「実際の2倍サイズの縮尺で表示倍率は0.5倍」という状況を作り出し、
2×0.5=1で結果的に等倍サイズで表示させていたんですね。
これをlocalcoord=640,480にしてcns内のscale値を1にすることで
事実上の等倍サイズ表示が実現できるようになったんですねー。
今度はキャラクターだけでなくポトレも等倍サイズで表示できるのでこっち側も綺麗に映せます。


D0キャラクター↓
localcoord=320,240 + scale=1 で縮尺2倍×表示倍率1倍=2倍サイズで表示(ポトレも2倍表示)
これを
localcoord=640,480 + scale=2 で縮尺1倍×表示倍率2倍=キャラ周りだけ2倍サイズで表示(ポトレだけ等倍表示)
こうすることでキャラ周りは今まで通りに、かつポトレだけ等倍表示で綺麗に!

D4キャラクター↓
localcoord=320,240 + scale=0.5 で縮尺2倍×表示倍率0.5倍=キャラ周りだけ等倍サイズで表示(ポトレのみ2倍表示)
これを
localcoord=640,480 + scale=1 で縮尺1倍×表示倍率1倍=全部まとめて等倍表示
こうすることでキャラ周りもポトレも原寸大の綺麗な画像として表示できるように!

今回の目論見も合わせるとこういうことになるわけですね。



で、何が問題だったかって言うと、localcoord値が違うキャラクター同士で対戦した場合、
片方にステートを奪われた場合は奪った側のlocalcoord値が適用される
っていう仕様が発覚したためでして。どういうことかって言うと、
localcoord=320,240であるキャラAがlocalcoord=640,480であるキャラBのステートを奪った時、
キャラBのlocalcoordは一時的なれど320,240になってしまうらしいんです。
これで何が起こるかって言うと、キャラBにとって等倍であるはずの縮尺が2倍という扱いになります。
つまりscale=1,1で表示していたものがscale=2,2扱い(2倍サイズ)で表示されてしまいますし、
画面端から数えて半分の位置に出現させようとしたものが倍の位置、つまり逆の画面端に出現してしまいます。
逆もまたしかりで、キャラBがキャラAのステートを奪った場合、
2倍であるはずの縮尺が等倍という扱いになるため、普段の0.5倍でものごとが処理されるようになり、
画面端から数えて半分の位置に出現させようとしたものが画面端から4分の1程度の位置に出現してしまうわけですね。

これらはステートを奪われている間に実行したExplodやHelperのステコンにのみ影響するようで、
ステートを奪われる前に出現していたものは影響を受けません。
要はステートを奪われてる際に新たなExplodやHelperを出さなければいいんですが、
全てのキャラがそれを守れるわけでもなく、どこかしらで影響が出てしまいます。
そしてつい昨日、私がその問題に直撃しました。

一応解決策がないわけではなく、ステートを奪われないオブジェクトが
影響を受けそうなexplodやhelperを管理すれば問題は回避できるようです。
要はHelperがExplodや別Helperの管理をするってことですね。
ただし問題回避できるのは自分側だけなので、localcoordの値が違う相手と対戦した場合、
相手側のexplodやhelper表示に不具合が発生する可能性が残ります。


相手側に迷惑をかける可能性を孕みながらポトレ周りを綺麗にするか、
相手側への影響をできる限り小さくしながらポトレ周りを今まで通りにするかの2択ってわけです。
でも綺麗なポートレートは魅力なんだよね。




<余談>
分かり難いかもしれませんが、
localcoord=320,240のキャラにとって画面内の空間の広さは320x240になります。
これは画面サイズが640x480であろうと変わりません。
一方localcoord=640,480のキャラにとって画面内の空間の広さは640x480になります。

どう違うのかって言うと、MUGEN上に存在している空間の広さそのものの感覚が違います。

例えば画面端から中央まで、画面半分を移動しようと思った時、
前者は横の広さは320なわけですからPosAddで160だけ進めてやればいいわけですが、
後者は横の広さが640なので、同じように160だけ進めても画面上では4分の1しか進みません。
後者が画面半分を移動しようとした場合にはPosAddだと320を指定しなければならないのです。

両者が向き合った場合も見た目上では同じ距離同士に見えますが、
前者はP2BodyDist Xで100の値を返すのに対し、
後者は同条件下においてP2BodyDist Xが返す値は倍の200になります。

速度周りにおいてもやっぱり違いがあって、
Vel X=10で16F走ると移動距離は160となるわけですが、
前者は画面横サイズが320なので160だけ前に進むと画面半分だけ進むのに対し、
後者は画面横サイズが640なので160だけ前に進むと画面4分の1しか進みません。




長々と書いたけど、他所のサイトやブログを覗けば既に同じようなことが書かれてたりはシマス。
でもステートを奪われた時のlocalcoordの変動についてはあまり触れてるところが多くない印象。