Spriteの一部分を切り抜いて表示する【ツクールMV】

画像の中の一部分だけを表示したい

ゲーム制作の最中につまずいたのでメモ。

これはツクールMVの標準機能のピクチャとかの話じゃなくて、スクリプトを使って画像(Sprite)を表示させている場合の話ですよ。

例えばゲーム画面にHPゲージを表示したい時、ゲーム内の変数の値を使ってゲージを増減させたいですよね。そうすると、変数の値に応じてHPゲージ画像の表示領域を変化させなきゃならないわけです。

HPが満タンの時はゲージ画像をそのままフルで表示して、HPが半分になったらゲージ画像の幅も半分だけ表示したいのです。

これ、ツクールXPの時(RGSS)は確かSpriteクラスに「rect」とかいうプロパティがあって、そこをいじれば良かったように記憶しているのですが……MVにはそれが見当たらない。

ネットを調べてもドンピシャな情報が見つからない……困ったぞ!

という訳でかなり遠回りして調べていたんですが、灯台もと暗し。普通にSpriteクラスの中に表示領域を変えるメソッドがありました。

setFrameメソッドを使えばOK

見つけました。setFrameメソッド! rectじゃない!

Rectangleとかめちゃめちゃ調べて意味分からなかったので半ば諦めモードでしたが普通に公式のリファレンスに載ってた!!くそ~……。

ちなみに軽く説明すると、setFrameメソッドを使うとSpriteに表示している画像の一部の領域(四角形)だけを指定して表示する事ができます。

使い方は、仮にsprite変数に画像が入っているとすれば

sprite.setFrame(x, y , width, height);

みたいな感じ。

x,yは画像を表示したい領域の左上の座標で、width, heightは表示したい領域の幅と高さです。

例えばHPゲージなら

一般的な横長のHPゲージなら、

  • ゲーム変数1番に最大HPの値
  • ゲーム変数2番に現在HPの値

を設定していると仮定すれば、

sprite.setFrame(0, 0, ゲージ画像の幅 * $gameVariables.value(2) / $gameVariables.value(1), ゲージ画像の高さ);

という風なコードを毎フレーム実行しておけばいいんじゃないでしょうか。

こうすれば現在HPの割合に応じて、HPゲージの画像も更新されますね。