Projectileとヒットスパーク (2011/10/02)

見出し

まあ、気がついたら何故か目玉を作っているのですが、超必殺技のレーザーを作っていたときに問題がありまして。

サンプル画像

レーザーをProjectileで作って、撃って、当てると、まあヒットスパークが出るわけですよ。

ただ、Projectileで出すヒットスパークは、yはともかくxもProjectile自体の位置が基準になるようなので、小さなエネルギー弾のような飛び道具だとその仕様の方がむしろありがたいのですが、こういう動かずに画面を占有するレーザーなんかには適さないわけですね。(本体のHitdefでは、xの位置は攻撃を当てた敵が基準になるのです。) で、Sparkxyのxにはp2Distあたりを入れると相手の位置を捕捉してくれるように見えるのですがこれが罠で、タッグ戦などで二人の敵に同時に当てた場合は、近い方の敵に2体分のヒットスパークが表示されてしまうのです。

さあ困ったぞ。

ここで考えつくのは、さっさと諦めてHelperのHitDef使う Explodを使ってヒットさせた相手の場所に手動でヒットスパークを表示させようというものです。

Enemy(0)とEnemy(1)(念を入れればそれ以上)の状態を調べて、ヒット直後の時にスパークを表示させればいいわけです。ガード用のエフェクトかヒット用のエフェクトかは、GetHitVarで調べられるから問題なし。ヒット直後の判定はProjContactTimeも多分使えますが、それだと「敵1にヒットして、敵2が2フレーム遅れてヒット」といったときに不具合を出す(出さないかも知れない)と思われるので、ここもGetHitVarを使って、"Enemy(0),GetHitVar(pausetime) = 5"(5の部分はProjectileに設定したpausetimeに準じて適宜変更する)とすればヒット直後にスパーク表示がされます。

ただ、問題が一つ。 GetHitVarで硬直時間を調べているのですが、味方もタッグでの試合の場合、当然相方も攻撃をしています。このやり方だと、レーザーに当たっていないが相方の攻撃でpausetimeが5の攻撃を受けた敵がいるとすると、その敵にもレーザーのヒットスパークが表示されることになってしまいます。

これはどうしようもないかと言えばそうでもなく、他のGetHitVar条件を追加してやれば問題はありません。 例えば、Projectileのステコンで、

fall.envshake.time = 59 fall.envshake.ampl = 0

とでも設定しておきます。 fall.envshake関係の値はGetHitVarで拾うことができるので、あとはその値を相手から確認し、今回の例で言えば59の時に限りヒットスパークを出すようにすればいいわけです。 fall.envshake.amplが0になっているので、画面は全く揺れません。

こうするとバグを起こしにくい複数相手のヒットが実現できるわけです。 ちなみに、Targetのカッコの数字はHitdefのIDなので、EnemynearのようにTarget(2)という表記を使ってもダメなのでご注意。