查看: 4|回复: 0

[转载发布] 遮罩废稿

[复制链接]
  • TA的每日心情
    开心
    5 天前
  • 签到天数: 33 天

    连续签到: 1 天

    [LV.5]常住居民I

    2022

    主题

    32

    回帖

    7144

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5074
    OK点
    16
    积分
    7144
    发表于 同元一千年七月八日(秋) | 显示全部楼层 |阅读模式
    一个位图(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

    [发帖际遇]: じ☆ve冰风 乐于助人,奖励 6 OK点. 幸运榜 / 衰神榜
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2024-5-3 15:54 , Processed in 0.047962 second(s), 46 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表