第二章 演出と手応えNo.010
無敵時間
Invincibility Frames別名 無敵フレーム、被弾後の無敵
概要
被弾した直後の短いあいだ、次のダメージを受けないようにする時間。敵に触れているかどうかは毎フレーム調べるので、無敵時間がないと触れているあいだ毎フレーム被弾し、体力が一瞬でなくなる。無敵時間があれば、1 回の接触で減る体力は 1 回分になり、敵から離れる時間ができる。
使われる場面
- 敵に触れるとダメージを受けるゲーム
- 敵と重なっているあいだは毎フレーム触れていると判定される。被弾の後に無敵時間を置き、1 回の接触で減る体力を 1 回分にする。
- 弾を続けて撃つ敵や、判定が続く攻撃
- 弾の列や炎のように判定が出続ける攻撃は、短いあいだに何度も当たる。無敵時間があれば、続けて当たっても無敵が切れるまでは 1 回分しか減らない。
- 触れるとダメージを受ける床
- トゲの床の上にいるあいだは毎フレーム床に触れている。無敵時間があれば体力は無敵時間ごとに 1 回分ずつ減るので、床から逃げる時間ができる。
- 回避の動作
- 回避の動作の一部のフレームを無敵にする。攻撃が当たる瞬間に合わせて回避すれば、攻撃を受けずにくぐり抜けられる。
判断基準
| こういうとき | こうする |
|---|---|
| 敵に触れた瞬間に体力がなくなり、なぜやられたのかわからない | 被弾の後に無敵時間を入れる。1 秒(毎秒 60 回の更新で 60 フレーム)から試し、0.5〜2 秒(30〜120 フレーム)の幅で調整する。 |
| 無敵が切れた直後に重なったままの敵にまた当たる | 無敵時間を敵から離れるのにかかる時間より長くする。長くしたくなければ、被弾したときにノックバックで敵から押し離す。 |
| 一度当たった後は敵の群れの中を平気ですり抜けて進める | 無敵時間が長すぎる。群れを 1 回の被弾で抜けられなくなるまで短くするか、無敵のあいだも敵と重ならないよう押し戻す。 |
| 無敵なのか、いつ無敵が切れるのかが見てわからない | 無敵のあいだはキャラクターを半透明にする。点滅させるなら、1 秒に 3 回を超えない速さにする。 |
| 回避を続けて出していれば、どの攻撃も当たらない | 回避の無敵を動作の一部のフレームだけにし、動作の終わりに無敵でないフレームを残す。 |
| 自分の攻撃が 1 回振っただけで敵に何度も当たる | 攻撃ごとに当てた相手を覚えておき、同じ攻撃は同じ相手に 1 回だけ当てる。敵に無敵時間を付けて防ぐと、無敵のあいだに当てた次の攻撃まで効かなくなる。 |
遊んでこう感じたら
指示の例
敵に触れた瞬間に体力が全部なくなって、なぜやられたのかわからない。被弾したら無敵時間を 1 秒くらい付けて、1 回の接触では 1 回分しか減らないようにして
無敵が切れた瞬間に重なったままの敵にまた当たる。無敵時間を今の 1.5 倍くらいに延ばすか、被弾したときにノックバックで敵から離して
一度当たった後は敵の群れの中を平気ですり抜けられて緊張感がない。無敵時間を今の半分くらいに短くして
無敵がいつ切れるのか見てもわからない。無敵のあいだはキャラクターを半透明にして、1 秒に 2 回くらいの速さでゆっくり点滅させて
回避を連打していれば、どの攻撃も当たらない。回避の無敵時間を動作の前半だけにして、終わりのほうは無敵にしないで
詳細
触れているあいだに体力が一気に減る理由
敵に触れるとダメージを受けるゲームでは、キャラクターと敵が重なっているかを毎フレーム調べる。重なっていたら体力を減らすだけの作りだと、敵と重なっているあいだ毎フレーム被弾する。デモの「敵にぶつかったまま進む」では、キャラクターと敵は 14 フレーム(毎秒 60 回の更新で約 0.23 秒)重なり続ける。無敵時間のない上の段は、重なり始めてから 5 フレーム(約 0.08 秒)で体力 5 をすべて失う。画面の上では敵に一度触れただけに見えるので、プレイヤーにはなぜやられたのかがわからない。
そこで、被弾した直後の短いあいだは敵に触れていてもダメージを受けないようにする。この時間を無敵時間と呼ぶ。下の段は無敵時間を 60 フレームにしてあり、同じ接触で体力は 1 だけ減ってそのまま敵を通り抜ける。
弾の列のように短い間隔で続けて当たる攻撃でも、同じことが起こる。デモの「弾が続けて飛んでくる」では 4 発の弾が 5 フレームおきに当たり、上の段の体力は 5 から 1 まで減る。下の段は 1 発目で無敵になり、残りの 3 発は体を通り抜ける。
無敵時間の数え方
被弾したら無敵の残りのフレーム数を無敵時間の長さにし、次のフレームから 1 ずつ減らす。残りが 0 より大きいあいだは、敵や弾に触れていても体力を減らさない。無敵時間を 0 にすると、触れているあいだ毎フレーム被弾する。
// 1 ステップごとに
if (invincible > 0) {
invincible -= 1; // 無敵のあいだは、触れていても体力を減らさない
} else if (touching) {
hp -= damage;
invincible = invincibleFrames; // 被弾した次のフレームから数える
}
長さの目安
目安は 0.5〜2 秒(毎秒 60 回の更新で 30〜120 フレーム)ほどである。1 秒(60 フレーム)前後から試し、遊びながら調整する。
下限は被弾してから敵を離れるまでにかかる時間で決まる。デモの「敵にぶつかったまま進む」では重なりが 14 フレーム続く。そのため、無敵時間が 12 フレーム以下だと敵を通り抜ける途中で無敵が切れ、もう一度被弾する。「弾が続けて飛んでくる」では 18 フレーム以下だと、4 発のうち 2 発以上に当たる。
上限は無敵のあいだに何ができてしまうかで決まる。無敵のあいだは敵に触れても平気なので、長すぎると被弾した後に敵の中を強引に進めてしまい、敵が障害の役目を果たさない。デモの「敵の群れの中を突っ切る」では、キャラクターは群れを抜けるまでの 94 フレーム(約 1.6 秒)敵と重なり続ける。無敵時間が 60 フレームなら、群れの中で無敵が切れてもう一度被弾し、体力は 3 残る。93 フレーム以上にすると、1 回の被弾だけで群れを抜けられる。逆に 22 フレーム以下では、無敵が切れるたびに被弾して群れの中でやられる。
合う長さはキャラクターの速さや敵の並び方で変わる。キャラクターが遅いほど敵を離れるまでに時間がかかるので、無敵時間も長く要る。
無敵が切れたときに敵と重なっている場合
無敵時間は被弾の間隔を空けるだけで、キャラクターを敵から離しはしない。敵と重なったまま無敵が切れると、切れた直後のフレームでまた被弾する。デモの下の段を 60 フレームのまま「敵の群れの中を突っ切る」で見ると、2 回目の被弾は無敵が切れた直後のフレームで起きている。
これを防ぐには、無敵が切れるまでに敵から離れているようにする。一つは被弾したときにキャラクターを敵から押し離す方法(「ノックバック」)である。無敵が切れる前に敵から離れているので、切れた直後の被弾が起きにくい。もう一つは無敵のあいだも敵とは重ならないように押し戻す方法である。敵の体をすり抜けられなくなるので、長い無敵時間を使って群れを突っ切ることもできなくなる。
回避の無敵
無敵は被弾した後のほかに、回避の動作にも付ける。回避の動作のうち一部のフレームを無敵にしておくと、攻撃が当たる瞬間に合わせて回避すれば攻撃を受けずにくぐり抜けられる。この無敵を回避の無敵と呼ぶ。被弾した後の無敵は失敗した後に立て直すためのもので、回避の無敵は攻撃に合わせた操作に応えるためのものである。回避の無敵のフレームが短いほど、回避を合わせるのは難しくなる。
次の回避を出せるのは、今の回避が終わってからである。回避の動作の最後まで無敵にすると、回避を続けて出すだけで無敵が途切れず、どの攻撃も当たらない。動作の終わりには無敵でないフレームを残し、回避した後に隙ができるようにする。
無敵のあいだに攻撃できるか
被弾した後の無敵のあいだに攻撃を受け付けるかどうかも決めておく。受け付けると、被弾した直後に反撃できる。一方で、無敵のあいだは敵の攻撃を気にせずに攻撃できるので、わざと被弾して無敵のあいだに敵を攻め立てる遊び方ができてしまう。受け付けなければ、被弾するたびに攻撃が止まり、被弾は仕切り直しになる。
無敵であることの見せ方
無敵がいつ切れるかが見えないと、プレイヤーは敵に近づいてよいかを判断できない。そのため、無敵のあいだはキャラクターの見た目を変える。デモの「無敵のあいだの見せ方」を「変えない」にすると、下の段の無敵がいつ切れたのかは下の帯を見ないとわからない。
見た目の変え方には、点滅させる方法と半透明にする方法がある。点滅は速すぎると光に敏感な人の負担になるので、1 秒に 3 回を超えて明滅させない。デモでは半透明にしたうえで、濃さを 1 秒に 2 回の速さでゆっくり変えている。
プレイヤーの攻撃が続けて当たる場合
プレイヤーの攻撃にも同じ問題がある。剣の判定が数フレーム続くと、敵と重なっているあいだ毎フレーム当たって、1 回振っただけで敵の体力が一気に減る。敵に無敵時間を付けても防げるが、無敵のあいだに当てた次の攻撃まで効かなくなる。攻撃ごとに当てた相手を覚えておき、同じ攻撃は同じ相手に 1 回だけ当てれば、続けて出した攻撃はそれぞれ当たる。