このカテゴリはAAWなどのゲームとかを元に
これからFlashゲームを作る人とかゲームの仕組みに興味がある人に
僕の知ってることを中途半端ながら語ってみようというものです。
ちなみに今までの話はこちらから見れます。
ここで語ることはあくまで自己流なので注意。
今回はアクションゲームや格闘ゲームでの攻撃判定のお話。
攻撃範囲の話は以前もしましたが、今回は当たった後の判定の話です。
結構じみーな話で、絵とか無くて文字ばっかですいません。
例えばパンチをして、その攻撃が3フレームの間攻撃範囲を出すとします。
その3フレームの間、攻撃が当たった処理が続いてしまい、3Hitしてしまうわけです。
これを防ぐための選択肢としては、
1・攻撃範囲は1フレームしか出ないようにする。
2・攻撃が当たったら、当たったキャラが無敵になる。
3・同じ攻撃が2回以上当たらない処理にする。
ということが考えられます。
1が一番簡単ですが、根本的な問題解決ではないです。長い攻撃も作りたいですし、複数の敵をなぎ倒したり、飛び道具なんかが使えなくなります。
2はアクションゲームでよく使われる方法です。
AAWも、敵の攻撃が操作キャラに当たった時はこの処理をしています。
同じ発想として、シューティングゲームなんかは敵に当たった弾が消えるというのもあります。
ところが、連続攻撃を当てたい格闘ゲームや、敵キャラクターには使えない場合もあります。
そこで3の、同じ攻撃が2回当たらないようにするという方法が出てくるわけです。
先に実装方法の話をしてしまうと、僕が使っているのは
攻撃それぞれにID番号を振り分け、当たったキャラがそれを記憶していて、同じIDの攻撃を無視するという方法です。
システム上に「ID発行所」なるものを1つ作っておき、攻撃する側がここに「IDおくれ~」と言えば連番でIDをくれるようになっています。
これを攻撃に乗せて相手に渡し、攻撃が当たったキャラはそれを保存し、次回から攻撃範囲を、保存したIDと比較してから攻撃を受けるかどうかを判定します。
(ちなみに僕はID発行を、攻撃を管理するクラスのstaticなとこへまかせています。)
この方法の良い点は、単純に同じ攻撃を2度受けないようにするだけではなく、1度にガガガガガッっと当たるような連続攻撃も作れることです。
AAWのしぃのダッシュ攻撃がこれで、2フレームか3フレームごとにID発行所から新しいIDをもらって、攻撃範囲のIDを取り替えています。
連続攻撃の速度や回数を調節するのも簡単です。
逆に注意しなければいけない点はIDの保存数です。
保存するIDが1つだけではもちろん上手く行かないので(2種類の攻撃を1度に受けたら交互にIDが切り替わってしまい、同じ攻撃を何度も受けてしまう)配列にして複数保存しているのですが、多すぎると処理が重くなってしまいます。
僕はMAX数を10に設定し、それより多くなるとところてん式に消えていく処理にしています。(なので同時に11体の敵に攻撃を受けると処理が変になるのですが、まあそんな場面は無いでしょうというところです。)
すりぬけるのではなく、「Hitしてるんだけど攻撃を受けた側がダメージやリアクションを起こさない」という感じですね。
このときしっかりヒットストップや硬直を(特に格闘ゲームでは)設定しておく必要があります。
場合によっては通常時と防御時とでは違う硬直があったほうがいいかもしれません。
また、ヒットした時にお互いに相手を少し弾く処理も入れておかないと壁際ではまります。
もちろん攻撃IDはちゃんと保存させてください。
演出として、後ろ向きにガードした瞬間は相手の方向に向き直るほうがいいでしょう。
無敵はガードより簡単です。
処理を切り捨てて、当たらなかったことにしておきます。
ただし、格闘ゲームでは相手との押し合いの判定は残してすり抜けないようにしましょう。
2D格闘ゲームの基本的なガード成立条件は
「敵が攻撃を出している時に、自分に対して後ろか、相手に対して前にキーを入力する」
というものです。
自分に対して後ろか、相手に対して後ろというのは(ゲーム差はありますが最近のゲームは)片方でも満たしていればガード成功とするようです。
よって、相手に回りこまれ、自分と相手が同じ方向を向いている瞬間や、後ろから飛んでくる飛び道具に対しては両方どちらを押してもガードが成立します。
格闘ゲームではキャラが歩いたり攻撃を受けると相手のほうに振り向くので、回り込まれた状態で攻撃された場合、ガードが成功してからガード方向が変わるわけです。
1回の余裕ができるわけですが、これくらいの余裕が無いといわゆる「めくり」と呼ばれる、相手の後ろに回りこむ戦法が、もの凄く強くなってしまうようです。
ガードの方向を、敵が自分よりどっちにいるか?で判定してしまうと飛び道具で両側から攻められたときにガード不能になりますし、ほぼ重なっている時にはどっちへガードしていいのかわからないのでお勧めできません。
飛び道具は固有に向きを持っている場合がほとんどのようです。
攻撃の中にはこのガード方向が逆転しているという特殊なものもあるようです。
・ガードに上段・下段があり、それぞれにガード不能な攻撃がある。
・ガードしていても少しだけダメージを受ける攻撃がある(俗に言う削り)
・ガードに時間や、受けれる攻撃の数などの制限がついている。
・投げ技がある。
これくらいが一般的な方法でしょうか。
上下段システムについては格闘ゲームをやっている人には分かりきったシステムでしょうが、一応説明しておくと、普通のガードでは足元の攻撃をガードできず、しゃがみガードでは空中からの攻撃をガードできないというシステムのことです。
最近では少し複雑で、地上にいてもしゃがみガードを崩せる攻撃や、空中でガードできない対空攻撃など判定も面倒になってきています。
それでもわりと単純なif文で作れます。
ただし、しのぎを削る反射神経なゲームになりますので、アクションゲームなどのオキラクなゲームにに無闇に入れていいシステムではありません。
また、複数の敵や飛び道具があるとき、下段と空中攻撃を同時に出せないように注意しましょう。
削りもまたメジャーな方法です。
体力が1の時に削りで死ぬゲームと、最後だけは削られないゲームがあります。
最近は後者が主流です。
攻撃に普通のダメージのほかに削り用のダメージも用意しておくのがポイントです。
これによって削りが強い攻撃と、そうでない攻撃を調節できます。
ガードの制限はゲームによって大きく違います。
例えばガードを続けていると画面上の専用バーが減っていき、0になるとガード不能になるとかです。
入れていないゲームも多くあります。
投げ技はほとんどの格闘ゲームにあります。
必殺技が投げ技のゲームもありますし、通常攻撃にも投げ判定があるものもあります。
あまり投げ技が強すぎるとゲームバランスが悪くなるので注意してください
また、倒れて起き上がるときなどは少しだけ投げができなくなるようにしておかないと、倒す→投げる→倒すの無限ループができてしまいます。
重要なのはこういうものをちゃんと選択して入れる事です。
特にアクションゲームにはあまり必要ありません。
対コンピュータのゲームで、ガードを崩されて面白がる人はあまりいませんから。
また、敵同士、味方同士は攻撃が当たらないことが普通です。
そこで攻撃には、その攻撃がどっちのものか?という情報も持たせておく必要があります。
AAWではタクシーが、両方へ攻撃が当たるキャラとして登場しました。
操作キャラの技で自分も巻き込まれるものも作りたかったのですが入れられませんでした。
ここで注意したいのは、例えばタクシーのように体当たり攻撃を出す場合、攻撃が自分には当たらないようにする必要があり、爆弾を投げるような自分巻き込み攻撃の場合は自分にもあたる必要があるということです。
ちなみに製作中にはタクシーでこれを間違えて、登場した瞬間に自分で自分を攻撃して倒れてしまうという状況がありました。
これが無いと弱攻撃を延々と当てられてしまうので、どんな弱い攻撃にも少しだけ入れておきます。
格闘ゲームでは壁際のことも考えて、相手だけではなく自分も下がるような仕組みにしておきます。
ゲームによっては壁のせいで敵を離せなかった場合、その分が自分の下がる量に上乗せされるものもあります。
また、相手を弾く値がマイナスの「引き寄せ」と言われる技もあります。
結構じみーな話で、絵とか無くて文字ばっかですいません。
単体攻撃と連続攻撃
ゲームで攻撃範囲がキャラの当たり範囲に重なっている時、ダメージを受けるという処理を作っていて問題となるのは、同じ攻撃が何度も当たってしまうことです。例えばパンチをして、その攻撃が3フレームの間攻撃範囲を出すとします。
その3フレームの間、攻撃が当たった処理が続いてしまい、3Hitしてしまうわけです。
これを防ぐための選択肢としては、
1・攻撃範囲は1フレームしか出ないようにする。
2・攻撃が当たったら、当たったキャラが無敵になる。
3・同じ攻撃が2回以上当たらない処理にする。
ということが考えられます。
1が一番簡単ですが、根本的な問題解決ではないです。長い攻撃も作りたいですし、複数の敵をなぎ倒したり、飛び道具なんかが使えなくなります。
2はアクションゲームでよく使われる方法です。
AAWも、敵の攻撃が操作キャラに当たった時はこの処理をしています。
同じ発想として、シューティングゲームなんかは敵に当たった弾が消えるというのもあります。
ところが、連続攻撃を当てたい格闘ゲームや、敵キャラクターには使えない場合もあります。
そこで3の、同じ攻撃が2回当たらないようにするという方法が出てくるわけです。
先に実装方法の話をしてしまうと、僕が使っているのは
攻撃それぞれにID番号を振り分け、当たったキャラがそれを記憶していて、同じIDの攻撃を無視するという方法です。
システム上に「ID発行所」なるものを1つ作っておき、攻撃する側がここに「IDおくれ~」と言えば連番でIDをくれるようになっています。
これを攻撃に乗せて相手に渡し、攻撃が当たったキャラはそれを保存し、次回から攻撃範囲を、保存したIDと比較してから攻撃を受けるかどうかを判定します。
(ちなみに僕はID発行を、攻撃を管理するクラスのstaticなとこへまかせています。)
この方法の良い点は、単純に同じ攻撃を2度受けないようにするだけではなく、1度にガガガガガッっと当たるような連続攻撃も作れることです。
AAWのしぃのダッシュ攻撃がこれで、2フレームか3フレームごとにID発行所から新しいIDをもらって、攻撃範囲のIDを取り替えています。
連続攻撃の速度や回数を調節するのも簡単です。
逆に注意しなければいけない点はIDの保存数です。
保存するIDが1つだけではもちろん上手く行かないので(2種類の攻撃を1度に受けたら交互にIDが切り替わってしまい、同じ攻撃を何度も受けてしまう)配列にして複数保存しているのですが、多すぎると処理が重くなってしまいます。
僕はMAX数を10に設定し、それより多くなるとところてん式に消えていく処理にしています。(なので同時に11体の敵に攻撃を受けると処理が変になるのですが、まあそんな場面は無いでしょうというところです。)
防御と無敵
防御というのは判定レベルでチェックされるものなのですが、結構気をつけなければいけません。すりぬけるのではなく、「Hitしてるんだけど攻撃を受けた側がダメージやリアクションを起こさない」という感じですね。
このときしっかりヒットストップや硬直を(特に格闘ゲームでは)設定しておく必要があります。
場合によっては通常時と防御時とでは違う硬直があったほうがいいかもしれません。
また、ヒットした時にお互いに相手を少し弾く処理も入れておかないと壁際ではまります。
もちろん攻撃IDはちゃんと保存させてください。
演出として、後ろ向きにガードした瞬間は相手の方向に向き直るほうがいいでしょう。
無敵はガードより簡単です。
処理を切り捨てて、当たらなかったことにしておきます。
ただし、格闘ゲームでは相手との押し合いの判定は残してすり抜けないようにしましょう。
片面ガードの判定
格闘ゲームでは正面からのみの攻撃をガードする、片面ガードが使われているものが多くあります。2D格闘ゲームの基本的なガード成立条件は
「敵が攻撃を出している時に、自分に対して後ろか、相手に対して前にキーを入力する」
というものです。
自分に対して後ろか、相手に対して後ろというのは(ゲーム差はありますが最近のゲームは)片方でも満たしていればガード成功とするようです。
よって、相手に回りこまれ、自分と相手が同じ方向を向いている瞬間や、後ろから飛んでくる飛び道具に対しては両方どちらを押してもガードが成立します。
格闘ゲームではキャラが歩いたり攻撃を受けると相手のほうに振り向くので、回り込まれた状態で攻撃された場合、ガードが成功してからガード方向が変わるわけです。
1回の余裕ができるわけですが、これくらいの余裕が無いといわゆる「めくり」と呼ばれる、相手の後ろに回りこむ戦法が、もの凄く強くなってしまうようです。
ガードの方向を、敵が自分よりどっちにいるか?で判定してしまうと飛び道具で両側から攻められたときにガード不能になりますし、ほぼ重なっている時にはどっちへガードしていいのかわからないのでお勧めできません。
飛び道具は固有に向きを持っている場合がほとんどのようです。
攻撃の中にはこのガード方向が逆転しているという特殊なものもあるようです。
ガード崩しと削り、ガード攻撃
格闘ゲームなどの対人戦では、ずーっとガードされることを防ぐために、色々な仕組みをつけています。・ガードに上段・下段があり、それぞれにガード不能な攻撃がある。
・ガードしていても少しだけダメージを受ける攻撃がある(俗に言う削り)
・ガードに時間や、受けれる攻撃の数などの制限がついている。
・投げ技がある。
これくらいが一般的な方法でしょうか。
上下段システムについては格闘ゲームをやっている人には分かりきったシステムでしょうが、一応説明しておくと、普通のガードでは足元の攻撃をガードできず、しゃがみガードでは空中からの攻撃をガードできないというシステムのことです。
最近では少し複雑で、地上にいてもしゃがみガードを崩せる攻撃や、空中でガードできない対空攻撃など判定も面倒になってきています。
それでもわりと単純なif文で作れます。
ただし、しのぎを削る反射神経なゲームになりますので、アクションゲームなどのオキラクなゲームにに無闇に入れていいシステムではありません。
また、複数の敵や飛び道具があるとき、下段と空中攻撃を同時に出せないように注意しましょう。
削りもまたメジャーな方法です。
体力が1の時に削りで死ぬゲームと、最後だけは削られないゲームがあります。
最近は後者が主流です。
攻撃に普通のダメージのほかに削り用のダメージも用意しておくのがポイントです。
これによって削りが強い攻撃と、そうでない攻撃を調節できます。
ガードの制限はゲームによって大きく違います。
例えばガードを続けていると画面上の専用バーが減っていき、0になるとガード不能になるとかです。
入れていないゲームも多くあります。
投げ技はほとんどの格闘ゲームにあります。
必殺技が投げ技のゲームもありますし、通常攻撃にも投げ判定があるものもあります。
あまり投げ技が強すぎるとゲームバランスが悪くなるので注意してください
また、倒れて起き上がるときなどは少しだけ投げができなくなるようにしておかないと、倒す→投げる→倒すの無限ループができてしまいます。
重要なのはこういうものをちゃんと選択して入れる事です。
特にアクションゲームにはあまり必要ありません。
対コンピュータのゲームで、ガードを崩されて面白がる人はあまりいませんから。
攻撃対象
飛び道具などは出した本人が触ってもダメージを受けません。また、敵同士、味方同士は攻撃が当たらないことが普通です。
そこで攻撃には、その攻撃がどっちのものか?という情報も持たせておく必要があります。
AAWではタクシーが、両方へ攻撃が当たるキャラとして登場しました。
操作キャラの技で自分も巻き込まれるものも作りたかったのですが入れられませんでした。
ここで注意したいのは、例えばタクシーのように体当たり攻撃を出す場合、攻撃が自分には当たらないようにする必要があり、爆弾を投げるような自分巻き込み攻撃の場合は自分にもあたる必要があるということです。
ちなみに製作中にはタクシーでこれを間違えて、登場した瞬間に自分で自分を攻撃して倒れてしまうという状況がありました。
吹き飛ばしと反動
攻撃が当たった瞬間に自分と相手がどれくらい弾かれるか?は結構重要です。これが無いと弱攻撃を延々と当てられてしまうので、どんな弱い攻撃にも少しだけ入れておきます。
格闘ゲームでは壁際のことも考えて、相手だけではなく自分も下がるような仕組みにしておきます。
ゲームによっては壁のせいで敵を離せなかった場合、その分が自分の下がる量に上乗せされるものもあります。
また、相手を弾く値がマイナスの「引き寄せ」と言われる技もあります。
コメント
24 投稿者: BlogPetの麦茶 (2006年03月08日 09:14)
ネットで仕組みとか中途半端とか語ることは
麦茶たちが、ネットでアクションゲームなどを格闘したいみたい。
25 投稿者: プルコギ (2006年03月10日 17:53)
みたいですね。