设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4785|回复: 15
打印 上一主题 下一主题

几何图形绘制脚本 v0.8

 关闭 [复制链接]

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

跳转到指定楼层
1
发表于 2008-4-25 21:00:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
最近在研究精灵,刚好八云紫妹妹又在问怎麽画三角形
於是就写出来了,顺便写了其他几个形状。
原本要做出绘制正多边行的,但是公式方面还有问题
等解决了再发出。
使用了Deathless 的线条绘制脚本
    ====================================
                使用说明
    ====================================
三角形绘制:      XXX = Triangle.new(第一点, 第二点, 第三点,[线粗, 颜色])
  正三角形绘制:  XXX = Triangle_E.new(原点, 边长, [线粗, 颜色])
  等腰三角形绘制:XXX = Triangle_I.new(原点, 底长, [边长, 线粗, 颜色])
四边形绘制:      XXX = Quadri.new(第一点, 第二点, 第三点, 第四点, [线粗, 颜色])
  长方形绘制:    XXX = Rectangle.new(原点, 宽度, 长度,[线粗, 颜色])
  菱形绘制:      XXX = Rhombus.new(原点, 宽度, 长度,[线粗, 颜色])
  正方形绘制:    XXX = Square.new(原点, 长度,[线粗, 颜色])
上面在[]中的参数为选填的,默认 线粗为1, 颜色白
等腰三角形的边长默认为底长的2/3倍

任意多边行:  XXX = Polygon.new([第一点, 第二点, 第三点, ...], {线粗, 颜色})
上面在{}中的参数为选填的,默认 线粗为1, 颜色白

点的格式为: [X座标, Y座标]
绘制任意多边型时,必须提供两点以上的参数,否则直接无视

其他函数:
.name                    返回名称
.area                    返回面积(目前不支援四边形和多边型)
.print_name(x, y)     显示名称座标
.length(p1, p2)          计算p1到p2两点间距离

