円と矩形の当たり判定

今作ってるゲームで円と矩形の当たり判定が必要になったのでそれについて自分なりにわかったことを書いておきます(‘ω’)ノ

 

今回参考にさせていただいた記事はこちらでござる

▷▷▷ http://ftvoid.com/blog/post/300

で、解説を読んでみるとそんなに難しいことではないですね。正直これならすぐにググらずに少し自分で試行錯誤すればよかったな、とちょっと後悔したくらい。だってちょっと悔しいやん(^^;)

で、解説通り上下左右を円の半径分大きくとるのと、四隅で円の当たり判定を取るような感じでプログラムを作ると以下のようになりました。

上から順番に重なってたら当たったということでtrueを返すようになってます。

 

なぁーんだ簡単じゃーん(*´ω`)

 

と楽勝だったな、なんて思ってたんですけど、よく見てください。

これあんまり良くないですよね?

無駄に処理してる

ちょっとして気づいたんですよ。

 

これ、当たらない時って全部判定してるの?

 

それって無駄じゃない?

基本的に画面内の小さなキャラ同士が当たる確率なんて当たらない確率と比べたら圧倒的に低いですよね?

なのに当たらない時に全部の判定するなんて無駄過ぎる。

無駄は嫌いなんだよ。無駄だから。無駄無駄無駄無駄。。

当たらないことを判定する

どこが無駄だったのかを考えてみると当たることを判定するようにしたから、当たらない場合に全部の当たる判定を確認しなくちゃいけないんだろうとなりました。

だったら当たらない判定をしたらいいんじゃね?(・∀・)

ということで作り直したのがこちら

全部の条件に合わなかったときに当たっていることになります。

簡単な解説

当たらない条件を考えるとまず下図の黄色の部分が一番範囲が広く、キャラ同士当たらない場合(グレーのがキャラね)ほとんどこの条件ではじくことができます。無駄がない。

後は赤い部分の判定です。各頂点に半径を足した(または引いた)分より外側だった場合で、円の当たり判定でも重なってなければ当たっていないといえるはずです。

まとめ

どっちも判定回数が多いですが通常のゲームではキャラ同士が当たっていない確立の方が高いと思うので当たらない条件で処理を書いた方が処理が軽くて良いんやないかな、と思います。

こんな感じで、何か調べて作ったりしてもなにかしら自分で気づいてより軽く速くなるような工夫って必要になったりします。今回の私のプログラムもまだまだ改善点があるかもしれません。

なにかしら「ん?」って感じたらちょっと探ってみたりするとプログラムが上達するのかもしれませんね(´∀`)

コメントを残す

メールアドレスが公開されることはありません。