• ベストアンサー

当たり判定

ゲームで欠かせない処理それが「当たり判定」ですよね。 攻撃によるダメージ、倒したり、倒されたり。 アイテム獲得や複雑な地形に対する行動範囲設定。 複雑な形をした敵(ボスキャラなど)の当たり判定など。 当たり判定にも多数あり、それぞれメリット・デメリットがあると思います。 最近はゲームも2Dから3Dに移りつつあるので方法は余計に増えてきたと思います。 その「当たり判定」の方法とメリット・デメリットを出来るだけたくさん教えてください。

  • nVIDIA
  • お礼率46% (520/1121)

質問者が選んだベストアンサー

  • ベストアンサー
  • moritan2
  • ベストアンサー率25% (168/670)
回答No.2

2Dでも昔のスプライトを使ってた時代や、現在でも古典的な2D描画(WindowsならBitBlt系のAPIを使った描画を使うゲーム)では長方形同士のあたり判定を使うことが多いようです。これは判定が非常に簡単で高速です。ゲームにもよると思いますが、通常はダメージを食らう場所の数個長方形をおきます。 2Dでももう少し時代が後になって図形の回転を伴うような描画を使うようになってからは、回転した長方形では計算が面倒なので円を使うことが多いと思います。攻撃の円の中心座標を(ax,ay)、攻撃の円の半径をarとし、食らい側の中心座標を(dx,dy)、半径をdrとすると(ax-dx)^2+(ay-dy)^2 < (ar+dr)^2なら当たりです。 3Dの場合はコリジョンという言葉を使うことが多いようですが、やってることはこれをx,y,zでやるだけです。 他に非常に動きの早い弾丸や光線では、当たりの形を円柱にします。

nVIDIA
質問者

お礼

どうもご親切な説明ありがとうございます。 ぜひ参考にさせていただきます。