顺便附赠一个网格脚本
使用 XXX = Grid.new([横距, 纵距])
横距和纵距不提供的话默认为32

  1. class Polygon < Sprite_Base
  2.   attr_accessor :p1
  3.   attr_accessor :p2
  4.   attr_accessor :p3
  5.   attr_accessor :name
  6.   attr_accessor :po
  7.   #attr_accessor :print

  8.   def initialize(points, thick=1, color=normal_color)
  9.     super(Viewport.new(0, 0, 544, 416))
  10.     self.bitmap = Bitmap.new(544, 416)
  11.     @p1=[]
  12.     @p2=[]
  13.     @p3=[]
  14.     @thick = thick
  15.     @color = color
  16.     @points = points
  17.     @name = "Polygon"
  18.     draw
  19.   end
  20.   def set_viewport(x, y, width, height)
  21.     self.viewport = Viewport.new(x, y, width, height)
  22.   end
  23.   def update
  24.   end
  25.   def draw
  26.     self.bitmap.clear
  27.     for i in [email protected]
  28.       if @points.size > 2
  29.         if i < (@points.size) - 1
  30.           p1 = @points[i]
  31.           p2 = @points[i+1]
  32.         else
  33.           p1 = @points[i]
  34.           p2 = @points[0]
  35.         end
  36.         self.bitmap.drawline(p1[0], p1[1], p2[0], p2[1], @thick, @color)
  37.       end
  38.     end
  39.   end
  40.   def area
  41.     return 0
  42.   end
  43.   def print_name(x, y)
  44.     #self.bitmap.font.color.alpha = print ? 255 : 0
  45.     self.bitmap.draw_text(x, y, bitmap.text_size(@name).width, 24, name)
  46.   end
  47.   def length(p1, p2)
  48.     a = (p2[0]-p1[0]).abs
  49.     b = (p2[1]-p1[1]).abs
  50.     return Math.hypot(a, b)
  51.   end
  52. end
  53. class Triangle < Polygon
  54.   def initialize(p1, p2, p3, thick=1, color=normal_color)
  55.     @p1 = p1
  56.     @p2 = p2
  57.     @p3 = p3
  58.     super([p1, p2, p3],thick, color)
  59.     @name = "Triangle"
  60.   end
  61.   def area
  62.     a = length(@p1, @p2)
  63.     b = length(@p2, @p3)
  64.     c = length(@p3, @p1)
  65.     d = (a+b+c)/2
  66.     area = Math.sqrt( d*(d-a)*(d-b)*(d-c) )
  67.     return area
  68.   end
  69. end
  70. class Triangle_E < Triangle
  71.   def initialize(p1, side, thick=1, color=normal_color)
  72.     height = (side/2) * Math.sqrt(3)
  73.     @p1 = []   
  74.     @p1[0] = p1[0]+side/2
  75.     @p1[1] = p1[1]
  76.    
  77.     @p2=[]
  78.     @p2[0]=p1[0]
  79.     @p2[1]=p1[1]+height
  80.    
  81.     @p3=[]
  82.     @p3[0]=p1[0]+side
  83.     @p3[1]=p1[1]+height
  84.         
  85.     super(@p1, @p2, @p3, thick, color)
  86.   end
  87. end
  88. class Triangle_I < Triangle
  89.   def initialize(p1, base, side=base*2/3, thick=1, color=normal_color)
  90.     base_h = base/2
  91.     height = Math.sqrt( side**2 - base_h**2 )
  92.     @p1 = []   
  93.     @p1[0] = p1[0]+base/2
  94.     @p1[1] = p1[1]
  95.    
  96.     @p2=[]
  97.     @p2[0]=p1[0]
  98.     @p2[1]=p1[1]+height
  99.    
  100.     @p3=[]
  101.     @p3[0]=p1[0]+base
  102.     @p3[1]=p1[1]+height
  103.         
  104.     super(@p1, @p2, @p3, thick, color)
  105.   end
  106. end
  107. class Quadri < Polygon
  108.   attr_accessor :p4
  109.   def initialize(p1, p2, p3, p4, thick=1, color=normal_color)
  110.     super([p1, p2, p3, p4], thick, color)
  111.     @p1 = p1
  112.     @p2 = p2
  113.     @p3 = p3
  114.     @p4 = p4
  115.     @name = "Quadrilateral"
  116.     draw
  117.   end
  118. end
  119. class Rectangle < Quadri
  120.   def initialize(p1, width, length, thick=1, color=normal_color)
  121.     @p1 = p1

  122.     @p2=[]
  123.     @p2[0] = p1[0]
  124.     @p2[1] = p1[1] + width
  125.    
  126.     @p4 = []
  127.     @p4[0] = p1[0] + length
  128.     @p4[1] = p1[1]
  129.    
  130.     @p3=[]
  131.     @p3[0] = @p4[0]
  132.     @p3[1] = @p2[1]
  133.    
  134.     @width = width
  135.     @length = length
  136.    
  137.     super(@p1, @p2, @p3, @p4, thick, color)
  138.     @name = "Rectangle"
  139.   end
  140.   def area
  141.     return @length * @width
  142.   end
  143. end
  144. class Rhombus < Quadri
  145.   def initialize(p1, width, height, thick=1, color=normal_color)
  146.     @p1 = []
  147.     @p1[0] = p1[0] + width/2
  148.     @p1[1] = p1[1]

  149.     @p2 = []
  150.     @p2[0] = p1[0] + width
  151.     @p2[1] = p1[1] + height/2
  152.    
  153.     @p3 = []
  154.     @p3[0] = p1[0] + width/2
  155.     @p3[1] = p1[1] + height
  156.    
  157.     @p4 = []
  158.     @p4[0] = p1[0]
  159.     @p4[1] = p1[1] + height/2

  160.     super(@p1, @p2, @p3, @p4, thick, color)
  161.     @name = "Rhombus"
  162.   end
  163.   def area
  164.     return @width * @height / 2
  165.   end
  166. end
  167. class Square < Rectangle
  168.   def initialize(p1, side, thick=1, color=normal_color)
  169.     super(p1, side, side, thick, color)
  170.     @name = "Square"
  171.   end
  172. end

  173. class Grid < Sprite_Base
  174.   def initialize(x=32, y=32)
  175.     super(Viewport.new(0, 0, 544, 416))
  176.     self.bitmap = Bitmap.new(544, 416)
  177.     color = Color.new(255, 255, 255, 255)
  178.     for i in 1...(544/x)
  179.       dx = x*i
  180.       self.bitmap.drawline(dx, 0, dx, 416, 1, color)
  181.     end
  182.     for i in 1...(416/y)
  183.       dy = y*i
  184.       self.bitmap.drawline(0, dy, 544, dy, 1, color)
  185.     end
  186.   end
  187. end

  188. class Polygon < Sprite_Base
  189.   #--------------------------------------------------------------------------
  190.   # ● 獲取文字顏色
  191.   #     n : 文字顏色色號(0-31)
  192.   #--------------------------------------------------------------------------
  193.   def text_color(n)
  194.     windowskin = Cache.system("Window")
  195.     x = 64 + (n % 8) * 8
  196.     y = 96 + (n / 8) * 8
  197.     return windowskin.get_pixel(x, y)
  198.   end
  199.   #--------------------------------------------------------------------------
  200.   # ● 獲取一般文字顏色
  201.   #--------------------------------------------------------------------------
  202.   def normal_color
  203.     return text_color(0)
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   # ● 獲取系統文字顏色
  207.   #--------------------------------------------------------------------------
  208.   def system_color
  209.     return text_color(16)
  210.   end
  211.   #--------------------------------------------------------------------------
  212.   # ● 獲取危機文字顏色
  213.   #--------------------------------------------------------------------------
  214.   def crisis_color
  215.     return text_color(17)
  216.   end
  217.   #--------------------------------------------------------------------------
  218.   # ● 獲取戰鬥不能文字顏色
  219.   #--------------------------------------------------------------------------
  220.   def knockout_color
  221.     return text_color(18)
  222.   end
  223. end

  224. # 线条绘制脚本  作者 Deathless
  225. class Bitmap
  226.   #--------------------------------------------------------------------------
  227.   # ● 描绘直线   
  228.   #     x1,y1,x2,y2:  直线两端的坐标
  229.   #     width:    宽度  
  230.   #     color:    颜色
  231.   #--------------------------------------------------------------------------
  232.   def drawline(x1, y1, x2, y2, width, color)
  233.     x1 = x1.to_f
  234.     y1 = y1.to_f
  235.     x2 = x2.to_f
  236.     y2 = y2.to_f
  237.     width = width.to_f
  238.     k = (y2 - y1) / (x2 - x1)
  239.     if k.abs > 1
  240.       drawline_x(x1, y1, x2, y2, width, color)
  241.     else
  242.       drawline_y(x1, y1, x2, y2, width, color)
  243.     end
  244.   end
  245.   def drawline_x(x1, y1, x2, y2, width, color)
  246.     l = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5 * width / (y1 - y2)
  247.     length = l.abs * 2
  248.     k = (x2 - x1) / (y2 - y1) #x=ky+b
  249.     b = x1 - k * y1
  250.     if l > 0
  251.       for ty in y2.to_i..y1.to_i
  252.         tx = ty * k + b
  253.         fill_rect(tx - l, ty, length, 1, color)
  254.       end
  255.     else
  256.       for ty in y1.to_i..y2.to_i
  257.         tx = ty * k + b
  258.         fill_rect(tx + l, ty, length, 1, color)
  259.       end
  260.     end
  261.   end
  262.   def drawline_y(x1, y1, x2, y2, width, color)
  263.     l = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5 * width / (x1 - x2)
  264.     height = l.abs * 2
  265.     k = (y2 - y1) / (x2 - x1) #y=kx+b
  266.     b = y1 - k * x1
  267.     if l > 0
  268.       for tx in x2.to_i..x1.to_i
  269.         ty = tx * k + b
  270.         fill_rect(tx, ty - l, 1, height, color)
  271.       end
  272.     else
  273.       for tx in x1.to_i..x2.to_i
  274.         ty = tx * k + b
  275.         fill_rect(tx, ty + l, 1, height, color)
  276.       end
  277.     end
  278.   end
  279. end
复制代码

效果图:


使用范例:
在事件中调用脚本:$scene = Scene_Try.new即可
  1. class Scene_Try < Scene_Base
  2.   def start
  3.     @triangle = Triangle.new([10,40],[40, 40],[10, 100])
  4.     @i_triangle = Triangle_I.new([60, 10], 60)
  5.     @e_triangle = Triangle_E.new([110, 20], 60)
  6.     @triangle.print_name(100, 100)
  7.    
  8.     @quadri = Quadri.new([10, 230], [20, 230], [70, 250], [10, 250])
  9.     @rectangle = Rectangle.new([80, 200], 100, 50)
  10.     @rhombus = Rhombus.new([10, 300], 100, 50)
  11.     @square = Square.new([150, 300], 30)
  12.     @quadri.print_name(175, 250)
  13.   end
  14. end
复制代码
VA脚本开工中...
偷窃脚本1.0 - 已完成

Lv2.观梦者

神隐的主犯

梦石
0
星屑
283
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

2
发表于 2008-4-25 21:04:43 | 只看该作者
哦耶。最近画图形都画怕掉了。感觉还是C++好用点。至少还有提供现成的画画函数{/hx}。

顶一下先,然后坐坐沙发。哦呵呵~~~{/tp}

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

3
 楼主| 发表于 2008-4-25 21:11:42 | 只看该作者
回帖回得那麽快{/gg}
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
283
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

4
发表于 2008-4-25 21:34:14 | 只看该作者
目前没事做,让脑袋休息一下,所以就回的快了。{/hx}

也许是玩《东方风神录》练出来的快反应吧。哦呵呵~~~{/tp}

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

万物创造者

梦石
0
星屑
54
在线时间
352 小时
注册时间
2008-2-15
帖子
2432
5
发表于 2008-4-26 21:14:34 | 只看该作者
从截图上来看,好像在边边角角的地方都有点出头……
好像最工整的就是那个矩形和正方形,不过左上也缺了1像素……
好吧我没测试过,我在抽风……
From mortal hope immortal power springs.
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

6
 楼主| 发表于 2008-4-27 06:25:27 | 只看该作者
以下引用小幽的马甲于2008-4-26 13:14:34的发言:
从截图上来看,好像在边边角角的地方都有点出头……
好像最工整的就是那个矩形和正方形,不过左上也缺了1像素……
好吧我没测试过,我在抽风……


看来有必要修改一下画线脚本
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-12-20
帖子
258
7
发表于 2008-4-27 15:26:05 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

8
发表于 2008-4-27 19:48:52 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

9
 楼主| 发表于 2008-4-27 22:06:19 | 只看该作者
事实上椭圆和圆的公式是一样的
class Circle < Ellipse
只不过椭圆有 a b 两个参数和两个焦点
圆则是a == b 并且两个焦点重叠

看看怎麽画吧
先把正多边行画出来
还要修改画线後加减1像素的bug
修改BUG估计不难,大概是将首尾两点连接时的做边稍微修改一下就行了
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1624
在线时间
1609 小时
注册时间
2007-8-28
帖子
3253

第3届短篇游戏大赛主流游戏组冠军第1届Title华丽大赛新人奖

10
发表于 2008-5-1 04:42:33 | 只看该作者
  1. class Bitmap
  2. # 描绘圆
  3. def draw_circle(a, b, r, color)
  4.    min = (-r / Math.sqrt(2)).round
  5.    max = ( r / Math.sqrt(2)).round
  6.    for x in min..max
  7.      y = Math.sqrt(r**2 - x**2)
  8.      set_pixel(x+a, y+b, color)
  9.      set_pixel(x+a, -y+b, color)
  10.    end
  11.    for y in min..max
  12.      x = Math.sqrt(r**2 - y**2)
  13.      set_pixel(x+a, y+b, color)
  14.      set_pixel(-x+a, y+b, color)
  15.    end
  16. end
  17. end
复制代码
  1. class Bitmap
  2. # 描绘椭圆
  3. # 在矩形(x, y, width, height)里,用色color(Color)描绘椭圆。
  4. def draw_oval(x, y, width, height, color)
  5.    a = width / 2
  6.    b = height / 2
  7.    x += a
  8.    y += b
  9.    xmax = a * 4 / 5 #这里可以进行更改
  10.    xmin = -xmax
  11.    ymax = (Math.sqrt((1 - xmax**2 / a**2.to_f) * b**2)).round
  12.    ymin = -ymax
  13.    for mx in xmin..xmax
  14.      my = Math.sqrt((1 - mx**2 / a**2.to_f) * b**2)
  15.      set_pixel(mx+x, my+y, color)
  16.      set_pixel(mx+x, -my+y, color)
  17.    end
  18.    for my in ymin..ymax
  19.      mx = Math.sqrt((1 - my**2 / b**2.to_f) * a**2)
  20.      set_pixel(mx+x, my+y, color)
  21.      set_pixel(-mx+x, my+y, color)
  22.    end
  23. end
  24. end
复制代码
“我推荐你一个游戏吧,avg的,剧情特感人”
“我擦,都是文字图片的游戏有啥好玩的,连个战斗都没有!”
“我推荐你一个游戏吧,rpg的,战斗也新颖”
“我擦,怎么米有作i弊器?“
”你不是喜欢战斗么?”
“不,我是剧情党!!”

继续阅读请点击
http://rpg.blue/blog-53316-10027.html
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 14:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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