• ベストアンサー

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

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

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

  • ベストアンサー
  • masaota56
  • ベストアンサー率41% (58/139)
回答No.4

> 壁や床や敵の当たり判定は種類別にして構造体を配列にいれて判定をすればいいのですか? > だとしたら毎フレームこれらのリージョンと自機のリージョンを判定するのでしょうか? 毎フレーム判定すれば良いと思います。 大まかな判定を先にして、それにヒットすれば細かく判定するというようにすると良いですよ。 たとえば、丸形の当たり判定は先に矩形で行ってからすると言った具合です。 > スクロールするステージを作成する予定なので、床や壁は結構多くなってしまうのですが・・・ そんなものじゃないでしょうか? 2Dのアクションゲームの場合、重くなる原因は、計算よりもむしろ描画処理だと思います。

smily_k_c
質問者

お礼

ありがとうございます。 毎フレーム「全ての」当たり判定を判定する、というのがずっと気になっていました。 とりあえずは何も考えずに作ってみようと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

多分作るゲームは2Dですよね? http://ja.wikipedia.org/wiki/%E5%BD%93%E3%81%9F%E3%82%8A%E5%88%A4%E5%AE%9A http://www5f.biglobe.ne.jp/~kenmo/program/collision/2d/2d.html >毎フレームでこのような判定を繰り返すと重くなってしまうのでは 2Dゲームを今まで作ってきて、当たり判定の処理速度で困ったことは無いです。 (よほど判定回数が多くなければ)

smily_k_c
質問者

補足

はい、初心者なのでもちろん2Dに挑戦しようと思います。 初心者意見で申し訳ないのですが、もうひとつ伺ってもいいでしょうか? 壁や床や敵の当たり判定は種類別にして構造体を配列にいれて判定をすればいいのですか? だとしたら毎フレームこれらのリージョンと自機のリージョンを判定するのでしょうか? スクロールするステージを作成する予定なので、床や壁は結構多くなってしまうのですが・・・

全文を見る
すると、全ての回答が全文表示されます。
  • masaota56
  • ベストアンサー率41% (58/139)
回答No.2

普通に座標から計算すれば、特に重くはなりませんよ。 一度それで、Cより明らかに遅い(はず)HTAでエアーホッケーゲームを作ったことがあります。

smily_k_c
質問者

お礼

座標計算というのはリージョンとは別なのでしょうか? 今リージョンを使ってやるつもりでいるのですが・・・

全文を見る
すると、全ての回答が全文表示されます。
  • eroermine
  • ベストアンサー率18% (83/444)
回答No.1

当然仮想画面でやってるんですよね。

smily_k_c
質問者

補足