関連するQ&A

  • 壁との当たり判定

    objective-cでプレイヤーと壁の当たり判定に困っています。 いろいろと検索して参考になるサイトをさがしてはいるんですが なかなか見つかりません。 何かお勧めのサイト、または書籍などあれば教えて下さい。 ちなみに当たる壁は複雑な地形の画像でやっています。

  • 処理の速い当たり判定について[WINSOWS][C]

    いつもお世話になっております。 WINDOWSプログラミングを勉強しています。 現在当たり判定について勉強しているのですが、調べてみたところいろいろなやり方があるようです。 私が今作ろうとしているのはアクションゲームなのですが、接地、ダメージ等々の当たり判定があり、毎フレームでこのような判定を繰り返すと重くなってしまうのでは、と危惧しています。 ここで質問なのですが、WINDOWSまたはCプログラムでなるべく速く処理ができる当たり判定を教えていただけないでしょうか? また、初心者向けなものをお願いします。 我儘を言って申し訳ありませんが、ご指導よろしくお願いします。

  • 回転する矩形同士の当たり判定について

    C++でゲームのSTGのようなゲームを作成しています。 ショットの当たり判定は全て矩形で行っていますが、 レーザーのような細長いショットの場合、 どうしても斜め方向の判定が必要になってきます。 単純な回転しない矩形ならば、 それぞれの矩形の頂点座標の距離を比較するだけでいいので、 4回の比較で判定することができるのですが、 回転が加わってしまうとどうしても複雑になってしまい、 どういう風にとればいいのか解らずに困っています。 例えば、以下のような場合など、 回転を考慮しない判定だと衝突と判定されます。      ┌――┐      |   |      |   |   /\└――┘ /    \ \    /   \/ 解説サイト等を拝見しましたが、 矩形の回転の加わった当たり判定まで解説しているサイトが見当たらず、 ベクトルを使えば出来るという情報は得たものの その方法が解らずに困っています。 シーンによっては多くのショットが生成されるので 付加をするならば、できる限り高速な処理で、判定をしたいのですけども、 どなたがその方法をご存じないでしょうか? よろしくお願いします。

  • 傾いた長方形と、傾いていない普通の長方形の当たり判定のアルゴリズム教えて!

    ゲームを作ろうとして行き詰ってます。 質問はタイトルのとおりです。 一方は傾いた長方形。もう一方は普通の長方形(傾いていない)。これらの当たり判定を取る方法というかアルゴリズム的なものを教えてください。 ただし以下の条件がつきます。 ・これら2つのオブジェクトは毎フレーム動く。 知恵を貸してください。 ちなみにこれは何かというと、シューティングゲームの敵の撃つレーザーが「傾いた長方形」で、「傾いていない長方形」が自機です。

  • FPS,TPSの当たり判定

    3DのFPS,TPS,レイルシューターなどのゲームを遊んでいると、射撃対象のオブジェクトの実際の見た目と被弾判定範囲とのギャップがほとんど、というより全く無いように思えるのですが、 そのような精密で、かつ高速な当たり判定はどのように実現されているのでしょうか。 オブジェクトのモデルと全く同じ衝突判定用モデルを用いれば可能でしょうが、何千というポリゴンから成る最近のゲームキャラクターに対しては現実的な方法では無いと思います。 可能であればざっくりとした解説をお願いします。 補足: 実際の作品例を以下に挙げます。 HALOシリーズ,GOWシリーズ,バイオハザード4,罪と罰 宇宙の継承者

  • シューティングゲームの当たり判定

    現在directxを用いた(DXライブラリは使わない)インベーダーゲームを作っているのですが、当たり判定の部分がなぜかうまくいきません。自機と敵の弾の当たり判定部分のコードを載せるのでどなたかご享受ください。 //============敵の攻撃======================== if(enemy[rand_atk].tamaflag == 0 && shot_save % 100 == 0 ){ __enemy[rand_atk].tamaflag = 1; __enemy_atk[rand_atk].x = enemy[rand_atk].x+17; __enemy_atk[rand_atk].y = enemy[rand_atk].y+17; } for(i = 0; i < 11; i++){ __if(enemy[i].tamaflag == 1){ ____enemy_atk[i].y+=1; ____if(enemy_atk[i].y >= 480){ ______enemy[i].tamaflag = 0; ______enemy_atk[i].y = -20; //画面外へ ____} ____if( ( move.x - 7 < enemy_atk[i].x && move.x + 32 > enemy_atk[i].x ) && ________( move.y - 13 < enemy_atk[i].y && move.y + 24 > enemy_atk[i].y ) ){ ______move.zanki--; ______enemy[i].tamaflag = 0; ______enemy_atk[i].y = -20; //画面外へ ____} __} } move.x,move.yは自機のx,y座標で横32縦24 敵の弾の大きさは横7縦13 rand_atkはrand_atk = timeGetTime() % 11;でランダムに攻撃させようとしています。

  • 【BFBC】オンラインのラグにより弾が当たらない件について【PS3】

    攻撃判定について、一般的なFPSゲームの場合 弾を発射する→自分のPS3内で攻撃判定を出す→その情報を攻撃した相手に送る→相手にダメージ、又は死亡する、→その情報(死亡等)がこちらに送られてきてそれが画面に反映され、こちらの画面上でも敵が死亡する という流れなので、弾を撃ってから相手が死亡するまでの時間にラグの影響はあっても、『ラグにより弾が当たらない』ということはありません。 ところが、BFBCで移動中の敵に対して狙撃を行った場合、弾速以外にも、ラグのことも考えて撃たなければ当たらないような気がします。 (例えば、左から右に走ってる敵を狙撃する場合、弾速+ラグの時間を考えて敵から数メートル右を撃たなければ当たらない等、ラグの時間は、RPG等の弾が見える武器のトリガーを引いてから、実際に弾が射出されるまでの時間で計算しています。) どうやら、自分の画面に写っている敵を撃てば攻撃判定が発生するというわけではなさそうなのですが、当たり判定の出し方はどうなっているのでしょうか。 こういうことに詳しい方、ご回答お願いします。

  • 敵との当たり判定

    現在VisualC++2008でゲームを製作してるんですが 自分と敵との当たり判定がわかりません。 どのようにすればいいか教えてもらえないでしょうかm(_ _)m #define SCREEN_WIDTH (640) // 画面の横幅 #define SCREEN_HEIGHT (480) // 画面の縦幅 #define CHIP_SIZE (32) // 一つのチップのサイズ #define MAP_WIDTH (SCREEN_WIDTH / CHIP_SIZE) // マップの横幅 #define MAP_HEIGHT (SCREEN_HEIGHT / CHIP_SIZE) // マップの縦幅 #define CHAR_SIZE (30) // プレイヤーのサイズ float PlX, PlY ; // プレイヤーの座標(中心座標) int ActMain( void ) { // プレイヤーの座標を初期化 PlX = 100.0F ; PlY = 1.0F ; // マップ { int i, j ; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { // 1のところだけ描画 if( MapData[i][j] == 1 ) { DrawBox( j * CHIP_SIZE, i * CHIP_SIZE, j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE, GetColor( 0, 0, 0 ), TRUE ) ; } } } } //プレイヤーの描写 DrawBox( ( int )( PlX - CHAR_SIZE * 0.5F ), ( int )( PlY - CHAR_SIZE * 0.5F ), ( int )( PlX + CHAR_SIZE * 0.5F ) + 1, ( int )( PlY + CHAR_SIZE * 0.5F ) + 1, GetColor( 255, 0, 0 ), TRUE ) ; Cr = GetColor( 255 , 255, 255 ) ; //敵の描写 DrawGraph(teki[0].x,teki[0].y,teki[0].img,TRUE); //初期化 void SYOKIKA(void){ teki[0].x=500; teki[0].y=200; teki[0].img=LoadGraph("red_player.bmp"); //当たり判定をつくったつもりですが反応せず・・・。一応あたったらPlXを0に移動させようとしています。 if(PlX==teki[0].x) PlX=0; if(PlX==teki[0].y) PlX=0; if(PlY==teki[0].x) PlX=0; if(PlY==teki[0].y) PlX=0; がソースです(文字数が足りないのであたり判定に関係ありそうな(敵と自分の座標関連)ところだけ抜きました)今のところ敵、自分、マップ表示や自分の移動などはできているのですが、敵に触れても反応せず、ときおり敵のいないまったく関係のない場所でPlXが0に移動したりしてしまいます ソースみづらくて申し訳ありません。

  • 格闘ゲームのコツを教えてください!!

    格闘ゲームのコツを教えてください!! 最近格闘ゲームをやっているのですが、敵が結構強くて梃摺っています 今やっているゲームは、パンチ、キック、掴みと投げ、ガード、ステップ、必殺技があります 基本パンチ、キックで敵にダメージを与えていくのですが、強くなっていくとガードばかりされ攻撃が利かなくなります そういうときには掴んで投げてダメージを与えているのですが、レベルが上がっていくにつれて、攻撃のコンボが終わった直後に隙が出来るのでのそときに攻撃されたり、掴もうとすると、ステップでよけられます なので、なかなか敵にダメージが与えられません 敵は巧にガード、攻撃、掴みを使い分け、着実とダメージを与えてきます ガード中に攻撃を仕掛け続けるとガードを崩せるのですが、スタミナが足りず崩せません 上記のようなことがあり、段々ストレスが溜まってきます どんな感じに操作すれば勝てるでしょうか? 教えてください!

  • 藤丸地獄変について

    今現在、藤丸地獄変をリプレイしています。 一応全てクリアーしたのですが、攻撃力がバラバラになっていませんでしたか?。敵味方受けるダメージと攻撃するダメージがだいたいいつもバラバラで、不規則です。 例としては、敵にあたえるダメージが1だったり、10いくつも与えたりと、様々です。弱点や地形なんかは関係ない様子です。 ソフトとしては、発売された当初のソフトで、ひょっとしたら動作不良なのではないかと思っていますが、プレイしていた皆さんはどうでしたか?