じ☆ve冰风 发表于 2024-4-18 19:14:25

遮罩废稿


一个位图(temp_bitmap)以指定的 alpha 混合方式(0x40,即alpha值右移1位,也就是除以2),绘制到另一个位图(sprite.bitmap)上。具体来说,像素点会按照指定 alpha 值的比例混合原始位图(sprite.bitmap)和 temp_bitmap 的颜色值,生成最终的颜色值。这个过程可以让temp_bitmap中部分区域的图形叠加到sprite.bitmap之上,并带有一定透明度效果。



#==============================================================================
# ■ Alpha Mask Util for RPG Maker VX
#------------------------------------------------------------------------------
# 说明:
# 该脚本提供了一种在 RPG Maker VX 中使用 alpha mask 实现部分遮罩的方法。您可以简单地调用该脚本,根据需要设置输入和输出路径即可。
#
# 使用:
# 在脚本调用事件命令中,添加 call_script 指令,
#
#    Scene_Map: $scene = Scene_AlphaMask.new
#    Scene_Battle:$scene = Scene_AlphaMask.new
#
# 将您所需的原始图像和蒙版图像放到路径:"Graphics/Pictures/alphamask/" 中,并将名称记作:
#
#- Target Image: target.png
#- Mask Image: mask.png
#==============================================================================

module AlphaMaskUtil
class << self
    def run(work_dir, target_file, mask_file)
      Graphics.freeze

      src = load_picture(work_dir, target_file)
      mask = load_picture(work_dir, mask_file)

      w = .min
      h = .min

      temp_bitmap = Bitmap.new(w, h)

      for y in 0...h
      for x in 0...w
          color1 = src.get_pixel(x, y)
          color2 = mask.get_pixel(x, y)
          alpha = color2.alpha

          red = (color1.red * alpha / 255.0).to_i
          green = (color1.green * alpha / 255.0).to_i
          blue = (color1.blue * alpha / 255.0).to_i
          temp_bitmap.set_pixel(x, y, Color.new(red, green, blue))
      end
      end

      sprite = Sprite.new
      sprite.bitmap = src

      Graphics.transition
      sprite.bitmap.blt(0, 0, temp_bitmap, Rect.new(0, 0, w, h), 0x40) #设定 alpha 混合的方式为 叠加(alpha >> 1)
      sprite.visible = true

      loop do
      update_sprite(sprite)
      Graphics.update
      
      break if Input.trigger?(:C) #可以按键盘C键来退出,也可以换成其它键位或按钮
      end

      Graphics.freeze
      sprite.dispose
    end

    def load_picture(work_dir, filename)
      Bitmap.new("#{work_dir}#{filename}")
    end

    def update_sprite(sprite)
      sprite.update unless sprite.disposed?
    end
end
end

class Scene_AlphaMask < Scene_Base
def start
    super
    @work_dir = "Graphics/Pictures/alphamask/"
    @target_file = "target.png"
    @mask_file = "mask.png"
    AlphaMaskUtil.run(@work_dir, @target_file, @mask_file)
    exit_scene
end

def exit_scene
    fade_out(60)
    SceneManager.scene.dispose
end
end
页: [1]
查看完整版本: 遮罩废稿