[GameMaker: Studio] sprite_width/heightの落とし穴

gms_sprite_width_1

Twitterで半年ちょっと前につぶやいていたsprite_widthのことですが、今でもたまに忘れるのでメモしておきます。

sprite_widthsprite_heightは現在使用しているスプライトの横縦サイズが格納されている読み出し専用のプロパティ変数です。

この値を参照する際に注意しなければならないのが、リファレンスにも“be dependant on the image_x(y)scale.”と記載されている通り、image_x(y)scaleによる拡大縮小が行われた後のサイズになっているという点です。

これは特に意識することなく実際の描画サイズが得られて便利ですが、下の画像のようにエフェクトとして拡大縮小を行うけど判定的には原寸の値を使用したいということもあります。

gms_sakuraann_scale_1

その場合はsprite_get_width(sprite_index)sprite_get_height(sprite_index)を使用することで元のサイズが取得できます。
これをstepイベント等で毎回実行すると、実行環境によっては僅かながらオーバーヘッドが生じる可能性もありますから、createイベントでmy_sprite_width = sprite_get_width(sprite_index)のように予め取得しておくといいでしょう。

同様にスプライトの基準点が設定されているsprite_x(y)offsetもスケールの影響を受けています。
これも頻繁に参照する必要があるならmy_sprite_xoffset = sprite_get_xoffset(sprite_index)として取っておきましょう。

ちなみにdraw_text系のテキスト描画もスケール対象です。
一番上のサンプル画像ではdrawイベントでテキストを書く前に現在のスケール値をローカル変数に退避させて、スケール1.0にしてからdraw_textして、最後に退避させてあったスケール値に戻しています。
もちろん、1行だけならdraw_text_transformedで書いて問題ありません。