Class MyGame::Image
In: mygame/lib/mygame.rb
Parent: DrawPrimitive

画像プリミティブ

画像描画をするためのプリミティブです。 キャラクタ画像の周りを透明色として扱う場合は TransparentImage を使用してください。

次のサンプルは画像オブジェクト生成して sample.bmp を画面に描画する例です。

 require 'mygame/boot'
 img = Image.new("sample.bmp")
 main_loop do
   img.render
 end

Methods

Attributes

angle  [RW]  画像の中点を中心とした回転角。 360 で 1 回転
animation  [R] 
image  [R] 
scale  [RW]  拡大率(縮小率)。基準値は 1.0

Public Class methods

ロードした画像データのキャッシュをクリアします。

[Source]

# File mygame/lib/mygame.rb, line 404
    def self.clear_cache
      @@image_cache = {}
    end

画像プリミティブを生成します。

[Source]

# File mygame/lib/mygame.rb, line 268
    def initialize(filename = nil, *options)
      super(*options)

      @filename = filename
      load(@filename) if @filename
      @ox = @oy = 0
      @animation = nil
      @animation_counter = 0
      @animation_labels = {}
    end

Public Instance methods

アニメーションパタンを追加します。

次の例では animation.bmp 内の 3 パタンの画像を 20 フレーム毎に切り替えて描画します。

 img = Image.new("animation.bmp", :w => 100, :h => 100)
 img.add_animation :abc => [20, [0, 1, 2]]     # アニメーションパタンの設定
 img.start_animation :abc                      # 最初のアニメーションを指定

[Source]

# File mygame/lib/mygame.rb, line 329
    def add_animation(hash)
      hash.each do |key, params|
        _set_animation(key, *params)
      end
    end

画像ファイルをロードします。 対応している画像フォーマットは BMP, PNM (PPM/PGM/PBM), XPM, XCF, PCX, GIF, JPEG, TIFF, TGA, PNG, LBM です。

[Source]

# File mygame/lib/mygame.rb, line 350
    def load(filename)
      unless @image = @@image_cache[filename]
        @image = SDL::Surface.load(filename).display_format
        @@image_cache[filename] = @image
      end
      @w ||= @image.w
      @h ||= @image.h
      @alpha_image = nil
      @image
    end

画像プリミティブを描画します。

[Source]

# File mygame/lib/mygame.rb, line 379
    def render
      if hide? or @image.nil?
        @disp_x = @disp_y = nil
        return
      end
      x = @x + offset_x
      y = @y + offset_y
      @disp_x, @disp_y = x, y
      @disp_x, @disp_y = x, y
      return if @alpha <= 0
      img = if alpha < 255
              @alpha_image ||= @image.display_format
              @alpha_image.set_alpha(SDL::SRCALPHA, alpha)
              @alpha_image
            else
              @image
            end
      if scale == 1 and angle == 0
        SDL.blit_surface img, @ox, @oy, @w, @h, screen, x, y
      else
        SDL.transform_blit(img, screen, @angle, @scale, @scale, @w/2, @h/2, x, y, 0)
      end
    end

透明色の指定をします。透明色が存在するピクセルの座標を引数で与えます。

[Source]

# File mygame/lib/mygame.rb, line 362
    def set_transparent_pixel(x = 0, y = 0)
      pix = @image.getPixel(x, y)
      key = [@filename, pix]
      if image = @@image_cache[key]
        @image = image
      else
        # make dup

        @image = @image.display_format
        @image.set_color_key SDL::SRCCOLORKEY, pix
        @image = @image.display_format
        @@image_cache[key] = @image
      end
      @alpha_image = nil
      @image
    end

アニメーションを開始します。

[Source]

# File mygame/lib/mygame.rb, line 336
    def start_animation(label, restart = false)
      @animation_labels[label] or raise "cannot find animation label `#{label}'"
      return if @animation == label and !restart
      @animation = label
      @animation_counter = 0
    end

アニメーションを停止します。

[Source]

# File mygame/lib/mygame.rb, line 344
    def stop_animation
      @animation = nil
    end

画像プリミティブの更新処理を行います。 アニメーションを更新するにはこのメソッドを毎フレーム呼んでください。

[Source]

# File mygame/lib/mygame.rb, line 307
    def update
      update_animation
    end

[Validate]