2014/12/02(火) [n年前の日記]
#1 [dxruby] DXRubyのSpriteのアタリ範囲について
アタリ範囲というか、衝突判定の範囲だけど。大体分かってきた。ていうか、以前もこのへんでハマったけどすっかり忘れていただけのような気もしてきたり。
例えば、Sprite を継承したクラスを作って表示すると、以下のような表示に。 画像の左上と、Sprite の x, y が一致してる。
ここで、offset_sync = true を設定。
この状態で、アタリ範囲を設定したいわけで。
見た目からして、「collison = [-32,-32,32,32] を設定すればいいのかな?」と思い込んで設定すると…。実際には下のような位置にアタリ範囲が来てしまう。
正解は、collison = [32, 32, 96, 96] を設定すること。要するに、x,y を基準にしてアタリ範囲を設定するのではなくて、画像の左上を (0,0) と考えてアタリ範囲を設定すればいい。
考えてみれば、center_x, center_y だって、画像の左上を (0,0) と捉えた上で「画像の、この位置を、回転の中心位置としなさいよ」と指定してるわけで。
アタリ範囲も同じ。画像の左上を (0,0) と捉えた上で「画像の、このへんを、アタリ範囲にしなさいな」と考えて指定すれば、それでOKだったわけですよ。
てなわけで、テストに使ったスクリプトを一応置いときます。Public Domain ってことで。
_test_sprite_hitrange.rb.txt
例えば、Sprite を継承したクラスを作って表示すると、以下のような表示に。 画像の左上と、Sprite の x, y が一致してる。
ここで、offset_sync = true を設定。
- offset_sync が true なら、center_x, center_y で指定された位置が Sprite の x, y として扱われる。
- 初期値では、center_x, center_y には画像サイズの1/2が入ってるので、offset_sync = true をしただけなら、画像の中心が x,y になったかのような表示になる。
- ちなみに、offset_sync の値に関係なく、center_x, center_y は、画像の回転・拡大縮小時の、中心位置として参照される。
この状態で、アタリ範囲を設定したいわけで。
見た目からして、「collison = [-32,-32,32,32] を設定すればいいのかな?」と思い込んで設定すると…。実際には下のような位置にアタリ範囲が来てしまう。
正解は、collison = [32, 32, 96, 96] を設定すること。要するに、x,y を基準にしてアタリ範囲を設定するのではなくて、画像の左上を (0,0) と考えてアタリ範囲を設定すればいい。
考えてみれば、center_x, center_y だって、画像の左上を (0,0) と捉えた上で「画像の、この位置を、回転の中心位置としなさいよ」と指定してるわけで。
アタリ範囲も同じ。画像の左上を (0,0) と捉えた上で「画像の、このへんを、アタリ範囲にしなさいな」と考えて指定すれば、それでOKだったわけですよ。
てなわけで、テストに使ったスクリプトを一応置いときます。Public Domain ってことで。
_test_sprite_hitrange.rb.txt
◎ サンプルの中にアタリ範囲を表示するモジュールがあった。 :
DXRuby 1.4.1 のサンプルスクリプト群の中に、hitrange.rb という、Sprite のアタリ範囲を表示してくれるモジュールがあることに気付いたり。最初からコレを使ってアタリ範囲を表示していたら、このあたり、すぐに分かったのかもしれない。トホホ。
[ ツッコむ ]
以上です。