「EnDlEss DREamER」ブログ

最近はunity5メインで活動中。以前はツクールRGSSネタなど。

§ RGSS講座07「複数画像ファイルの合成方法」

今回の講座は講座と言うよりもRGSSテクニックというような感じでしょうか。
RGSSの仕様上、こういった機能があれば便利だし出来るのに・・・
というような事を無理矢理やってしまおうというド忘れ防止メモも含みのネタ。


・前置き

今回は複数画像ファイルの合成方法ということで画像を扱うネタ。
通常画像をゲーム画面に表示するには「Spriteクラス作成」 → 「sprite.bitmap = bitmap.new」
などをやって「スプライトを作成してから」「スプライトに使用する画像をロード」という手順です。
RGSSの仕様上「bitmapクラスには1つの画像しか指定できない」というものがあります。

いや、もしかしたら数多の素材屋さんで公開してらっしゃる「bitmapクラス拡張」の素材で簡単にどうにかなるかも知れません。
俺の場合は「ググるのに疲れた」という理由で断念しました。
ともあれ、今回はこの「画像ファイルを1つしか使えないbitmapクラス」をいじることなく画面に重ねて表示します。


・方法

bitmapクラスはどうやっても1つの画像しか表示されないため、残された手段は・・・「Sprite」となります。
ウィンドウやアニメーションも複数のスプライトから構成されています。

今回は「Sprite_Battler」を重ねて表示しようと思います。
このクラスは通常「敵キャラ」のみを表示します。
うちの「バトルレイアウト変更」ではサイドビューもやるのでアクターも歩行グラを使って表示します。

通常、このクラスは「self.bitmap」でクラス自体に画像データをロードさせて表示しています。
対してこのクラスのスーパークラス「Sprite_Base」はアニメーションの表示を行なっています。
ベースクラスでは「self.bitmap」というものは存在しません。

ではどうやってるか??

答えはセルデータ15個分のスプライトを作成してインスタンス変数の配列に追加。
アップデートする時に作成した15個分のループを行ないその中にインスタンス変数の配列からからローカル変数に格納。
そこでデータベースの設定に応じてローカルスプライトに画像を設定→更新。という手順。

つまり「クラス内に別途スプライトを作成して表示している」ということです。



これを応用してSprite_Battlerクラスを考えてみる。
歩行グラを2つ重ねて表示してみる。
「initialize」メソッドに「重ねる個数分のスプライトを作成」する。

@battler_sprites = [] # スプライト格納用配列
for i in 0..1
# この場合は2つの画像を重ねたいのでこういった指定
@battler_sprites[i] = Sprite.new(self.viewport)
end



インスタンスにスプライトを格納したら、その後大事なことは「self.bitmap」には「空のbitmap」を入れておくこと。

self.bitmap = Bitmap.new(32, 32)

アクターの歩行グラを使用するとしてサイズは「32*32」なので画像を指定せずにビットマップを入れないと
アニメーション表示などで座標がズレるので忘れずに設定。
次に、2つのスプライト「@battler_sprites[0]」と「@battler_sprites[1]」にビットマップを設定してやる。

@battler_sprites[0].bitmap = Cache.character(@battler_name)

これは歩行グラを読み込んで作成したスプライトのビットマップに使用する画像を設定する。
その後、2つのスプライトの原点座標「oxとoy」に本体の原点座標「self.oxとself.oy」設定。
この場合は歩行グラを2つ重ねるので一通りの座標は全部同じにする。
なので他の「x,y,width,height」に始まって「mirror,visible」なども同じく設定。
動く場合はアップデートメソッドに入れておく。

src_rectなどの設定は今回は割愛。
平たく言えば「sprite.bitmap」は画像全部。「sprite.src_rect」は画像の中の表示する範囲指定。

今回は「歩行グラ」を自動でサイズ取得して配列で返すメソッドを記載。
使う場合は「Game_Actor」か「Game_Battler」クラスに「battler_name」の「アクセサ」を用意するのを忘れずに。

  #--------------------------------------------------------------------------
  # ● バトラーグラフィックのサイズ取得
  #--------------------------------------------------------------------------
  def battler_bitmap(battler)
    sign = battler.battler_name[/^[\!\$]./]
    if battler.is_a?(Game_Actor)
      a_bitmap = Cache.character(battler.battler_name)
      if sign != nil and sign.include?('$')
        battler_width = a_bitmap.width / 3
        battler_height = a_bitmap.height / 4
      else
        battler_width = a_bitmap.width / 12
        battler_height = a_bitmap.height / 8
      end
    elsif battler.is_a?(Game_Enemy)
      e_bitmap = Cache.battler(battler.battler_name, battler.battler_hue)
      if sign != nil and sign.include?('$')
        # 歩行キャラ使用のバトラーの処理
        battler_width = e_bitmap.width / 3
        battler_height = e_bitmap.height / 4
      else
        battler_width = e_bitmap.width
        battler_height = e_bitmap.height
      end
    end
    # 値は配列で返す
    battler_size = [battler_width, battler_height]
    return battler_size
  end


この手順でスプライトは重ねて表示されるようになります。
つまり・・・


「Sprite_Battler」自体は「大枠」で「背景」
内部に作られた2つのスプライトは「表示要素」ということである。
それぞれ制作者側によって使う画像や用途が違うので座標設定や描画範囲についてはかなり変わると思うけど
内部に別のスプライトを作成して、それ自体のスプライトを背景として使うことで複数の画像を表示します。
これなら設定は面倒かも知れませんが仕組み自体は難しくないのでやってみてはいかがでしょうか?






2010/04/24/Sat 03:37:43  RGSS講座/CM:0/TB:0/
new 続・普天間 / MAIN / 普天間とか・・・ old

COMMENT

COMMENT POST

/
/
/
/



 
 内緒です♪

TRACK BACK

  この記事のURL:
   http://edlogtkool.blog36.fc2.com/tb.php/574-fcc2ebb4


MAIN
copyright © 2006 「EnDlEss DREamER」ブログ. All Rights Reserved.
Template by TAE-3rd☆テンプレート工房