エアホッケーみたいなゲームの当たり判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
AKIЯA
記事: 58
登録日時: 11年前

エアホッケーみたいなゲームの当たり判定について

#1

投稿記事 by AKIЯA » 11年前

ブロック崩しの当たり判定はあったのですが
このように前後左右に動くラケットでラケットの当たり判定をどうしたらよいのか困ってます。
試作品はラケットとボールがすり抜けまくってます^^;

試作品のサンプルのcodeは以下になります。

1.ラケットを移動させてすり抜けない反射の仕方
2.ボールをラケットが強く押し出したときに移動量を増やしスピードをあげたい

知恵を貸していただければ幸いです。
► スポイラーを表示
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:32 [ 編集 3 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: エアホッケーみたいなゲームの当たり判定について

#2

投稿記事 by みけCAT » 11年前

反射処理を何もしていないので、すり抜けるに決まっています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#3

投稿記事 by AKIЯA » 11年前

反射処理の概要が知りたいのですToT

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#4

投稿記事 by AKIЯA » 11年前

がっつりすり抜けてますが
ここからどうのに変更していけばいいのかがさっぱりで困ってます。
► スポイラーを表示
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:32 [ 編集 1 回目 ]

アバター
みょん
記事: 16
登録日時: 11年前
住所: 京都
連絡を取る:

Re: エアホッケーみたいなゲームの当たり判定について

#5

投稿記事 by みょん » 11年前

ラケットがA->B、ボールがC->Dに動いた時の座標を取得し(前回の座標を変数で記憶しておく必要があると思います)、線分ABと線分CDが交差するかどうかを判定すれば良いです
計算するのが面倒orやり方がわからない場合はhttp://marupeke296.com/COL_2D_No10_Segm ... gment.html この辺見ればいいんじゃないでしょうか
もしもそれでも上手くいかないほど直線からそれる場合は当たり判定の処理をする間隔を縮める必要があります。

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#6

投稿記事 by AKIЯA » 11年前

myuon_myonさんへ

物理の数式見てもさっぱりでcodeならわかりそうなので
code見て頑張ってやってみます。

ありがとうございます。

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#7

投稿記事 by AKIЯA » 11年前

とりあえず、ここまで頑張って見ましたが
まだ判定が甘く、ここから追加するとどんな風に追加すればいいのかわかりませんToT
intからfloat変換は今は無視してます。
► スポイラーを表示
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:33 [ 編集 1 回目 ]

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#8

投稿記事 by AKIЯA » 11年前

まだ何かが足りませんね。まだすり抜けてます。
でも一歩前進した気がします。
► スポイラーを表示
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:33 [ 編集 1 回目 ]

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#9

投稿記事 by AKIЯA » 11年前

試行錯誤を繰り返し、ラケットの移動が早すぎてすり抜けてるはずなのですが
そこでold_racket_pointで1フレーム前の座標を保存してguard_frame_chk()で
1フレーム間で移動した距離分ループを行い、当たり判定を増やして見たのですが
理屈的にはこれでいいはずだと思っているのですが、上手く行きません。
何が足りないのでしょうか?ご教授願います。

※81行目と83行目のfor文全然違うことに気がつきました。
► スポイラーを表示
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:34 [ 編集 1 回目 ]

non
記事: 1097
登録日時: 13年前

Re: エアホッケーみたいなゲームの当たり判定について

#10

投稿記事 by non » 11年前

ボールのスピードに対してマウスで動くラケットのスピードが早すぎるからでしょうね。
ボールとラケットが重なったときにどうしたいですか?そこの仕様を決める必要があります。
プログラムでは ball_xやball_yが左上の座標なのかセンターの座標なのかわかりにくいので、別の変数に
すべきです。見ててわかりにくいです。
non

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#11

投稿記事 by AKIЯA » 11年前

さっきのfor文の失敗の修正して作って見たのがこれです。
とりあえず4面あるラケットの上面だけの動きを作って見ましたがすり抜けてますね。
► スポイラーを表示
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:35 [ 編集 3 回目 ]

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#12

投稿記事 by AKIЯA » 11年前

nonさんへ
 ご指摘通りball_x,ball_yは左上の座標で描画用に使ってますが
 ball_moveですぐにball_x,ball_yに加算して中心座標に変換して
 drawで中心座標から減算して描画座標に直しています。
 リリースするソースコードは直接貼れないのでコンパクトな実験用のソースコードを貼らせてもらっていますので
 ご指摘通り手抜きです。

 仕様は以下になります。
 ・ ボールとラケットが重なった時にボールを反射させたいです。
 ・ それとエアホッケーのようにボールをラケットで押したときにボールのスピードを早くしたいです。

 ラケットが動いてない状態では今のソースコードできちんとボールの反射は上手く動いてます。
 しかしすり抜けガードでguard_frame_chk関数内で1フレーム前のラケットの座標から現在のラケットの座標までを
 ループさせて当たり判定をやってるつもりなのですが、これでもラケットをまだすり抜けてしまっている状態で
 ここで詰まっております。 

 ラケットの左右にボールが当たるとラケットにめり込んでバグってますね^^;
 ラケットの上下は上手く動いてます。

何が足りないのか、ご教授願います。
最後に編集したユーザー AKIЯA on 2012年10月31日(水) 11:54 [ 編集 1 回目 ]

non
記事: 1097
登録日時: 13年前

Re: エアホッケーみたいなゲームの当たり判定について

#13

投稿記事 by non » 11年前

ラケットにぶつかったら、ラケットの外の範囲に強制的にball_x,ball_yを出すようにしないとだめですね。
また、現在はボールの移動量が定数ですが、ラケットとの接触スピードなどから速度(移動量)を変更する必要があります。
ボールとラケットをベクトル計算して反射する方向と大きさ(速度)を変更するイメージでしょうか。
接触する1個前の座標と、ラケットと重なったときの座標からボールとラケットのベクトルを計算します。ぶつかった後の移動時のベクトルの速度は
ラケットの移動速度より、同じか早くないと拙いですね。
non

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#14

投稿記事 by AKIЯA » 11年前

少し当たり判定がよくなりました。
ちょっとずつわかってきたかもしれません。
次はラケット押し出した時にまだすり抜けてるのでそこを実装してみます。
もうちょっと頑張って見ます。
► スポイラーを表示
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:36 [ 編集 2 回目 ]

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#15

投稿記事 by AKIЯA » 11年前

nonさんへ
 やってみてわかりました。
 129行目と130行目が必要だったみたいですね。
 ありがとうございます。

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#16

投稿記事 by AKIЯA » 11年前

予想ですけど、この最新ソースから1フレーム前の位置と現在の位置取得して
1フレーム内のラケット移動分をループさせて2線分交差を行えばすり抜けは回避できるのかなと
思っておりますがあってるのかな。
頑張って作って見ます。

non
記事: 1097
登録日時: 13年前

Re: エアホッケーみたいなゲームの当たり判定について

#17

投稿記事 by non » 11年前

ラケットが大きいと中心点の線分だけでは交差しないかも。
non

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#18

投稿記事 by AKIЯA » 11年前

No7とNo8で作った2線分交差はラケットの前の位置から現在の位置までの線分で
これは実際にやりたい処理とは異なり、そこをアレンジしてNo14を作って見ました

この線分なら判定できるはず、予想ですけど
この処理でやらないといけないのはボールの線分とラケットの当たり判定のある線分の交差を
判定すれば対応できるのではないだろうかという発想です。

まだ足りないよとかありましたらご指摘お願いいたします。

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#19

投稿記事 by AKIЯA » 11年前

ちょっとずつ当たり判定が強くなってきましたがマウスを高速に動かしたときに、まだ上手くいってないですね。
何が足りないんだろう・・・これ以上思いつかないので

ここからマウスを動かしてボールに当たった時に1度ラケットにボールをキャッチさせて
キャッチしている間の時間でボールのスピードを早くして、ラケットの移動スピードよりもボールの速度が速くなった時にラケットからボールを離してみて
すり抜けを回避できるかやってみようかと思います。

ご指摘がありましたらご教授願います。
► スポイラーを表示
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:36 [ 編集 1 回目 ]

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: エアホッケーみたいなゲームの当たり判定について

#20

投稿記事 by GRAM » 11年前

具体的な絵を描いてください。
あたり判定は、幾何学です。
絵を描かなくては始まりません。
どういった形状の物体にどういった衝突判定をしたく、
それぞれの物体はどのように運動し、衝突後どのような応答をするのですか?

コードも大事ですが、AKIЯAさんの期待する動作をまず示すことが重要だと思います。
出なければ、回答する側は完成していないコードを読んで期待する動作を想像しなければなりません。

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#21

投稿記事 by AKIЯA » 11年前

GRAMさんへ
  どんなものかというと完全にエアホッケーのルールです。
  今は四角ラケットで丸ボールとの当たり判定をしていますが、ラケットはマウスで操作していて
  ラケットの移動速度が速いときにボールを貫通しています。
  ちなみにこの他にひし形と円のラケットの当たり判定も残っています^^;

  そこで今対処したのは以下になります。
  ・1フレーム前のボールA座標から現在のフレームのボールB座標までの線分を作成して
   ラケットの面に対して線分を作成してボールの線分とラケットの線分の交差を判定して当たり判定を行っています。

  ・1フレーム前のボールA座標から現在のフレームのボールB座標までの線分を作成して
   1フレーム前のラケットの位置から現在のラケットの位置までのラケットの面の線分を作成して
   ボールの線分とラケットの線分の交差を判定して当たり判定を行っています。

  当たった後の判定はすでに完成していますが、動作はエアホッケーのクッションに当たった時と同じ動作になります。

  エアホッケーのラケットのようにボールを押して当たった場合はボールの速度を上げます。
  逆にラケットを引いて当たった場合はボールの速度を下げます。
  ボールの速度上げるのは出来ました。
  ボールの速度上げるのが出来たので下げるのも作れると思うのでまだ作っていません。

  やっていてわかったのは、めり込み判定がないことに気がつきました。
  今 めり込み判定作成中です。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: エアホッケーみたいなゲームの当たり判定について

#22

投稿記事 by ISLe » 11年前

最新コードでも反射処理がおかしい気がしますが、いちばんの問題は「巻き込み」でしょうかね。

マウス操作は瞬間的な移動量が大きいので、ラケットがボールを追い越してしまい、同じ場所で何度も当たってしまうわけです。

移動量をベクトルとして内積を求めるなどして、正面方向から当たったときだけ反射させるというのが基本ですが、自由にマウス操作できるラケットだと追い越したラケットが戻るときに当たってしまうので巻き込みを完璧に防ぐのはかなり難しいです。

ラケットを移動できる範囲を自陣ゴール近くに限定して、自陣に向かって移動しているボールにだけ反射処理をする、という仕様にすると簡単ですが、オウンゴールしなくなるので面白要素は減りますね。

(追記)
書いてるあいだに質問者さんの投稿がありましたが、ラケットを引きながら当てると減速ってどういうことですか?
上から下に向かって擦ると、自陣ゴールに向かうのではなくて、減速して相手ゴールに向かう?

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#23

投稿記事 by AKIЯA » 11年前

ISLeさんへ
  ボールの移動方向とラケットの移動方向が違う場合は、わかりやすく言うと正面衝突になりその時にスピードを上げます。
  その逆にボールの移動方向とラケットの移動方向が同一の場合は、スピードを下げます。

  とりあえず、自分で作ったサンプルコードなのでボールとラケットのすり抜けが防げればOKです。

一応 スピードアップを実装したコードです。
スピードアップさせてめちゃめちゃ早くボールが動いたのですが壁を越えて突き抜けて行ったんですけど
この時に壁の当たり判定のめり込みガードがなくって突き抜けていったのを見て
ラケットでも同じことをすれば良いのかなと思いました。

ご指摘があればお願いいたします。
► スポイラーを表示
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:36 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: エアホッケーみたいなゲームの当たり判定について

#24

投稿記事 by ISLe » 11年前

AKIЯA さんが書きました:  その逆にボールの移動方向とラケットの移動方向が同一の場合は、スピードを下げます。
なかなか豪快な仕様ですね。

わたしの提案は、ある程度自然法則に沿った動きを前提にしているので、質問者さんの仕様に当てはめるのは難しいかもしれません。

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: エアホッケーみたいなゲームの当たり判定について

#25

投稿記事 by GRAM » 11年前

AKIЯA さんが書きました:GRAMさんへ
  どんなものかというと完全にエアホッケーのルールです。
  今は四角ラケットで丸ボールとの当たり判定をしていますが、ラケットはマウスで操作していて
  ラケットの移動速度が速いときにボールを貫通しています。
  ちなみにこの他にひし形と円のラケットの当たり判定も残っています^^;
言葉通りに受け取ってみます。
たとえば、円とおっしゃってますが点じゃなくて大きさのある円なのですね。
速度の加算や減算はどうするのでしょうか?
ラケットの速度を加算するのですか?
ラケットは回転するのですか?
円がラケットの頂点に当たったらどういう挙動をするのが理想なのでしょうか?
1フレームの間にラケットとボールは直線に移動すると仮定するのですか?

コードを読めばわかる、というのはそうなのですが、そういうところをはっきりさせてはどうです?
と聞いてみました。

例えば、点ではなく大きさのある円であることが理想であり、
長方形のラケットは回転しないが、(実は回転したところで処理はさほど変わらないが・・・)
すり抜けを理論的に絶対に起こさず、かつ力学的におよそ正しい挙動をする。
つまりラケットの速度が衝突後に加算されるようにしたい。
とおっしゃるのでしたら、そう考えることもできます。

そうでないならもっと簡略化することもできます。

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#26

投稿記事 by AKIЯA » 11年前

GRAM さんが書きました: 言葉通りに受け取ってみます。
たとえば、円とおっしゃってますが点じゃなくて大きさのある円なのですね。
速度の加算や減算はどうするのでしょうか?
ラケットの速度を加算するのですか?
ラケットは回転するのですか?
円がラケットの頂点に当たったらどういう挙動をするのが理想なのでしょうか?
1フレームの間にラケットとボールは直線に移動すると仮定するのですか?
GRAMさんへ
  質問の回答をします。

  速度の加算は簡単に1フレームで動いた分をそのまま速度にして100以上の場合はデフォルトで100を設定しております。
  速度の減算は無条件でデフォルトのボールの速度しようと思います。0にはならないようにしようかと思います。

  ラケットは回転しません。

  円(ボール)が四角ラケットに当たったら反射させます。つまりボールがX=2,Y=2の移動量だとすると右下へ進み
  四角いラケットの上面に当たるとX=2,Y=-2の移動量になり、右上へ進みます。

  1フレームの間にラケットとボールは直線移動と仮定します。

サンプルコードで500行くらいになりましたが、本物の方は2000行くらいになっています。

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: エアホッケーみたいなゲームの当たり判定について

#27

投稿記事 by GRAM » 11年前

AKIЯA さんが書きました:   速度の加算は簡単に1フレームで動いた分をそのまま速度にして100以上の場合はデフォルトで100を設定しております。
  速度の減算は無条件でデフォルトのボールの速度しようと思います。0にはならないようにしようかと思います。
・・・
たとえば上の一点に関して言っても、
もしラケットの速度が100を超えている場合に、明らかな矛盾がありますよね。
だってラケットの速度が100を超えていればどう頑張っても食い込みを回避できないわけですから(ボールの速度が100を超える)
ラケットにあたっている場合だけラケットに追従させることもできるでしょうが・・・

減算の条件で0にならないというのもイメージができませんが、やはりもっと具体的な条件を示していただきたいかなと思います。

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#28

投稿記事 by AKIЯA » 11年前

GRAM さんが書きました: たとえば上の一点に関して言っても、
もしラケットの速度が100を超えている場合に、明らかな矛盾がありますよね。
だってラケットの速度が100を超えていればどう頑張っても食い込みを回避できないわけですから(ボールの速度が100を超える)
ラケットにあたっている場合だけラケットに追従させることもできるでしょうが・・・

減算の条件で0にならないというのもイメージができませんが、やはりもっと具体的な条件を示していただきたいかなと思います。
GRAMさんへ
 回答します。

ボールの速度が100を超えた場合はボールの速度を100に設定して、例えば今はサンプルなのでウィンドウサイズの
画面左上(0,0)
画面右上(1280、0)
画面左下(0,720)
画面右下(1280,720)
を設定してボールの中心座標がこの4点内から外れた場合、つまりはボールの速度が100であっても
めり込みを確認してから無条件で壁の座標まで強制的に戻し、さらにボールの向きを変えてボールを移動させているのでなんら問題はありません。
この処理は335行目でやっております。
この処理と似たようなものをラケット側にも実装が必要だと思うのですが、まだ実装できていません。

減算で移動量が0にならないというイメージは無重力であるということです。
ゲームの仕様的にボールが止まってしまっては面白みがないという考えです。

まずソースコードを読まれていないのでまるで、こちらがソースコードを説明しているようになってしまっていて
ほとんどフルコメント打ってあるので、そこから読み取って欲しいかったのですが
わかりやすく、まとめさせてもらいます。
最後に編集したユーザー AKIЯA on 2012年11月01日(木) 08:24 [ 編集 1 回目 ]

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#29

投稿記事 by AKIЯA » 11年前

まとめると丸いのがボールで 四角いのがラケットとします。
動作はゲームセンターに昔あったエアホッケーだと思ってください。
抵抗や力学とかはまずは無視します。
四角いラケットの上面にボールが当たると仮定します。
わかりやすいようにボールの移動量はX=10,Y=10としてボールは右下へ向かって移動していると仮定します。

図1
   ●
 +------+
 |   |
 +------+

そこで四角いラケットを上へ移動した際に極端な例を上げると以下のようにめり込んでこうなると思います。

図2
 +------+
 | ● |
 +------+

そこで図1から図2へは1フレーム間で移動したと仮定します。
図1のボールの中心座標B1
図2のボールの中心座標B1’
図1のラケット左上の座標X1
図1のラケット右上の座標X2
図2のラケット左上の座標X1’
図2のラケット右上の座標X2’
と仮定します。

B1からB1’までのボールの線分Aとします。
そしてX1からX2までの線分Bとします。

X1からX1’までの移動した分を線分Bの始点と線分Bの終点をX軸Y軸ごとに上に1ずつ移動させて線分Aと線分Bが交差したかを判定しています。
そこで線分Aと線分Bが交差した時にボールの移動量をY=10からY=-10へ変換してボールの移動量を加算して右上方向へ移動させています。

線分Aと線分Bが交差した時にめり込んだボールの位置をずらしてやらないといけないのはわかったのですが
ここで詰まっています。

壁のめり込みは問題なくできたのですがラケットのめり込みが難しいです。
試行錯誤を繰り返してはいますが、やはりめり込みます^^;
このめり込みの問題解決方法がありましたら、ご教授願います。

non
記事: 1097
登録日時: 13年前

Re: エアホッケーみたいなゲームの当たり判定について

#30

投稿記事 by non » 11年前

AKIЯA さんが書きました:そこで線分Aと線分Bが交差した時にボールの移動量をY=10からY=-10へ変換してボールの移動量を加算して右上方向へ移動させています。

線分Aと線分Bが交差した時にめり込んだボールの位置をずらしてやらないといけないのはわかったのですが
前にも記述しましたが、強制的にラケットの外に出してやらないといけないですね。
そこで、
ボールがB1からB1'に移動したのだからBdx、Bdyの移動量だとします。
同様にラケットの移動量もx1とx1'からXdx,Xdyだとします。
交差したのがラケットの上面の場合は、y方向が反転しますからボールの移動量はBdx,-BdyになるまではAKIЯAさんの考え通りですが、
これにラケットの移動量を加算します。
すると、Xdx+Bdx 、 Xdy-Bdy がボールの移動量になります。すると、ラケットの中にはめり込まないはずです。
って、プログラムして確認してないから違ってたらごめんね。

この方法だと、スピードがどんどん上がりますね。空気抵抗を考えてスピードを落とさないと、移動量が多くなりすぎます。
この式のままでラケットを引いてスピードを落とすこともできますね。
non

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#31

投稿記事 by AKIЯA » 11年前

nonさんへ
 頼もしい回答ありがとうございます。
 さっそく試して見ます。

あとDXライブラリの関数でSegment_Segment_MinLength()を使って線分の距離で判定しているのですが
肝心のSegment_Segment_MinLengthの中身が見えてないので、自分で作って見ることにします。

non
記事: 1097
登録日時: 13年前

Re: エアホッケーみたいなゲームの当たり判定について

#32

投稿記事 by non » 11年前

現在どのように動くのか見てみたいので画像ファイルをもらえますか?
non

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#33

投稿記事 by AKIЯA » 11年前

EXEごとリリースしちゃいますので少々お待ちを

準備できました。
ソースも貼っておきます。
好きにいじっちゃってくださいw
作りかけのところもあるのでコメントアウトしてある処理もあります。

添付ファイルは念の為、個々でウイルスチェックを行ってください。

自分で言うのもあれですが、もうサンプルのボリュームじゃなくなってきてますね^^;
まだめり込んでラケットの中でボールが反射してしまうというお粗末な状態です^^;
処理的にはguard_frame_chkがちょっと複雑かもしれません。
コンパイルするとintとfloatの型変換で警告が出てますが整数値しか使ってないので大丈夫なはずですが
手抜きでDXライブラリにあったSegment_Segment_MinLength()を使って距離をもとめているので
この中身がどうなってるのかわかってないので、この部分を自作しようかと思います。

自分でテストしている感じではボールの速度が遅いときの方がすり抜けている確立が高い気がします。
► スポイラーを表示
添付ファイル
test.zip
このソースのEXEファイルです
(965.32 KiB) ダウンロード数: 139 回
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:31 [ 編集 1 回目 ]

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#34

投稿記事 by AKIЯA » 11年前

DXライブラリ用のSegment_Segment_MinLengthを使っていたのですが
使用をやめてcross_chkで線分交差を判定する関数をサンプル見て作りました。
これでintとfloatの型変換の警告は出なくなります。
► スポイラーを表示
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:31 [ 編集 1 回目 ]

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: エアホッケーみたいなゲームの当たり判定について

#35

投稿記事 by GRAM » 11年前

自分なりにコードを書いてみます。

①移動する円盤と長方形のあたり判定を実装する
②長方形はマウスに追従する
③円盤の速度には長方形の速度が加算される
④すり抜けを回避する

これらを実装するよう頑張ります。
基本的にはカプセルとAABBの衝突判定に、衝突点を計算するようなプログラムになると思います。
現段階では衝突点検知に一部問題があるようなので、完全ではありませんが、衝突そのものの検知はできているようです。
(今からしばらく大学に行くので、帰ってきてから続きを書きます。)
► スポイラーを表示
最後に編集したユーザー GRAM on 2012年11月01日(木) 14:57 [ 編集 1 回目 ]

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#36

投稿記事 by AKIЯA » 11年前

GRAM さんが書きました:あとで自分なりにコードを書いてみます。

①移動する円盤と長方形のあたり判定を実装する
②長方形はマウスに追従する
③円盤の速度には長方形の速度が加算される
④すり抜けを回避する

これらを実装するよう頑張ります。
基本的にはカプセルとAABBの衝突判定に、衝突点を計算するようなプログラムになると思います。
GRAMさんへ
 ごちゃごちゃになってきたので、こちらも変数をまとめて書き直して見ます。
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:44 [ 編集 1 回目 ]

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#37

投稿記事 by AKIЯA » 11年前

最新ソース貼っておきます。
► スポイラーを表示
最後に編集したユーザー AKIЯA on 2012年11月02日(金) 05:30 [ 編集 1 回目 ]

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: エアホッケーみたいなゲームの当たり判定について

#38

投稿記事 by GRAM » 11年前

掲示板を見ているとよく思うのですが、ソースコードはスポイラーで隠しておくべきだと思います。

というのも単純に見にくいのです。
スクロールバーを動かすのは最小限にしたくないですかね?

一応それっぽくできました。
壁付近での挙動が示されていないので如何ともしがたかったのですが、
一応ラケットとボールは移動量によらず判定できるはず(?)だと思います。
ただ保証はしません。

壁付近では何を優先するべきかよくわからなかったので処理は適当です。
よって壁付近ではすり抜けが生じることがあります。

それ以外の場所では(つまり壁からラケットまで移動するのに1フレーム以上かかる位置では)
例外を見つけたら教えてほしいです。
個人的にはどのタイミングまで時間をロールバックするかによるんじゃないかと思います。
もうすこし正確にできますが、明日にします。
► スポイラーを表示
ラケットとディスクの相対運動を考え、
ラケットを固定してディスクをカプセルとみなせるよう座標変換します。
それを今度は、
角の丸い長方形と線分の判定になるように変換し、
前段階で線分と長方形を、内部的には最終的に
線分とスラブ、および線分と円とで判定するようにしています。

AKIЯA
記事: 58
登録日時: 11年前

Re: エアホッケーみたいなゲームの当たり判定について

#39

投稿記事 by AKIЯA » 11年前

GRAMさんへ
  見させてもらいました。神降臨 素晴らしいの一言です。
  これを参考にさせて頂きたいと思います。

  ありがとうございました。

そして回答をして頂いた皆様もありがとうございました。

まだ残り丸いラケットとひし形のラケットが残っておりますが
また挫折したら質問させて頂きたいと思います。

これにて解決ということで閉じさせて頂きたいと思います。
本当にありがとうございました。
► スポイラーを表示

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: エアホッケーみたいなゲームの当たり判定について

#40

投稿記事 by GRAM » 11年前

朝起きてコードを見返してみたら、簡単なミスが何か所かあったので修正しました。
► スポイラーを表示

ついでにある程度物理法則にのっとるように、壁での反発係数と、ディスクに働く空気抵抗を導入しました。
あとやはり壁での挙動ですね。
反射を優先するのか、それともマウスへの追従を優先するのか。この辺はAKIЯAさん次第だと思います。
(普通に考えたら反射を優先しないと壁かラケットにめり込みますが、その場合マウスポインタを隠してしまってマウスの速度でラケットを制御することになると思います)

閉鎖

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