マップの当たり判定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
くじら

マップの当たり判定

#1

投稿記事 by くじら » 11年前

こんにちは、DXライブラリとC言語を使って2Dの横スクロールRPG的なゲームを作りたいと思っているのですが
マップの当たり判定について質問したいと思います。

現在考えているマップはこんな感じなのですが(左下の赤いやつがキャラの大きさです)
画像

マップとキャラの当たり判定に下の2値画像を使おうと思っています。
画像

で、今考えている当たり判定のアルゴリズムなのですが・・・
1. 当たり判定用の画像に描かれている線の節々の座標を取得
画像

2. 点を中心に3×3のエリア内で白い点が隣接している方向にある点同士を繋げる
  そして法線ベクトルを取得
画像

3. 自分を円として考え、円と線分の当たり判定を行い、法線ベクトルの角度が70~90°
  であれば壁と判断して進めず、進めるのであれば法線を90°傾けた方向に移動
画像

後は梯子だったり敵だったりを付けていけばいいと考えたのですが
とても実現なんて出来そうにありません!
というわけで何かマップと当たり判定を行う良い手段はありませんか?
坂道も再現できると嬉しいのですが・・・よろしくお願いします。

アバター
ookami
記事: 214
登録日時: 14年前
住所: 東京都

Re: マップの当たり判定

#2

投稿記事 by ookami » 11年前

くじらさん、
「マップと当たり判定を行う良い手段」ということは、上記のアプローチとは全く異なる方法で、ということでしょうか?

例えばBox2Dのようなライブラリも選択肢かなとは思います。
ただBox2Dは日本語のドキュメントが少ない印象なので、要調査かもしれません。

自作にこだわるのでしたら、簡略化の方法として、
「自分が半径 r の円」というのをあえて点とみなし、その分、「地形を r だけ太らせた画像」と判定する、という方法もあるかと思います。
「地形を r だけ太らせた画像」をあらかじめ手動で用意しておいて、GetPixelSoftImage(自分の座標...)等で判定するという。

ある程度低負荷かつ直観的なコードになると思うのと、
「青は氷」、「緑は梯子」など、色ごとに決めごとを作っておくこともできるかと。

反面、敵キャラが異なるサイズだとその分判定画像を用意しないといけなくて大変、とか、判定がピクセル単位になるので、斜めの床が実態は階段状であるとか、そもそもその画像を用意するのが大変とか、いろいろあるとは思いますが...

くじら

Re: マップの当たり判定

#3

投稿記事 by くじら » 11年前

ookamiさん返信ありがとうございます。
本当は自分で考えた上記の当たり判定を実現できるのが理想的で
「ペイントソフトのパス作成のような、画像上に点を打ち線で結ぶ処理はどういうアルゴリズムなのか」
というのを質問したかったのですが
こんな方法以外にももっと簡単で楽なものはないのかと疑問に思いまして…
でもなかなか無いようですね。

自分を点と見なしてGetPixelSoftImage()などで判定するのは逆転の発想で良いです!
参考にさせて頂き、もう少し策を練って見ようかと思います。
これでどうしても理想に近づかない時は改めて本来の質問の方で立ててみようかと思います。
ありがとうございました。

ISLe()

Re: マップの当たり判定

#4

投稿記事 by ISLe() » 11年前

質問は画像から点をピックアップする方法なのでしょうか。
だとしたら見当違いの回答なのですが。

『壁に沿って転がる玉』というサンプルプログラムをブログで公開しているのですが、これのネタ元でおっしゃるようなことをやってます。
ネタ元は3Dですが、デザイナから3Dモデルデータを貰って、そのデータからサンプル点を配置し座標と法線の情報をテーブルデータとして出力するツールプログラムを作って、当たり判定用の外部データ作成を自動化しました。

線分と交わっているかどうかは簡単に求められるし、線分の角度は事前に求めておけば良いし、ゲーム内での実装は、手段を知ってさえいれば、比較的簡単なほうだと思います。
問題になるのはやっぱり画像から線分の端にあたる点をピックアップする方法だけですね。

ISLe()

Re: マップの当たり判定

#5

投稿記事 by ISLe() » 11年前

わたしなら、ペイントソフトの出力したデータからパスを拾ってゲーム用のデータに変換するプログラムを作って、ペイントソフトのパス機能を使ってトレース、ペイントソフトから出力したデータを変換プログラムを通して変換する、といった手段を取ると思います。
ペイントソフトの得意分野ならペイントソフトにやらせたほうが良いのではないでしょうかね。

多機能なペイントソフトなら2値化してパスにトレースしてデータ出力まで自動化できるかもしれません。

くじら

Re: マップの当たり判定

#6

投稿記事 by くじら » 11年前

ISLe()さん返信ありがとうございます。
ペイントソフトのデータからパスを出力するとするならば、Gimpなどのソフトで作った当たり判定用のマップを
ベクターデータ(.ai)として出力し、それを解析という形になるのでしょうか。
ベクターデータがどんな形で出力されてるのか全然わからないですが、何とか調べてやってみようかと思います。
ありがとうございました。

ISLe()

Re: マップの当たり判定

#7

投稿記事 by ISLe() » 11年前

いまはアドビの公式SDKが簡単に入手できますしオープンソースのライブラリもあるのでそういったものを利用すれば良いと思います。

わざわざベクターデータに変換しなくてもPSDとかでマップの要素をいろいろ同時に仕込んだものを処理するほうが便利かもしれません。
GIMPはオープンソースなのでGIMPオリジナルの形式そのまま読み込んで使うという選択肢もあると思います。

e_ai

Re: マップの当たり判定

#8

投稿記事 by e_ai » 11年前

あれ?
ひさしぶりに来てみたけどISLeさんってここもう来ないって宣言?してませんでしたっけ?

やっぱり我慢できなかったのかな?w
別人だったらすいません・・・

閉鎖

“C言語何でも質問掲示板” へ戻る