扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 59|回复: 0

[转载发布] 遮罩废稿

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2025-2-4 02:05
  • 签到天数: 110 天

    连续签到: 2 天

    [LV.6]常住居民II

    2327

    主题

    395

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    10465
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    13215

    灌水之王

    发表于 2024-4-18 19:14:25 | 显示全部楼层 |阅读模式
    一个位图(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 卡币. 幸运榜 / 衰神榜
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

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

    GMT+8, 2025-3-10 12:52 , Processed in 0.136681 second(s), 58 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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