| 
				
				
累计送礼:0 个
 累计收礼:0 个
 TA的每日心情|  | 开心 2025-10-18 22:41
 | 
|---|
 签到天数: 165 天 连续签到: 1 天 [LV.7]常住居民III 
 管理员   
 
    
        VIP6  
        卡币14601  
        OK点16  
    推广点0  
    同能卷0  
	积分17721 
 
  | 
 
| | 一个位图(temp_bitmap)以指定的 alpha 混合方式(0x40,即alpha值右移1位,也就是除以2),绘制到另一个位图(sprite.bitmap)上。具体来说,像素点会按照指定 alpha 值的比例混合原始位图(sprite.bitmap)和 temp_bitmap 的颜色值,生成最终的颜色值。这个过程可以让temp_bitmap中部分区域的图形叠加到sprite.bitmap之上,并带有一定透明度效果。 | 
 [Ruby] 纯文本查看 复制代码 #==============================================================================
# ■ 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 = [src.width, mask.width].min
      h = [src.height, mask.height].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 | 
 |