ダブルバッファリングは出来たので、仮想画面でやるつもりです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 当たり判定

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

  • 当たり判定のデータを残したい

    前回、簡単な当たり判定作りたいの追加希望です。 振り返りますと現状 sassakunさん回答ANo.3参考のフロー出来上がりました。 今回質問1です。 前回フロー(4)の判定結果を履歴と残し表示させたいのです。 つまり、フロー途中で・・・              ↓ (4)プログラム判定結果、画面上スベリで当たりor外れ表示              ↓ (4.1)    履歴 当たり○回 外れ○回 を適当に付近へ表示              ↓ としたいです。もちろん繰り返しフローですので 外れ及び当たりの履歴は増えていきます。(できたら履歴を0にする リセット機能もあれば便利です) 質問2 タイムラインでなくダイナミックテキストのみでスクロールさせて いますがフロー(2)~(4)の最中サウンドは可能なのでしょうか、 つまりボタン“オン”で音楽スタート→(2)・・(4)の判定後表示と同時にサウンド停止。 以上ここまでの(追加部分)フローをまとめます (1)ボタン“オン”      ↓ (2)音楽スタート(今回追加) 画面上当たり、ハズレ、当たり、はずれ・・とループ横スクロール       ↓ (3)ボタン“オン” 音楽再生中・・      ↓ (4)プログラム判定結果、画面上スベリで当たりor外れ表示同時に再生 中の音楽ストップ   同時に当たり○回 外れ○回 を適当に付近へ表示(今回追加)      ↓ (5)ボタン“オン”      ↓      (2)へ 質問3  フロー(4)“スベリ”部分速度って調節可能ですか? 質問4 当たりのときにタイムフレームへ移動、画面上演出したいのでが複雑になりかけているので今後の希望にします。 何度もお手数かけています。           

    • ベストアンサー
    • Flash
  • 回転する矩形同士の当たり判定について

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

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

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

  • C#で壁の当たり判定と自キャラの移動で困っています

    初投稿です。C#のコンソールアプリケーションでゲーム作りをしているC#初心者です。 GraphicsExというフォームを作ってそこに壁を描画するところまではできたのですが、画像を自キャラとして動かせるとよいのですが、できないので今はとりあえず丸を描画して動かしています。 質問なのですが、自キャラを丸で描画して動かすと、壁の当たり判定が分からないので、キャラ(ただの丸ですが)が壁をすり抜けてしまいます。壁にぶつかった時にそれ以上進めないようにするために壁の当たり判定をどなたか教えてほしいです。 あとGraphicsを使っているからか、プログラムがおかしいのか分かりませんが(おそらく後者(汗)キャラの移動はキー入力でやっていて、数秒は意図した通りに移動できるのですが何故かキャラを移動しても、しなくても数秒後にフォームがとまってしまい動かなくなります。どのようにプログラムを記述をするとうまく自キャラの操作をできるのかも教えていただけるとすごく嬉しいです。 重ね重ね恐縮ですが、できればソース付でお願いします。 そもそも、コンソールアプリケーションでゲームを作るべきではない、DirectXを使うべきだ、とかあると加えてアドバイスほしいです。 (ウインドウズフォームもDirectXもあまり詳しくないですが。。。orz) 一応いままでのおおまかなプログラムを載せておきます。長文失礼しました。

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

    以前の質問で、アクションスクリプトの記述がなかったので、詳しく説明します。http://oshiete1.goo.ne.jp/qa3535566.html 自機は、キーボードで操作します。 if(Key.isDown(87)){ gotoAndPlay(3) } if(Key.isDown(83)){ gotoAndPlay(5) } 3は上向きグラフィック、5は下向きグラフィックです。 246フレームには、 gotoandplay(1) と記述しています。 当たり判定は、別レイヤーにあります。 ステージ上の自機にmyshipというインスタンス名を付けています。 敵弾に当たると自機はbangjikiになります。 if(this.hitTest(_root.myship.hitarea)){ _root.myship.gotoAndPlay("bangjiki") _parent.removeMovieClip() }

  • 動画の処理

    プログラミングでHelloWorldに毛が生えた程度のことしかできないのに、動画の処理をしなきゃいけなくなりました。 できれば自宅のパソコンでやりたいと考えています。(Windows2000) まず、フレーム間差分からやってみようと思っているのですが、どうやって手をつけていいかさっぱりわかりません。 おすすめの言語、HP、書籍などを教えて欲しいです。 アドバイスとかもいただけると嬉しいです。 よろしく御願いします。

  • 高さのあるクォータービューの当り判定について

    VC++2010&DXライブラリを使用してタクティクスオウガやモナークモナークのようなSLGをふと作りたくなり、クォータービューを採用しました。 全くの平面な状態ですと、それぞれのブロックチップのひし形の4つの座標を、それぞれ通る4本の一次関数式と現在のマウスカーソル位置との範囲内計算をさせることで、カーソルがあたっている部分だけ色を変えるという処理(ゲーム内カーソルの表示)をさせる処理は上手くいきました。 また、ひし形の頂点の座標をCreatePolygonRgn();とPtInRegion();を使う処理に変えてみても大丈夫でした。 しかし添付しました画像のようにマップに高さの概念を加えていくと、ひし形が重なり合う部分が出てきてしまい、画像のように 青の部分にマウスカーソルが入るとAとBが選択されて色が変わった状態になり、 緑の部分にマウスカーソルが入るとCとBが選択されて色が変わった状態になり、 赤の部分にマウスカーソルが入るとDとBが選択されて色が変わった状態になってしまいます。 (いずれの場合も、一番手前にあるBの面だけが選択され、色が変わった状態になってほしい、 というのが理想としている動きです) CreatePolygonRgn();も使えるので、例えばこの画像のような例ですとAは変形六角形、CとDは変形五角形として扱うこともできそうですが、常にこういった高さの違うマップだけを表示する、というわけではなく、ブロックによっては高さが任意に変わってしまうため、変形多角形のパターンも多岐になるであろうことが予測できてしまい、目の前が真っ暗になってしまっております。 こういった場合のマウスカーソルの当り判定につきまして、何か良い処理方法をご存知の方がいらっしゃいましたら何卒お教えくださいますようお願いします。

  • DLLって

    C言語を勉強しているのですが、いまいちよくDLLの意味がわかりません。例えば、シューティングのゲームで、当たり判定の処理をDLL形式?で保存して、違うシューティングを開発するときにそのDLLの関数を使って当たり判定を簡単にする。みたいな解釈でいいのでしょうか。また作成するときはどうやって作ればいいのでしょうか。ちなみにvisual studio 2008を持っています。ご教授お願いします。

  • direct3dで当たり判定

    現在direct3dでフライトゲームを作っており、当たり判定部分を考えているのですがうまくいきません。メタセコイアでxファイルを作成し、ビルボードで表示している(敵も自弾も)のですが、そもそも基準点はどこに来るのか、プログラム上で指定する縦横高さがわからないなど当たり判定以前の問題のような気もするのですが・・・。とりあえず、該当部分のコードを載せるのでご享受お願いします。 ↓ゲームメインの攻撃部分↓ if(GetKeyboardTrigger(DIK_Z)){ _for(int i = 0; i < ATTACKNUM; i++){ __if( man_bullet[i].flag.bullet == 0){ ___man_bullet[i].flag.bullet = 1; ___//自機の座標セット ___mat_world[15+i]._41 = mat_world[0]._41; ___mat_world[15+i]._42 = mat_world[0]._42+2; ___mat_world[15+i]._43 = mat_world[0]._43; ___break; __} _} } for(int i = 0; i < ATTACKNUM; i++){ _if(man_bullet[i].flag.bullet == 1){ __mat_world[15+i]._43 ++; __man_bullet[i].cnt.bullet++; __if(man_bullet[i].cnt.bullet >= 100){ ___man_bullet[i].flag.bullet = 0; ___man_bullet[i].cnt.bullet = 0; ___mat_world[15+i]._42 = -100; __} __for(int j = 0; j < ENEMYNUM; j++){ ___man_bullet[i].flag.atk_result = ___Hit_Judging(&mat_world[5+j]._41, &mat_world[5+j]._42, &mat_world[5+j]._43, ________enemy[j].x, enemy[j].y, enemy[j].z, ________&mat_world[15+i]._41 , &mat_world[15+i]._42, &mat_world[15+i]._43, ________man_bullet[i].x, man_bullet[i].y, man_bullet[i].z ); ___if(man_bullet[i].flag.atk_result == 1){ ____man_bullet[i].flag.atk_result = 0; ____man_bullet[i].flag.bullet = 0; ____man_bullet[i].cnt.bullet = 0; ____mat_world[5+j]._43 = 150; ____mat_world[15+i]._42 = -100; ____break; ___} __} _} } ↓当たり判定部分↓ int Hit_Judging( float *xpos1 , float *ypos1 , float *zpos1 , ________float x1, float y1, float z1, ________float *xpos2 , float *ypos2 , float *zpos2 , ________float x2, float y2, float z2 ) { _for(int i = 0; i < ATTACKNUM; i++){ __if(man_bullet[i].flag.bullet == 1){ ___for(int j = 0; j < ENEMYNUM; j++){ ____if( ((xpos1[j] - (x1/2) ) < (xpos2[i] + (x2/2) ) && ______(xpos1[j] + (x1/2) ) > (xpos2[i] - (x2/2) )) && ______((ypos1[j] + y1 ) < ypos2[i] && ypos1[j] > (ypos2[i] + y2 )) && _______(zpos1[j] == zpos2[i]) ){ _____return 1; ____}else _____return 0; ___} __} _} }