衝突判定

ゲームを作らずとも一回や二回は「衝突判定」が必要となることがある。これまでは総当り方式で判定していた。総当り方式とは自分以外のオブジェクトが自分に接しているか、全て調べる方法である。 この方法は一般的でわかりやすいが効率は今ひとつ。総当りだから当然である。
そこで今回はグリッド方式を採用した。グリッド方式の詳細は「flash_actionScript3.0アニメーション 詳解」に記載されているのでそちらを参照いただきたい。
概要だけ整理すると
1.画面を一定の大きさのグリッドに区切り
2.そのグリッド内で総当り方式(グリッド内のオブジェクトがそれ以外に接しているか否か)
3.隣接するグリッド(そのグリッドの隣や上下)に含まれているオブジェクトが該当オブジェクトと接しているか総当り
の手順で調査する方法だ。
総当り方式だと、明らかに接していないオブジェクト同士(右上のオブジェクトと左下のオブジェクトが接しているか?など)も調査する。そのことを考えると、グリッド方式は理にかなった方法といえる。
上記書籍に記載されているのはFlash(ActionScript)なのでJavaScriptに置き換えたのが以下サンプル。
http://nouv.biz/labo/20140816_grid/CollisionGridTest.html 

グリッドを用いた衝突判定画像接触したオブジェクトのみ色を赤に変更している。

圧縮

「001111111111555555555599944578888」
とある案件でこのようなコードの桁数を短くする要望が発生してしまった。
ここは「圧縮」である。
「圧縮」でイメージするのはjpegやlzhなど。敷居が高く感じる。だが調べてみると思ったほど難しく無かった。

中でもランレングス圧縮という方法はわかりやすくすぐ実装できそうだ。
早速エディタを起動しキーボードを叩き始める。

ランレングスはざっくりいうと「同じデータはまとめてしまえ」という手法である。
「11111」のように数値の「1」が5回続いた場合は115( 1を2回書くことで2回以上続いていることを表す)のように記述する。
もっとも2回しか連続してしない場合は3文字使ってしまうので、元のデータより桁数は増えてしまう。
今回のコードは比較的同じ数値が連続することが多いので効果が期待できそう。

実装を終えテストしてみるとなかなかいい具合ではないか。
もう少し短くするため36進数変換し、さらに何箇所かにハイフンを入れる。これで大分見やすくなった。

今回はactionScript案件ではあったが、javascriptに移植してみた。
以下URLにてテスト可能なので興味があったらお試しを。
 http://nouv.biz/labo/20140810_runlength/RunLengthTest.html