Advertisement
neutale

RMVXAce Font Effects (XP/ VX/ Ace)

Dec 15th, 2020
1,888
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 35.04 KB | None | 0 0
  1. #==============================================================================
  2. # ■ RMVXAce Font Effects in XP
  3. # Author: ルファー (Lufar)
  4. #------------------------------------------------------------------------------
  5. # Few font features from RPG Maker VX (Ace) can be used in RPG Maker XP/VX.
  6. #==============================================================================
  7.  
  8. =begin
  9.  
  10.  
  11. = How to install this in RPG Maker XP
  12.  
  13. Create a new section at the top and copy this script to it
  14.  
  15. = How to install this in RPG Maker VX (Ace)
  16.  
  17. Paste this script above Main.
  18.  
  19. = Customization
  20.  
  21.  
  22. [FONT_DEFAULTSHADOW]
  23.   Whether or not to draw shadows on the text.
  24.   This may not work in some situations.
  25.  
  26.  
  27. [FONT_DEFAULTOUTLINE]
  28.   Whether or not to draw a border around the letters.
  29.   This may not work in some situations.
  30.  
  31.  
  32. [FONT_DEFAULTOUTCOLOR]
  33.   The color of the text edge.
  34.  
  35.  
  36. = How to determine the version of RPG Maker
  37.  
  38.  
  39. [Lufar::VXAceCompat::IS_RPGXP]
  40. [Lufar::VXAceCompat::IS_RPGVX]
  41. [Lufar::VXAceCompat::IS_RPGVXACE]
  42.   True when the execution environment is each RPG Maker.
  43.  
  44. [Lufar::VXAceCompat.rgss_major_version]
  45.   Returns an integer between 1 and 3, depending on version of RPG Maker.
  46.  
  47.  
  48. = How to use the compatibility function
  49.  
  50. When defining classes and modules in other scripts
  51. include Lufar::VXAceCompat in the module (class).
  52. The following compatibility features will be enabled.
  53.  
  54.  
  55. - rgss_stop method
  56. - msgbox method
  57. - msgbox_p method
  58. - IS_RPGXP constant
  59.   (module name can be omitted)
  60. - IS_RPGVX constant
  61.   (module name can be omitted)
  62. - IS_RPGVXACE constant
  63.   (module name can be omitted)
  64. - IS_TEST constant
  65.   (Determine if it is a test play or not)
  66. - RGSSReset constant
  67.   (Refers to ::Reset or ::RGSSReset depending on RPG Maker version)
  68.  
  69.  
  70. = Ported method, properties
  71.  
  72. - Bitmap#gradient_fill_rect
  73. - Bitmap#clear_rect
  74. - Bitmap#draw_text
  75.   (str として文字列以外を渡すと to_s で自動変換する機能と、影付きと縁取りの移植)
  76. - Bitmap#text_size
  77.   (str として文字列以外を渡すと to_s で自動変換する機能の移植)
  78. - Color.new
  79.   (引数無のとき全部 0 で初期化する機能)
  80. - Color#set
  81.   (他の Color を引数に丸投げでコピーする機能)
  82. - Font#shadow
  83. - Font#shadow=
  84. - Font.default_shadow
  85. - Font.default_shadow=
  86. - Font#outline
  87. - Font#outline=
  88. - Font.default_outline
  89. - Font.default_outline=
  90. - Font#out_color
  91. - Font#out_color=
  92. - Font.default_out_color
  93. - Font.default_out_color=
  94. - Graphics.wait
  95. - Graphics.brightness
  96. - Graphics.brightness=
  97. - Graphics.fadein
  98. - Graphics.fadeout
  99. - Graphics.width
  100. - Graphics.height
  101. - Input.press?
  102.   (シンボルも引数に渡せる機能を移植)
  103. - Input.repeat?
  104.   (シンボルも引数に渡せる機能を移植)
  105. - Input.trigger?
  106.   (シンボルも引数に渡せる機能を移植)
  107. - Rect#initialize
  108.   (引数無のとき全部 0 で初期化する機能)
  109. - Rect#set
  110.   (他の Rect を引数に丸投げでコピーする機能)
  111. - Sprite#viewport
  112. - Sprite#width
  113. - Sprite#height
  114. - Tilemap#viewport
  115. - Tone#initialize
  116.   (引数無のとき全部 0 で初期化する機能)
  117. - Tone#set
  118.   (他の Tone を引数に丸投げでコピーする機能)
  119. - Window#initialize
  120.   (VX 固有のコンストラクターを XP と VXAce に移植)
  121. - Window#viewport
  122. - Window#move
  123. - RPG::Sprite#damage
  124.  
  125.  
  126. = クレジット
  127.  
  128. 作者      :: ルファー (Twitter @tkooler_lufar)
  129. バージョン:: 1.1
  130.  
  131. = Update log
  132.  
  133. [Ver. 1.1]
  134. I realized that I needed to support VXAce, so I rushed (see below).
  135. Window.new can pass a viewport even in VXAce.
  136. Removed Plane#viewport since it doesn't seem to need to be redefined.
  137. Changed a specification that the border for damage display is drawn twice
  138.  
  139. =end
  140.  
  141. # Multiple definitions prevention
  142. unless defined? Lufar::VXAceCompat and Lufar::VXAceCompat.version >= 1
  143.   module Lufar
  144.     module VXAceCompat
  145.       #----------------------------------------------------------------------
  146.       # ● カスタマイズconstant (スクリプト素材ユーザーが自由に変えてよい)
  147.       #----------------------------------------------------------------------
  148.       FONT_DEFAULTSHADOW = false                      # 文字の影を描くかどうか
  149.       FONT_DEFAULTOUTLINE = true                      # 文字の縁を描くかどうか
  150.       FONT_DEFAULTOUTCOLOR = Color.new(0, 0, 0, 128)  # 文字の縁の既定色
  151.       #----------------------------------------------------------------------
  152.       # ● constant
  153.       #----------------------------------------------------------------------
  154.       TRANSPARENT_COLOR = Color.new(0, 0, 0, 0).freeze    # 透明色
  155.       IS_RPGXP = !!defined? RPG::Cache                    # RPGXP かどうか
  156.       IS_RPGVX = RUBY_VERSION == '1.8.1' && !IS_RPGXP     # RPGVX かどうか
  157.       IS_RPGVXACE = RUBY_VERSION == '1.9.2'               # RPGVXAce かどうか
  158.       IS_TEST = IS_RPGXP ? $DEBUG : $TEST                 # テストプレイかどうか
  159.       #----------------------------------------------------------------------
  160.       # ● このスクリプト素材のバージョン (mix-in を防ぐため特異methodで定義)
  161.       #----------------------------------------------------------------------
  162.       def self.version
  163.         1
  164.       end
  165.       #----------------------------------------------------------------------
  166.       # ● このスクリプト素材のリビジョン (mix-in を防ぐため特異methodで定義)
  167.       #----------------------------------------------------------------------
  168.       def self.revision
  169.         1
  170.       end
  171.       #----------------------------------------------------------------------
  172.       # ● 引数の数がおかしいエラーの定型文
  173.       #----------------------------------------------------------------------
  174.       def self.assert_arguments_number(min, max, actual)
  175.         if actual < min
  176.           raise ArgumentError,
  177.             "wrong number of arguments(#{actual} for #{min})", caller(2)
  178.         elsif max < actual
  179.           raise ArgumentError,
  180.             "wrong number of arguments(#{actual} for #{max})", caller(2)
  181.         end
  182.       end
  183.       #----------------------------------------------------------------------
  184.       # ● 引数の型がおかしいエラーの定型文
  185.       #----------------------------------------------------------------------
  186.       def self.assert_type(expected, obj)
  187.         unless obj.is_a?(expected)
  188.           raise TypeError,
  189.             "cannot convert #{expected} into #{obj.class}", caller(2)
  190.         end
  191.       end
  192.       #----------------------------------------------------------------------
  193.       # ● RGSS のメジャーバージョンの取得
  194.       #----------------------------------------------------------------------
  195.       def self.rgss_major_version
  196.         return 1 if IS_RPGXP
  197.         return 2 if IS_RPGVX
  198.         RGSS_VERSION =~ /^\d+/
  199.         $&.to_i(10)
  200.       end
  201.       ################# ここから最後まで mix-in 用互換機能 #################
  202.       #----------------------------------------------------------------------
  203.       # ● リセット (F12) 時に発生する例外
  204.       #----------------------------------------------------------------------
  205.       if defined? ::RGSSReset
  206.         RGSSReset = ::RGSSReset
  207.       else
  208.         class ::Reset < Exception
  209.         end
  210.         RGSSReset = ::Reset
  211.       end
  212.       unless Lufar::VXAceCompat::IS_RPGVXACE
  213.         #--------------------------------------------------------------------
  214.         # ● 実行停止
  215.         #--------------------------------------------------------------------
  216.         unless defined? rgss_stop
  217.           def rgss_stop
  218.             loop { Graphics.update }
  219.           end
  220.           private :rgss_stop
  221.         end
  222.         #--------------------------------------------------------------------
  223.         # ● メッセージボックスに出力
  224.         #--------------------------------------------------------------------
  225.         alias msgbox print unless defined? msgbox
  226.         #--------------------------------------------------------------------
  227.         # ● 人間に読みやすい形でメッセージボックスに出力
  228.         #--------------------------------------------------------------------
  229.         alias msgbox_p p unless defined? msgbox_p
  230.       end
  231.     end
  232.   end
  233.   # ここから VXAce では無視
  234.   unless Lufar::VXAceCompat::IS_RPGVXACE
  235.     class Bitmap
  236.       #----------------------------------------------------------------------
  237.       # ● オブジェクト初期化
  238.       #----------------------------------------------------------------------
  239.       unless private_method_defined?(:_Lufar_VXAceCompat_initialize)
  240.         alias _Lufar_VXAceCompat_initialize initialize
  241.         def initialize(*args)
  242.           _Lufar_VXAceCompat_initialize(*args)
  243.         end
  244.       end
  245.       #----------------------------------------------------------------------
  246.       # ● グラデーション矩形の描画
  247.       #     (形式1)
  248.       #     x        : 描画先 X 座標
  249.       #     y        : 描画先 Y 座標
  250.       #     width    : 描画範囲の幅
  251.       #     height   : 描画範囲の高さ
  252.       #     color1   : 矩形左 (ないし上) 端の色
  253.       #     color2   : 矩形右 (ないし下) 端の色
  254.       #     vertical : 色の変化の向き (真⇒上から下へ、偽⇒左から右へ。既定は横)
  255.       #     (形式2)
  256.       #     rect     : 描画範囲
  257.       #     color1   : 矩形左 (ないし上) 端の色
  258.       #     color2   : 矩形右 (ないし下) 端の色
  259.       #     vertical : 色の変化の向き (真⇒上から下へ、偽⇒左から右へ。既定は横)
  260.       #----------------------------------------------------------------------
  261.       def gradient_fill_rect(*args)
  262.         if args[0].is_a?(Rect)
  263.           # 引数が rect, color1, color2, vertical の場合
  264.           Lufar::VXAceCompat.assert_arguments_number(3, 4, args.length)
  265.           rect, color1, color2 = args
  266.           vertical = args[3]
  267.           Lufar::VXAceCompat.assert_type(Rect, rect)
  268.           Lufar::VXAceCompat.assert_type(Color, color1)
  269.           Lufar::VXAceCompat.assert_type(Color, color2)
  270.           x, y, width, height = rect.x, rect.y, rect.width, rect.height
  271.           # 引数を破壊するとバグるのでコピーを使う
  272.           slice_rect = rect.dup
  273.         else
  274.           # 引数が x, y, width, height, color1, color2, vertical の場合
  275.           Lufar::VXAceCompat.assert_arguments_number(6, 7, args.length)
  276.           x, y, width, height, color1, color2 = args
  277.           vertical = args[6]
  278.           Lufar::VXAceCompat.assert_type(Numeric, x)
  279.           Lufar::VXAceCompat.assert_type(Numeric, y)
  280.           Lufar::VXAceCompat.assert_type(Numeric, width)
  281.           Lufar::VXAceCompat.assert_type(Numeric, height)
  282.           Lufar::VXAceCompat.assert_type(Color, color1)
  283.           Lufar::VXAceCompat.assert_type(Color, color2)
  284.           slice_rect = Rect.new(x, y, width, height)
  285.         end
  286.         # ループ回数、スライス矩形のサイズ、
  287.         # ループごとのスライス矩形移動処理を決定
  288.         if vertical
  289.           origin = y
  290.           count = height
  291.           slice_rect.height = 1
  292.           move_rect_method = slice_rect.method(:y=)
  293.         else
  294.           origin = x
  295.           count = width
  296.           slice_rect.width = 1
  297.           move_rect_method = slice_rect.method(:x=)
  298.         end
  299.         # 厚さ 1px ごとにスライスした矩形で少しずつ描画
  300.         slice_color = color1.dup
  301.         max_i = count - 1
  302.         # ゼロ除算対策…グラデの長さが1なら何も描かない
  303.         return if max_i == 0
  304.         count.times do |i|
  305.           move_rect_method.call(origin + i)
  306.           slice_color.set(
  307.             (color1.red   * (max_i - i) + color2.red   * i) / max_i,
  308.             (color1.green * (max_i - i) + color2.green * i) / max_i,
  309.             (color1.blue  * (max_i - i) + color2.blue  * i) / max_i,
  310.             (color1.alpha * (max_i - i) + color2.alpha * i) / max_i
  311.           )
  312.           self.fill_rect(slice_rect, slice_color)
  313.         end
  314.       end unless method_defined?(:gradient_fill_rect)
  315.       #----------------------------------------------------------------------
  316.       # ● 矩形のクリア
  317.       #----------------------------------------------------------------------
  318.       def clear_rect(*args)
  319.         self.fill_rect(*(args + [Lufar::VXAceCompat::TRANSPARENT_COLOR]))
  320.       end unless method_defined?(:clear_rect)
  321.       #----------------------------------------------------------------------
  322.       # ● テキストの描画
  323.       #     (形式1)
  324.       #     x        : 描画先 X 座標
  325.       #     y        : 描画先 Y 座標
  326.       #     width    : 描画範囲の幅
  327.       #     height   : 描画範囲の高さ
  328.       #     str      : 描画する文字列
  329.       #     align    : 文字列の揃え方 (0⇒左、1⇒中央、2⇒右。既定は左)
  330.       #     (形式2)
  331.       #     rect     : 描画範囲
  332.       #     str      : 描画する文字列
  333.       #     align    : 文字列の揃え方 (0⇒左、1⇒中央、2⇒右。既定は左)
  334.       #----------------------------------------------------------------------
  335.       unless method_defined?(:_Lufar_VXAceCompat_draw_text)
  336.         alias _Lufar_VXAceCompat_draw_text draw_text
  337.         def draw_text(*args)
  338.           if args[0].is_a?(Rect)
  339.             # 引数が rect, str, align の場合
  340.             Lufar::VXAceCompat.assert_arguments_number(2, 3, args.length)
  341.             rect = args[0]
  342.             str = args[1].to_s
  343.             align = args[2] || 0
  344.             Lufar::VXAceCompat.assert_type(Rect, rect)
  345.             Lufar::VXAceCompat.assert_type(Integer, align)
  346.             x, y, width, height = rect.x, rect.y, rect.width, rect.height
  347.           else
  348.             # 引数が x, y, width, height, str, align の場合
  349.             Lufar::VXAceCompat.assert_arguments_number(5, 6, args.length)
  350.             x, y, width, height = args
  351.             str = args[4].to_s
  352.             align = args[5] || 0
  353.             Lufar::VXAceCompat.assert_type(Numeric, x)
  354.             Lufar::VXAceCompat.assert_type(Numeric, y)
  355.             Lufar::VXAceCompat.assert_type(Numeric, width)
  356.             Lufar::VXAceCompat.assert_type(Numeric, height)
  357.             Lufar::VXAceCompat.assert_type(Integer, align)
  358.           end
  359.           # 縁取り
  360.           if self.font.outline
  361.             # 文字列を一時ビットマップに1回書き、それを4回 blt する
  362.             outline_bitmap = Bitmap.new(width, height)
  363.             begin
  364.               outline_bitmap.font = self.font.dup
  365.               outline_bitmap.font.color = Color.new(
  366.                 self.font.out_color.red,
  367.                 self.font.out_color.green,
  368.                 self.font.out_color.blue,
  369.                 self.font.out_color.alpha * self.font.color.alpha / 255.0
  370.               )
  371.               outline_bitmap.font.shadow = false
  372.               outline_bitmap._Lufar_VXAceCompat_draw_text(
  373.                 outline_bitmap.rect, str, align
  374.               )
  375.               self.blt(x-1, y-1, outline_bitmap, outline_bitmap.rect)
  376.               self.blt(x+1, y-1, outline_bitmap, outline_bitmap.rect)
  377.               self.blt(x-1, y+1, outline_bitmap, outline_bitmap.rect)
  378.               self.blt(x+1, y+1, outline_bitmap, outline_bitmap.rect)
  379.             ensure
  380.               outline_bitmap.dispose
  381.             end
  382.           end
  383.           # 影付き
  384.           if Lufar::VXAceCompat::IS_RPGXP and self.font.shadow
  385.             body_color = self.font.color.dup
  386.             begin
  387.               self.font.color.red   = 0
  388.               self.font.color.green = 0
  389.               self.font.color.blue  = 0
  390.               self._Lufar_VXAceCompat_draw_text(
  391.                 x + 1, y + 1, width, height, str, align)
  392.             ensure
  393.               self.font.color.set(body_color)
  394.             end
  395.           end
  396.           # 本文
  397.           self._Lufar_VXAceCompat_draw_text(x, y, width, height, str, align)
  398.         end
  399.       end
  400.       #----------------------------------------------------------------------
  401.       # ● テキストの描画幅
  402.       #----------------------------------------------------------------------
  403.       if Lufar::VXAceCompat::IS_RPGXP and
  404.          not method_defined?(:_Lufar_VXAceCompat_text_size)
  405.         alias _Lufar_VXAceCompat_text_size text_size
  406.         def text_size(str)
  407.           _Lufar_VXAceCompat_text_size(str.to_s)
  408.         rescue
  409.           $@ = caller
  410.           raise
  411.         end
  412.       end
  413.     end
  414.     class Font
  415.       #----------------------------------------------------------------------
  416.       # ● 公開インスタンス変数
  417.       #----------------------------------------------------------------------
  418.       # 影付き
  419.       if Lufar::VXAceCompat::IS_RPGXP
  420.         def shadow
  421.           @_Lufar_VXAceCompat_shadow
  422.         end
  423.         def shadow=(value)
  424.           @_Lufar_VXAceCompat_shadow = !!value
  425.         end
  426.       end
  427.       # 縁取り
  428.       def outline
  429.         @_Lufar_VXAceCompat_outline
  430.       end
  431.       def outline=(value)
  432.         @_Lufar_VXAceCompat_outline = !!value
  433.       end
  434.       # 縁の色
  435.       def out_color
  436.         @_Lufar_VXAceCompat_out_color
  437.       end
  438.       def out_color=(color)
  439.         # 現在の値と同一ならそもそも代入しない
  440.         return color if @_Lufar_VXAceCompat_out_color.equal?(color)
  441.         # 後で set されても引数が破壊されないよう dup して使う
  442.         @_Lufar_VXAceCompat_out_color = color.dup
  443.       end
  444.       #----------------------------------------------------------------------
  445.       # ● 公開クラス変数
  446.       #----------------------------------------------------------------------
  447.       # 既定で影を付けるかどうか
  448.       if Lufar::VXAceCompat::IS_RPGXP
  449.         def self.default_shadow
  450.           @@Lufar_VXAceCompat_default_shadow
  451.         end
  452.         def self.default_shadow=(value)
  453.           @@Lufar_VXAceCompat_default_shadow = !!value
  454.         end
  455.       end
  456.       if not Lufar::VXAceCompat::FONT_DEFAULTSHADOW.nil?
  457.         self.default_shadow = Lufar::VXAceCompat::FONT_DEFAULTSHADOW
  458.       elsif Lufar::VXAceCompat::IS_RPGXP
  459.         self.default_shadow = false
  460.       end
  461.       # 既定で縁を描くかどうか
  462.       def self.default_outline
  463.         @@Lufar_VXAceCompat_default_outline
  464.       end
  465.       def self.default_outline=(value)
  466.         @@Lufar_VXAceCompat_default_outline = !!value
  467.       end
  468.       self.default_outline = Lufar::VXAceCompat::FONT_DEFAULTOUTLINE
  469.       # 既定の縁の色
  470.       def self.default_out_color
  471.         @@Lufar_VXAceCompat_default_out_color
  472.       end
  473.       def self.default_out_color=(color)
  474.         Lufar::VXAceCompat.assert_type(Color, color)
  475.         # これは RPGVXAce だとなぜか dup してない
  476.         @@Lufar_VXAceCompat_default_out_color = color
  477.       end
  478.       self.default_out_color = Lufar::VXAceCompat::FONT_DEFAULTOUTCOLOR
  479.       #----------------------------------------------------------------------
  480.       # ● オブジェクト初期化
  481.       #----------------------------------------------------------------------
  482.       unless private_method_defined?(:_Lufar_VXAceCompat_initialize)
  483.         alias _Lufar_VXAceCompat_initialize initialize
  484.         def initialize(*args)
  485.           _Lufar_VXAceCompat_initialize(*args)
  486.           if Lufar::VXAceCompat::IS_RPGXP
  487.             self.shadow = self.class.default_shadow
  488.           end
  489.           self.outline = self.class.default_outline
  490.           # 縁の色は既定値を dup して使う
  491.           self.out_color = self.class.default_out_color
  492.         rescue
  493.           $@ = caller
  494.           raise
  495.         end
  496.       end
  497.     end
  498.     module Graphics
  499.       #----------------------------------------------------------------------
  500.       # ● ウェイト
  501.       #     duration : ウェイトするフレーム数
  502.       #----------------------------------------------------------------------
  503.       def self.wait(duration)
  504.         Lufar::VXAceCompat::assert_type(Integer, duration)
  505.         duration.times { self.update }
  506.       end unless defined? wait
  507.       unless defined? brightness
  508.         #--------------------------------------------------------------------
  509.         # ● 明るさを演出するためのスプライト
  510.         #--------------------------------------------------------------------
  511.         def self._Lufar_VXAceCompat_brightness_sprite
  512.           if !(defined? @@Lufar_VXAceCompat_brightness_sprite) or
  513.              @@Lufar_VXAceCompat_brightness_sprite.disposed?
  514.             @@Lufar_VXAceCompat_brightness_sprite = Sprite.new
  515.             @@Lufar_VXAceCompat_brightness_sprite.z = 0x7fffffff
  516.             @@Lufar_VXAceCompat_brightness_sprite.zoom_x = 640.0
  517.             @@Lufar_VXAceCompat_brightness_sprite.zoom_y = 480.0
  518.             @@Lufar_VXAceCompat_brightness_sprite.visible = false
  519.           end
  520.           if @@Lufar_VXAceCompat_brightness_sprite.bitmap.nil? or
  521.              @@Lufar_VXAceCompat_brightness_sprite.bitmap.disposed?
  522.             @@Lufar_VXAceCompat_brightness_sprite.bitmap = Bitmap.new(1, 1)
  523.             @@Lufar_VXAceCompat_brightness_sprite.bitmap.set_pixel(
  524.               0, 0, Color.new(0, 0, 0)
  525.             )
  526.           end
  527.           @@Lufar_VXAceCompat_brightness_sprite
  528.         end
  529.         #--------------------------------------------------------------------
  530.         # ● 明るさの取得
  531.         #--------------------------------------------------------------------
  532.         def self.brightness
  533.           if !(defined? @@Lufar_VXAceCompat_brightness_sprite) or
  534.              @@Lufar_VXAceCompat_brightness_sprite.disposed?
  535.             return 0xff
  536.           end
  537.           0xff - @@Lufar_VXAceCompat_brightness_sprite.opacity
  538.         end
  539.         #--------------------------------------------------------------------
  540.         # ● 明るさの設定
  541.         #     value : 明るさ
  542.         #--------------------------------------------------------------------
  543.         def self.brightness=(value)
  544.           Lufar::VXAceCompat.assert_type(Integer, value)
  545.           # 不必要に黒マスクを作らないようにする
  546.           return value if value == 0xff and self.brightness == 0xff
  547.           _Lufar_VXAceCompat_brightness_sprite.opacity = 0xff - value
  548.           _Lufar_VXAceCompat_brightness_sprite.visible = value != 0xff
  549.           0xff - _Lufar_VXAceCompat_brightness_sprite.opacity
  550.         end
  551.         #--------------------------------------------------------------------
  552.         # ● フェードアウト
  553.         #     duration : 所要フレーム数
  554.         #--------------------------------------------------------------------
  555.         def self.fadeout(duration)
  556.           Lufar::VXAceCompat.assert_type(Integer, duration)
  557.           initial_brightness = self.brightness
  558.           duration.times do |i|
  559.             self.brightness = initial_brightness * (duration - i) / duration
  560.             self.update
  561.           end
  562.         end
  563.         #--------------------------------------------------------------------
  564.         # ● フェードイン
  565.         #     duration : 所要フレーム数
  566.         #--------------------------------------------------------------------
  567.         def self.fadein(duration)
  568.           Lufar::VXAceCompat.assert_type(Integer, duration)
  569.           initial_brightness = self.brightness
  570.           gain_brightness = 0xff - initial_brightness
  571.           duration.times do |i|
  572.             self.brightness =
  573.               initial_brightness + gain_brightness * i / duration
  574.             self.update
  575.           end
  576.         end
  577.         #--------------------------------------------------------------------
  578.         # ● 画面の固定
  579.         #--------------------------------------------------------------------
  580.         unless defined? _Lufar_VXAceCompat_freeze
  581.           instance_eval { alias _Lufar_VXAceCompat_freeze freeze }
  582.           @@Lufar_VXAceCompat_need_transition = false
  583.           def self.freeze(*args)
  584.             @@Lufar_VXAceCompat_need_transition = true
  585.             _Lufar_VXAceCompat_freeze(*args)
  586.           end
  587.         end
  588.         #--------------------------------------------------------------------
  589.         # ● トランジション
  590.         #--------------------------------------------------------------------
  591.         unless defined? _Lufar_VXAceCompat_transition
  592.           instance_eval { alias _Lufar_VXAceCompat_transition transition }
  593.           def self.transition(*args)
  594.             return unless @@Lufar_VXAceCompat_need_transition
  595.             self.brightness = 0xff
  596.             _Lufar_VXAceCompat_transition(*args)
  597.           end
  598.         end
  599.       end
  600.       #----------------------------------------------------------------------
  601.       # ● 画面の幅の取得
  602.       #----------------------------------------------------------------------
  603.       def width
  604.         640
  605.       end unless defined? width
  606.       #----------------------------------------------------------------------
  607.       # ● 画面の高さの取得
  608.       #----------------------------------------------------------------------
  609.       def height
  610.         480
  611.       end unless defined? height
  612.     end
  613.     class Sprite
  614.       unless Sprite.method_defined?(:viewport)
  615.         #--------------------------------------------------------------------
  616.         # ● オブジェクト初期化
  617.         #--------------------------------------------------------------------
  618.         unless private_method_defined?(:_Lufar_VXAceCompat_initialize)
  619.           alias _Lufar_VXAceCompat_initialize initialize
  620.           def initialize(*args)
  621.             _Lufar_VXAceCompat_initialize(*args)
  622.             @@Lufar_VXAceCompat_viewport = args[0]
  623.           end
  624.         end
  625.         #--------------------------------------------------------------------
  626.         # ● 親ビューポートの取得
  627.         #--------------------------------------------------------------------
  628.         def viewport
  629.           @@Lufar_VXAceCompat_viewport
  630.         end
  631.       end
  632.       #----------------------------------------------------------------------
  633.       # ● 幅の取得
  634.       #----------------------------------------------------------------------
  635.       def width
  636.         src_rect.width
  637.       end unless method_defined?(:width)
  638.       #----------------------------------------------------------------------
  639.       # ● 高さの取得
  640.       #----------------------------------------------------------------------
  641.       def height
  642.         src_rect.height
  643.       end unless method_defined?(:height)
  644.     end
  645.     unless Tilemap.method_defined?(:viewport)
  646.       class Tilemap
  647.         #--------------------------------------------------------------------
  648.         # ● オブジェクト初期化
  649.         #--------------------------------------------------------------------
  650.         unless private_method_defined?(:_Lufar_VXAceCompat_initialize)
  651.           alias _Lufar_VXAceCompat_initialize initialize
  652.           def initialize(*args)
  653.             _Lufar_VXAceCompat_initialize(*args)
  654.             @@Lufar_VXAceCompat_viewport = args[0]
  655.           end
  656.         end
  657.         #--------------------------------------------------------------------
  658.         # ● 親ビューポートの取得
  659.         #--------------------------------------------------------------------
  660.         def viewport
  661.           @@Lufar_VXAceCompat_viewport
  662.         end
  663.       end
  664.     end
  665.     class Color
  666.       #----------------------------------------------------------------------
  667.       # ● オブジェクト初期化
  668.       #----------------------------------------------------------------------
  669.       unless private_method_defined?(:_Lufar_VXAceCompat_initialize)
  670.         alias _Lufar_VXAceCompat_initialize initialize
  671.         def initialize(*args)
  672.           return _Lufar_VXAceCompat_initialize(0, 0, 0, 0) if args.empty?
  673.           _Lufar_VXAceCompat_initialize(*args)
  674.         end
  675.       end
  676.       #----------------------------------------------------------------------
  677.       # ● 色の設定
  678.       #----------------------------------------------------------------------
  679.       unless method_defined?(:_Lufar_VXAceCompat_set)
  680.         alias _Lufar_VXAceCompat_set set
  681.         def set(*args)
  682.           if args[0].is_a?(Color)
  683.             return _Lufar_VXAceCompat_set(
  684.               args[0].red,
  685.               args[0].green,
  686.               args[0].blue,
  687.               args[0].alpha)
  688.           end
  689.           _Lufar_VXAceCompat_set(*args)
  690.         end
  691.       end
  692.     end
  693.     module Input
  694.       #----------------------------------------------------------------------
  695.       # ● ボタンが押されているかどうかの判定
  696.       #     num : ボタン番号、またはボタンを示すシンボル
  697.       #----------------------------------------------------------------------
  698.       unless defined? _Lufar_VXAceCompat_press?
  699.         instance_eval { alias _Lufar_VXAceCompat_press? press? }
  700.         def press?(num)
  701.           _Lufar_VXAceCompat_press?(
  702.             num.is_sym? ? const_get(num) : num)
  703.         end
  704.       end
  705.       #----------------------------------------------------------------------
  706.       # ● ボタンが押されてたかどうかの判定
  707.       #     num : ボタン番号、またはボタンを示すシンボル
  708.       #----------------------------------------------------------------------
  709.       unless defined? _Lufar_VXAceCompat_trigger?
  710.         instance_eval { alias _Lufar_VXAceCompat_trigger? trigger? }
  711.         def trigger(num)
  712.           _Lufar_VXAceCompat_trigger?(
  713.             num.is_sym? ? const_get(num) : num)
  714.         end
  715.       end
  716.       #----------------------------------------------------------------------
  717.       # ● ボタンが押し続けられているかどうかの判定
  718.       #     num : ボタン番号、またはボタンを示すシンボル
  719.       #----------------------------------------------------------------------
  720.       unless defined? _Lufar_VXAceCompat_repeat?
  721.         instance_eval { alias _Lufar_VXAceCompat_repeat? repeat? }
  722.         def repeat?(num)
  723.           _Lufar_VXAceCompat_repeat?(
  724.             num.is_sym? ? const_get(num) : num)
  725.         end
  726.       end
  727.     end
  728.     class Rect
  729.       #----------------------------------------------------------------------
  730.       # ● オブジェクト初期化
  731.       #----------------------------------------------------------------------
  732.       unless private_method_defined?(:_Lufar_VXAceCompat_initialize)
  733.         alias _Lufar_VXAceCompat_initialize initialize
  734.         def initialize(*args)
  735.           return _Lufar_VXAceCompat_initialize(0, 0, 0, 0) if args.empty?
  736.           _Lufar_VXAceCompat_initialize(*args)
  737.         end
  738.       end
  739.       #----------------------------------------------------------------------
  740.       # ● 矩形の設定
  741.       #----------------------------------------------------------------------
  742.       unless method_defined?(:_Lufar_VXAceCompat_set)
  743.         alias _Lufar_VXAceCompat_set set
  744.         def set(*args)
  745.           if args[0].is_a?(Rect)
  746.             return _Lufar_VXAceCompat_set(
  747.               args[0].x,
  748.               args[0].y,
  749.               args[0].width,
  750.               args[0].height)
  751.           end
  752.           _Lufar_VXAceCompat_set(*args)
  753.         end
  754.       end
  755.     end
  756.     class Tone
  757.       #----------------------------------------------------------------------
  758.       # ● オブジェクト初期化
  759.       #----------------------------------------------------------------------
  760.       unless private_method_defined?(:_Lufar_VXAceCompat_initialize)
  761.         alias _Lufar_VXAceCompat_initialize initialize
  762.         def initialize(*args)
  763.           return _Lufar_VXAceCompat_initialize(0, 0, 0, 0) if args.empty?
  764.           _Lufar_VXAceCompat_initialize(*args)
  765.         end
  766.       end
  767.       #----------------------------------------------------------------------
  768.       # ● 色の設定
  769.       #----------------------------------------------------------------------
  770.       unless method_defined?(:_Lufar_VXAceCompat_set)
  771.         alias _Lufar_VXAceCompat_set set
  772.         def set(*args)
  773.           if args[0].is_a?(Tone)
  774.             return _Lufar_VXAceCompat_set(
  775.               args[0].red,
  776.               args[0].green,
  777.               args[0].blue,
  778.               args[0].gray)
  779.           end
  780.           _Lufar_VXAceCompat_set(*args)
  781.         end
  782.       end
  783.     end
  784.     class ::RPG::Sprite
  785.       #----------------------------------------------------------------------
  786.       # ● ダメージ値のポップアップ開始
  787.       #     value    : ダメージ値 (負の数なら回復)
  788.       #     critical : クリティカルかどうか
  789.       #----------------------------------------------------------------------
  790.       unless method_defined?(:_Lufar_VXAceCompat_damage)
  791.         alias _Lufar_VXAceCompat_damage damage
  792.         def damage(value, critical)
  793.           # ダメージスプライトを作る過程でのテキスト描画時
  794.           # 影や縁の描画を無効化する
  795.           # (method内で描画しちゃってるため)
  796.           shadow  = Font.default_shadow
  797.           outline = Font.default_outline
  798.           Font.default_shadow  = false
  799.           Font.default_outline = false
  800.           begin
  801.             _Lufar_VXAceCompat_damage(value, critical)
  802.           ensure
  803.             Font.default_shadow  = shadow
  804.             Font.default_outline = outline
  805.           end
  806.         end
  807.       end
  808.     end if defined? ::RPG::Sprite
  809.   end
  810.   # ここまで VXAce では無視
  811.   class Window
  812.     if Lufar::VXAceCompat::IS_RPGVXACE or not method_defined?(:viewport)
  813.       #----------------------------------------------------------------------
  814.       # ● オブジェクト初期化
  815.       #----------------------------------------------------------------------
  816.       unless private_method_defined?(:_Lufar_VXAceCompat_initialize)
  817.         alias _Lufar_VXAceCompat_initialize initialize
  818.         # XP と VXAce で VX 形式の引数を有効化
  819.         if Lufar::VXAceCompat::IS_RPGXP
  820.             def initialize(*args)
  821.             _Lufar_VXAceCompat_initialize(*args)
  822.             @@Lufar_VXAceCompat_viewport = args[0]
  823.           end
  824.         else
  825.           def initialize(*args)
  826.             if args.size == 1
  827.               Lufar::VXAceCompat.assert_type(Viewport, args[0])
  828.               _Lufar_VXAceCompat_initialize()
  829.               self.viewport = args[0]
  830.               return
  831.             end
  832.             _Lufar_VXAceCompat_initialize(*args)
  833.           end
  834.         end
  835.       end
  836.       #----------------------------------------------------------------------
  837.       # ● 親ビューポートの取得
  838.       #----------------------------------------------------------------------
  839.       def viewport
  840.         @@Lufar_VXAceCompat_viewport
  841.       end unless method_defined?(:viewport)
  842.     end
  843.     #------------------------------------------------------------------------
  844.     # ● ウィンドウの移動とリサイズ
  845.     #     x      : X 座標
  846.     #     y      : Y 座標
  847.     #     width  : 幅
  848.     #     height : 高さ
  849.     #------------------------------------------------------------------------
  850.     def move(x, y, width, height)
  851.       self.x, self.y, self.width, self.height = x, y, width, height
  852.     end unless method_defined?(:move)
  853.   end
  854. end
  855.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement