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

[转载发布] RM 2D绘图的插件(加了传送位图功能啦,效率测试)

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2024-11-27 10:08
  • 签到天数: 108 天

    连续签到: 4 天

    [LV.6]常住居民II

    2212

    主题

    363

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    9435
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    12038

    灌水之王

    发表于 2024-4-20 02:06:58 | 显示全部楼层 |阅读模式
    不依赖SEP Core运行,所以独立发一下
    但是……谢谢大家的测试我只能说[泪目]……看来这个功能做出来终究还是有它的可取之处的,那就后续再更新一下吧~
    就是写着顺手就写出来了……

    RUBY 代码
    [code]#==============================================================================
    # ■ [Bitmap Canvas] 位图画布处理核心 v1.0 by SailCat
    #------------------------------------------------------------------------------
    #   方法:本脚本插入Main之前使用
    #   依赖:无
    #   版本:v1.0 (Build 220228)
    #   效果:
    #     1. 可以用简单指令在位图对象上画图
    #   配置:画笔线形的配置
    #   冲突:无
    #   说明:
    #     1. 绘制直线:
    #        draw_line(起始x, 起始y, 结束x, 结束y, 颜色, 线形)
    #     2. 绘制渐变色直线:
    #        gradient_draw_line(起始x, 起始y, 结束x, 结束y, 颜色1, 颜色2)
    #     3. 绘制路径(连续直线):
    #        draw_path(点1x, 点1y, 点2x, 点2y, 点3x, 点3y[, ...], 颜色)
    #     4. 绘制多边形(连续封闭直线):
    #        draw_polygon(点1x, 点1y, 点2x, 点2y, 点3x, 点3y[, ...], 颜色)
    #     5. 绘制正多边形:
    #        draw_isogon(外接圆心x, 外接圆心y, 半径, 边数, 旋转角, 颜色)
    #     6. 绘制椭圆:
    #        draw_ellipse(圆心x, 圆心y, 半横径,半纵径, 颜色)
    #     7. 绘制圆:
    #        draw_circle(圆心x, 圆心y, 半径,颜色)
    #     8. 填涂多边形:
    #        fill_polygon(点1x, 点1y, 点2x, 点2y, 点3x, 点3y[, ...], 边框颜色[,
    #          填充颜色1[, 填充颜色2]])
    #     9. 填涂正多边形:
    #        fill_isogon(外接圆心x, 外接圆心y, 半径, 边数, 旋转角, 边框颜色[,
    #          填充颜色1[, 填充颜色2]])
    #     10.填涂椭圆:
    #        fill_ellipse(圆心x, 圆心y, 半横径,半纵径, 边框颜色[, 填充颜色1[,
    #          填充颜色2]])
    #     11.填涂圆:
    #        fill_circle(圆心x, 圆心y, 半径,边框颜色[, 填充颜色1[, 填充颜色2]])
    #     12.传送多边形:
    #        blt_polygon(点1x, 点1y, 点2x, 点2y, 点3x, 点3y[, ...], 源位图,
    #          参考点1, 参考点1y[, 不透明度])
    #     13.传送正多边形:
    #        blt_isogon(外接圆心x, 外接圆心y, 半径, 边数, 旋转角, 源位图, 参考心x,
    #          参考心y[, 不透明度])
    #     14.传送椭圆:
    #        blt_ellipse(圆心x, 圆心y, 半横径,半纵径, 源位图, 参考心x, 参考心y[,
    #          不透明度])
    #     15.传送圆:
    #        blt_circle(圆心x, 圆心y, 半径,源位图, 参考心x, 参考心y[, 不透明度])
    #==============================================================================
    #==============================================================================
    # ■ SailCat's 插件公用
    #==============================================================================
    module SailCat
      #--------------------------------------------------------------------------
      # ● 脚本配置区
      #--------------------------------------------------------------------------
      module Canvas_Config
        CANVAS_LINE_DOTTED = [1, 0]               # 点线画笔
        CANVAS_LINE_DASHED = [1, 1, 0, 1]         # 短虚线画笔
        CANVAS_LINE_LONGDASH = [1, 1, 0, 0, 1, 1]# 长虚线画笔
        CANVAS_LINE_DASHDOT = [1, 0, 1, 1, 1, 0]  # 点划线画笔
        CANVAS_LINE_BROKEN = [1, 0, 0]            # 散点画笔
      end
    end

    #==============================================================================
    # ■ Bitmap
    #==============================================================================
    class Bitmap
      includeSailCat::Canvas_Config
      #--------------------------------------------------------------------------
      # ● 常量
      #--------------------------------------------------------------------------
      CANVAS_LINE_SOLID = [1]                     # 实心画笔,该常量禁止修改配置
      #--------------------------------------------------------------------------
      # ● 绘制直线
      #     x1 : 起始的 X 坐标
      #     y1 : 起始的 Y 坐标
      #     x2 : 结束的 X 坐标
      #     y2 : 结束的 Y 坐标
      #     color : 直线的颜色 (Color)
      #     style : 直线的线型
      #--------------------------------------------------------------------------
      def draw_line(x1, y1, x2, y2, color, style = CANVAS_LINE_SOLID)
        return set_pixel(x1, y1, color)if x1 == x2 and y1 == y2
        dx = (x2 - x1).abs
        dy = (y2 - y1).abs
        x = x1
        y = y1
        rx = x2 - x1  0
        ry = y2 - y1  0
        b_index = 0
        b_size = style.size
        if dx == 0and style == CANVAS_LINE_SOLID
          fill_rect(x1, [y1, y2].min, 1, dy + 1, color)
        elsif dy == 0and style == CANVAS_LINE_SOLID
          fill_rect([x1, x2].min, y1, dx + 1, 1, color)
        elsif dx  yk
              yj += 1
              xj += dx
            end
            edges[yj] ||= []
            edges[yj].push([xj, dx, yi])
          end
        end
        returnunless max_y - min_y > 1
        aet = edges[min_y]
        aet.each{|edge| edge[0] += edge[1]}
        aet.sort!
        if fill1 != fill2
          dh = max_y - min_y - 1
          dr = (fill2.red - fill1.red) / dh
          dg = (fill2.green - fill1.green) / dh
          db = (fill2.blue - fill1.blue) / dh
          da = (fill2.alpha - fill1.alpha) / dh
          gradient = true
        end
        f = fill1.clone
        for y in min_y + 1..max_y - 1
          if edges[y]
            aet.concat(edges[y])
            aet.sort!
          end
          0.step(aet.size - 1, 2)do |i|
            xi = aet[0].round
            xj = aet[i + 1][0].round
            xi += 1until xi == width - 1or get_pixel(xi, y) != color
            xj -= 1until xj == 0or get_pixel(xj, y) != color
            if xj >= xi
              fill_rect(xi, y, xj - xi + 1, 1, f)
            end
            aet.reject! {|edge| edge[2] == y}
            aet.each{|edge| edge[0] += edge[1]}
            aet.sort!
            f.set(f.red + dr, f.green + dg, f.blue + db, f.alpha + da)if gradient
          end
        end
      end
      #--------------------------------------------------------------------------
      # ● 传送位图多边形
      #     x1 : 第一点的 X 坐标
      #     y1 : 第一点的 Y 坐标
      #     x2 : 第二点的 X 坐标
      #     y2 : 第二点的 Y 坐标
      #     x3 : 第三点的 X 坐标
      #     y3 : 第三点的 Y 坐标
      #     args : 后续的参数(加多个点,最后是位图, 偏移x,偏移y,(可选)不透明度)
      #            偏移x和偏移y的位置参考第一个点
      #--------------------------------------------------------------------------
      def blt_polygon(x1, y1, x2, y2, x3, y3, *args)
        if args[-3].is_a?(Bitmap)
          src, x0, y0 = args[-3, 3]
          opacity = 255
          nodes = [x1, y1, x2, y2, x3, y3].concat(args[0...-3])
        elsif args[-4].is_a?(Bitmap)
          src, x0, y0, opacity = args[-4, 4]
          nodes = [x1, y1, x2, y2, x3, y3].concat(args[0...-4])
        else
          raiseArgumentError
        end
        raiseArgumentErrorunless nodes.size[0] == 0
        edges = {}
        min_y = height
        max_y = 0
        ox = x0 - x1
        oy = y0 - y1
        0.step(nodes.size - 2, 2)do |i|
          xi, yi = nodes[i, 2]
          min_y = [min_y, yi].min
          max_y = [max_y, yi].max
          xj, yj = nodes[(i + 2) % nodes.size, 2]
          dx = 1.0 * (xi - xj) / (yi - yj)
          if yi < yj
            yh = nodes[i - 1]
            if yh < yi
              yi += 1
              xi += dx
            end
            edges[yi] ||= []
            edges[yi].push([xi, dx, yj])
          elsif yi > yj
            yk = nodes[(i + 5) % nodes.size]
            if yj > yk
              yj += 1
              xj += dx
            end
            edges[yj] ||= []
            edges[yj].push([xj, dx, yi])
          end
        end
        aet = []
        for y in min_y..max_y
          if edges[y]
            aet.concat(edges[y])
            aet.sort!
          end
          0.step(aet.size - 1, 2)do |i|
            xi = aet[0].round
            xj = aet[i + 1][0].round
            blt(xi, y, src, Rect.new(xi + ox, y + oy, xj - xi + 1, 1), opacity)
            aet.reject! {|edge| edge[2] == y}
            aet.each{|edge| edge[0] += edge[1]}
            aet.sort!
          end
        end
      end
      #--------------------------------------------------------------------------
      # ● 绘制正多边形
      #     x : 正多边形外接圆心 X 坐标
      #     y : 正多边形外接圆心 Y 坐标
      #     rad : 正多边形外接圆 半径
      #     edges : 正多边形的边数
      #     angle : 正多边形旋转角度
      #     color : 正多边形的颜色 (Color)
      #--------------------------------------------------------------------------
      def draw_isogon(x, y, rad, edges, angle, color)
        raiseArgumentErrorif edges < 3
        step = Math::PI * 2 / edges
        args = []
        angle_i = Math::PI * (270 + angle) / 180
        edges.timesdo
          args.push((x + rad * Math.cos(angle_i)).round,
            (y + rad * Math.sin(angle_i)).round)
          angle_i += step
        end
        args.push(color)
        draw_polygon(*args)
      end
      #--------------------------------------------------------------------------
      # ● 绘制实心正多边形
      #     x : 正多边形外接圆心 X 坐标
      #     y : 正多边形外接圆心 Y 坐标
      #     rad : 正多边形外接圆 半径
      #     edges : 正多边形的边数
      #     angle : 正多边形旋转角度
      #     border_color : 正多边形的边框颜色 (Color)
      #     fill_color1 : 填充渐变的上颜色 (Color)
      #     fill_color2 : 填充渐变的下颜色 (Color)
      #--------------------------------------------------------------------------
      def fill_isogon(x, y, rad, edges, angle, border_color, fill_color1 =
        border_color, fill_color2 = fill_color1)
        raiseArgumentErrorif edges < 3
        step = Math::PI * 2 / edges
        args = []
        angle_i = Math::PI * (270 + angle) / 180
        edges.timesdo
          args.push((x + rad * Math.cos(angle_i)).round,
            (y + rad * Math.sin(angle_i)).round)
          angle_i += step
        end
        args.push(border_color, fill_color1, fill_color2)
        fill_polygon(*args)
      end
      #--------------------------------------------------------------------------
      # ● 传送位图正多边形
      #     x : 正多边形外接圆心 X 坐标
      #     y : 正多边形外接圆心 Y 坐标
      #     rad : 正多边形外接圆 半径
      #     edges : 正多边形的边数
      #     angle : 正多边形旋转角度
      #     src_bitmap : 传送元位图
      #     x0 : 传送圆心 X 坐标
      #     y0 : 传送圆心 Y 坐标
      #     opacity : 不透明度
      #--------------------------------------------------------------------------
      def blt_isogon(x, y, rad, edges, angle, src_bitmap, x0, y0, opacity = 255)
        raiseArgumentErrorif edges < 3
        step = Math::PI * 2 / edges
        args = []
        angle_i = Math::PI * (270 + angle) / 180
        edges.timesdo
          args.push((x + rad * Math.cos(angle_i)).round,
            (y + rad * Math.sin(angle_i)).round)
          angle_i += step
        end
        args.push(src_bitmap, x0 - x + args[0], y0 - y + args[1], opacity)
        blt_polygon(*args)
      end
      #--------------------------------------------------------------------------
      # ● 绘制圆
      #     x : 圆心 X 坐标
      #     y : 圆心 Y 坐标
      #     rad : 半径
      #     color : 圆的颜色 (Color)
      #--------------------------------------------------------------------------
      def draw_circle(x, y, rad, color)
        raiseArgumentErrorif rad < 0
        return set_pixel(x, y, color)if rad == 0
        draw_ellipse(x, y, rad, rad, color)
      end
      #--------------------------------------------------------------------------
      # ● 绘制椭圆
      #     x : 圆心 X 坐标
      #     y : 圆心 Y 坐标
      #     rad_x : 水平半径
      #     rad_y : 垂直半径
      #     color : 椭圆的颜色 (Color)
      #     fill1 : 填充的颜色1 (Color)
      #     fill2 : 填充的颜色2 (Color)
      #--------------------------------------------------------------------------
      def draw_ellipse(x, y, rad_x, rad_y, color, fill1 = nil, fill2 = nil)
        raiseArgumentErrorif rad_x < 0or rad_y < 0
        return set_pixel(x, y, color)if rad_x == 0and rad_y == 0
        return fill_rect(x - rad_x, y, rad_x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

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

    本版积分规则

    关闭

    幸运抽奖

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

    立即查看

    聊天机器人
    Loading...

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

    GMT+8, 2024-12-18 09:51 , Processed in 0.067851 second(s), 54 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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