All pastes #1885736 Raw Edit

Unnamed

public ruby v1 · immutable
#1885736 ·published 2010-06-18 12:37 UTC
rendered paste body
=beginRPGツクールXP の Bitmap に文字描画のアンチエイリアスをON/OFFする機能を加えます。また、2kのように描画にビットマップを使ったりグラデーションをかけたりもできます。ただし非常に重くなるので注意してください。例:すべてのビットマップのアンチエイリアスを無効にし、グラデーションを有効にします。(ただし、すでに生成済みのビットマップに関しては設定を変更しません。)Bitmap.default_aa = falseBitmap.default_text_type = 128 # 数は濃度を表すテキスト描画用画像 draw_bitmap を用いて、bitmap に文字を描画します。bitmap.aa = falsebitmap.text_type = draw_bitmapbitmap.draw_text(x, y, w, h, str)=endclass Bitmap  # アンチエイリアスのデフォルト値  @default_aa = true    # テキスト描画形式のデフォルト値  # nil                 : 単純な色による描画  # 数                  : 数を基本のアルファ値(濃度)としたグラデーション  # Bitmap オブジェクト : ビットマップ描画(描画色は無視)  @default_text_type = nil    # 一時描画用のバッファ  @@temp_buffer = new(640, 480)  # 多重エイリアス防止  unless Bitmap.respond_to?(:default_aa)    class << self      #--------------------------------------------------------------------------      # ● 公開インスタンス変数      #--------------------------------------------------------------------------      attr_accessor :default_aa        # アンチエイリアスのデフォルト値      attr_accessor :default_text_type # テキスト描画形式のデフォルト値(前述)    end        #--------------------------------------------------------------------------    # ● 公開インスタンス変数    #--------------------------------------------------------------------------    attr_accessor :aa         # アンチエイリアスの有無    attr_accessor :text_type  # テキスト描画形式        #--------------------------------------------------------------------------    # ● オブジェクト初期化    #     引数についてはヘルプ参照    #--------------------------------------------------------------------------    alias _initialize initialize # 元の処理の保存    def initialize(*args)      _initialize(*args)      # アンチエイリアスの有無をデフォルト値に設定      @aa = Bitmap.default_aa      # テキスト描画形式をデフォルト値に設定      @text_type = Bitmap.default_text_type    end        #--------------------------------------------------------------------------    # ● 文字列の描画    #     引数についてはヘルプ参照    #--------------------------------------------------------------------------    alias draw_text_noaa draw_text # 元の処理の保存    def draw_text(*args)      # 簡単のため引数の形をそろえる      if args[0].is_a?(Rect)        rect = args[0]        args[0,1] = [rect.x, rect.y, rect.width, rect.height]      end      # 引数チェックを RGSS 側にさせるため、再度メソッド呼び出しをする      # チェックの必要がなければここに draw_text_check_aa の処理を書いてもよい      draw_text_check_aa(*args)    end        #--------------------------------------------------------------------------    # ● アンチエイリアスの有無を考慮した文字列の描画    #     引数についてはヘルプの draw_text の項目を参照    #--------------------------------------------------------------------------    def draw_text_check_aa(x, y, w, h, str, align = 0)      # アンチエイリアスありの場合      if @aa        # 元の処理の呼び出し        draw_text_aa(x, y, w, h, str, align)      # アンチエイリアスなしの場合      else        # 一時描画用バッファ        temp = @@temp_buffer        # バッファのクリア        temp.clear         # バッファに文字列描画        temp.font = font        temp.draw_text_noaa(0, 0, w, h, str, align)        # すべてのピクセルについてチェック        w.times do |px|          h.times do |py|            # ピクセルの取得            color = temp.get_pixel(px, py)                        # ピクセルの描画が一定値(ここでは127)より濃かった場合            if color.alpha > 127                            # テキスト描画形式で分岐              case @text_type              # ビットマップによる描画              when Bitmap                # 描画用ビットマップから取得したピクセル色を使う                color = @text_type.get_pixel(px, py)              when Numeric                # ピクセルの位置で濃度を調節                color.alpha = (255.0 - @text_type) * py / h + @text_type              # 単純な色による描画              when nil                # 色を濃くする                color.alpha = 255              else                raise "テキスト描画形式が不正です"              end                          # ピクセルの描画が一定値より薄かった場合            else              # 色を無色にする              color.alpha = 0            end                        # ピクセルをおく            temp.set_pixel(px, py, color)          end        end                # 出来上がったバッファから転送        blt(x, y, temp, Rect.new(0, 0, w, h))       end    end  endend# 使用例:# グラデーションのかかったアンチエイリアス処理無しの文字になります。# 必要ない場合、この部分は変更または削除してください。Bitmap.default_aa = falseBitmap.default_text_type = 96