Project1

标题: 网状人物状态图,不完整版 [打印本页]

作者: Deathless    时间: 2007-3-7 02:25
标题: 网状人物状态图,不完整版
  1. class Bitmap
  2.   #--------------------------------------------------------------------------
  3.   # ● 描绘直线   
  4.   #     x1,y1,x2,y2:  直线两端的坐标
  5.   #     width:    宽度   
  6.   #     color:    颜色
  7.   #--------------------------------------------------------------------------
  8.   def drawline(x1, y1, x2, y2, width, color)
  9.     x1 = x1.to_f
  10.     y1 = y1.to_f
  11.     x2 = x2.to_f
  12.     y2 = y2.to_f
  13.     width = width.to_f
  14.     k = (y2 - y1) / (x2 - x1)
  15.     if k.abs > 1
  16.       drawline_x(x1, y1, x2, y2, width, color)
  17.     else
  18.       drawline_y(x1, y1, x2, y2, width, color)
  19.     end
  20.   end
  21.   def drawline_x(x1, y1, x2, y2, width, color)
  22.     l = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5 * width / (y1 - y2)
  23.     length = l.abs * 2
  24.     k = (x2 - x1) / (y2 - y1) #x=ky+b
  25.     b = x1 - k * y1
  26.     if l > 0
  27.       for ty in y2.to_i..y1.to_i
  28.         tx = ty * k + b
  29.         fill_rect(tx - l, ty, length, 1, color)
  30.       end
  31.     else
  32.       for ty in y1.to_i..y2.to_i
  33.         tx = ty * k + b
  34.         fill_rect(tx + l, ty, length, 1, color)
  35.       end
  36.     end
  37.   end
  38.   def drawline_y(x1, y1, x2, y2, width, color)
  39.     l = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5 * width / (x1 - x2)
  40.     height = l.abs * 2
  41.     k = (y2 - y1) / (x2 - x1) #y=kx+b
  42.     b = y1 - k * x1
  43.     if l > 0
  44.       for tx in x2.to_i..x1.to_i
  45.         ty = tx * k + b
  46.         fill_rect(tx, ty - l, 1, height, color)
  47.       end
  48.     else
  49.       for tx in x1.to_i..x2.to_i
  50.         ty = tx * k + b
  51.         fill_rect(tx, ty + l, 1, height, color)
  52.       end
  53.     end
  54.   end
  55. end
  56. class Window_Status < Window_Base
  57.   def get_position(x_begin, y_begin, x_end, y_end, percent)
  58.     a = []
  59.     a[0] = x_begin + (x_end - x_begin) * percent
  60.     a[1] = y_begin + (y_end - y_begin) * percent
  61.     return a
  62.   end
  63.   def refresh
  64.     self.contents.clear
  65.     x0 = 60 #图表的坐标
  66.     y0 = 220
  67.     r = 100.0 #图表的大小,友情提示:浮点数后面的.0不要省略了
  68.     h = 3 ** 0.5 * r / 2
  69.     a = [] #六边形的顶点和圆心
  70.     a[0] = [r, h] #圆心
  71.     a[1] = [r / 2, 0.0]
  72.     a[2] = [r * 3 / 2, 0.0]
  73.     a[6] = [0.0, h]
  74.     a[3] = [r * 2, h]
  75.     a[5] = [r / 2, h * 2]
  76.     a[4] = [r * 3 / 2, h * 2]
  77.     for i in a
  78.       i[0] += x0
  79.       i[1] += y0
  80.     end
  81.     self.contents.font.color = system_color
  82.     self.contents.draw_text(a[1][0] - 16 , a[1][1] - 32, 80, 32, "攻")
  83.     self.contents.draw_text(a[2][0] - 4, a[2][1] - 32, 80, 32, "防")
  84.     self.contents.draw_text(a[6][0] - 28, a[6][1] - 16, 80, 32, "力")
  85.     self.contents.draw_text(a[5][0] - 16, a[5][1], 80, 32, "敏")
  86.     self.contents.draw_text(a[4][0] - 4, a[4][1], 80, 32, "速")
  87.     self.contents.draw_text(a[3][0] + 8, a[3][1] - 16, 80, 32, "魔")
  88.     #描绘边框
  89.     for i in 1...a.size
  90.       self.contents.drawline(a[0][0], a[0][1], a[i][0], a[i][1], 1, disabled_color)
  91.     end
  92.     self.contents.drawline(a[1][0], a[1][1], a[2][0], a[2][1], 1, text_color(6))
  93.     self.contents.drawline(a[2][0], a[2][1], a[3][0], a[3][1], 1, text_color(6))
  94.     self.contents.drawline(a[3][0], a[3][1], a[4][0], a[4][1], 1, text_color(6))
  95.     self.contents.drawline(a[4][0], a[4][1], a[5][0], a[5][1], 1, text_color(6))
  96.     self.contents.drawline(a[5][0], a[5][1], a[6][0], a[6][1], 1, text_color(6))
  97.     self.contents.drawline(a[6][0], a[6][1], a[1][0], a[1][1], 1, text_color(6))
  98.     #描绘能力曲线
  99.     b = [] #获取能力值
  100.     b.push(@actor.atk)
  101.     b.push(@actor.pdef)
  102.     b.push(@actor.int)
  103.     b.push(@actor.agi)
  104.     b.push(@actor.dex)
  105.     b.push(@actor.str)
  106. =begin
  107.     #跟999作比较
  108.     c = []
  109.     for i in 0...b.size
  110.       c[i] = get_position(a[0][0], a[0][1], a[i+1][0], a[i+1][1], b[i] / 999.0)
  111.     end
  112.     for i in 0...c.size
  113.       self.contents.drawline(c[i][0], c[i][1], c[i-1][0], c[i-1][1], 1, text_color(3))
  114.     end   
  115. =end
  116. #=begin
  117.     #跟最高能力值比较
  118.     max_abi = 0
  119.     b.each{|i| max_abi = [max_abi, i].max}
  120.     max_abi = max_abi.to_f
  121.     c = [] #获得能力值的坐标
  122.     for i in 0...b.size
  123.       c[i] = get_position(a[0][0], a[0][1], a[i+1][0], a[i+1][1], b[i] / max_abi)
  124.     end
  125.     for i in 0...c.size
  126.       self.contents.drawline(c[i][0], c[i][1], c[i-1][0], c[i-1][1], 1, text_color(3))
  127.     end   
  128. #=end
  129.     #描绘能力数值
  130.     self.contents.font.color = knockout_color
  131.     self.contents.font.size = 14
  132.     for i in 0...b.size
  133.       self.contents.draw_text(c[i][0], c[i][1], 32, 24, b[i].to_s)
  134.     end
  135.     self.contents.font.size = 22
  136.     #以下未修改   
  137.     draw_actor_graphic(@actor, 40, 112)
  138.     draw_actor_name(@actor, 4, 0)
  139.     draw_actor_class(@actor, 4 + 144, 0)
  140.     draw_actor_level(@actor, 96, 32)
  141.     draw_actor_state(@actor, 96, 64)
  142.     draw_actor_hp(@actor, 96, 112, 172)
  143.     draw_actor_sp(@actor, 96, 144, 172)
  144.     self.contents.font.color = system_color
  145.     self.contents.draw_text(320, 48, 80, 32, "EXP")
  146.     self.contents.draw_text(320, 80, 80, 32, "NEXT")
  147.     self.contents.font.color = normal_color
  148.     self.contents.draw_text(320 + 80, 48, 84, 32, @actor.exp_s, 2)
  149.     self.contents.draw_text(320 + 80, 80, 84, 32, @actor.next_rest_exp_s, 2)
  150.     self.contents.font.color = system_color
  151.     self.contents.draw_text(320, 160, 96, 32, "装备")
  152.     draw_item_name($data_weapons[@actor.weapon_id], 320 + 16, 208)
  153.     draw_item_name($data_armors[@actor.armor1_id], 320 + 16, 256)
  154.     draw_item_name($data_armors[@actor.armor2_id], 320 + 16, 304)
  155.     draw_item_name($data_armors[@actor.armor3_id], 320 + 16, 352)
  156.     draw_item_name($data_armors[@actor.armor4_id], 320 + 16, 400)
  157.   end
  158. end
复制代码



效果就是这样的。。。
没有显示人物的魔法防御(不知道七边形怎么画。。。),建议用ps画一个图表,仅使用drawline画能力值的曲线就好,嗯,直线还会有点锯齿,有待改进。


悄悄更新一个抗锯齿的图片,脚本还没写好,过几天再更新


题目有点夸张,改了一个。。。
作者: Deathless    时间: 2007-3-7 02:25
标题: 网状人物状态图,不完整版
  1. class Bitmap
  2.   #--------------------------------------------------------------------------
  3.   # ● 描绘直线   
  4.   #     x1,y1,x2,y2:  直线两端的坐标
  5.   #     width:    宽度   
  6.   #     color:    颜色
  7.   #--------------------------------------------------------------------------
  8.   def drawline(x1, y1, x2, y2, width, color)
  9.     x1 = x1.to_f
  10.     y1 = y1.to_f
  11.     x2 = x2.to_f
  12.     y2 = y2.to_f
  13.     width = width.to_f
  14.     k = (y2 - y1) / (x2 - x1)
  15.     if k.abs > 1
  16.       drawline_x(x1, y1, x2, y2, width, color)
  17.     else
  18.       drawline_y(x1, y1, x2, y2, width, color)
  19.     end
  20.   end
  21.   def drawline_x(x1, y1, x2, y2, width, color)
  22.     l = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5 * width / (y1 - y2)
  23.     length = l.abs * 2
  24.     k = (x2 - x1) / (y2 - y1) #x=ky+b
  25.     b = x1 - k * y1
  26.     if l > 0
  27.       for ty in y2.to_i..y1.to_i
  28.         tx = ty * k + b
  29.         fill_rect(tx - l, ty, length, 1, color)
  30.       end
  31.     else
  32.       for ty in y1.to_i..y2.to_i
  33.         tx = ty * k + b
  34.         fill_rect(tx + l, ty, length, 1, color)
  35.       end
  36.     end
  37.   end
  38.   def drawline_y(x1, y1, x2, y2, width, color)
  39.     l = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5 * width / (x1 - x2)
  40.     height = l.abs * 2
  41.     k = (y2 - y1) / (x2 - x1) #y=kx+b
  42.     b = y1 - k * x1
  43.     if l > 0
  44.       for tx in x2.to_i..x1.to_i
  45.         ty = tx * k + b
  46.         fill_rect(tx, ty - l, 1, height, color)
  47.       end
  48.     else
  49.       for tx in x1.to_i..x2.to_i
  50.         ty = tx * k + b
  51.         fill_rect(tx, ty + l, 1, height, color)
  52.       end
  53.     end
  54.   end
  55. end
  56. class Window_Status < Window_Base
  57.   def get_position(x_begin, y_begin, x_end, y_end, percent)
  58.     a = []
  59.     a[0] = x_begin + (x_end - x_begin) * percent
  60.     a[1] = y_begin + (y_end - y_begin) * percent
  61.     return a
  62.   end
  63.   def refresh
  64.     self.contents.clear
  65.     x0 = 60 #图表的坐标
  66.     y0 = 220
  67.     r = 100.0 #图表的大小,友情提示:浮点数后面的.0不要省略了
  68.     h = 3 ** 0.5 * r / 2
  69.     a = [] #六边形的顶点和圆心
  70.     a[0] = [r, h] #圆心
  71.     a[1] = [r / 2, 0.0]
  72.     a[2] = [r * 3 / 2, 0.0]
  73.     a[6] = [0.0, h]
  74.     a[3] = [r * 2, h]
  75.     a[5] = [r / 2, h * 2]
  76.     a[4] = [r * 3 / 2, h * 2]
  77.     for i in a
  78.       i[0] += x0
  79.       i[1] += y0
  80.     end
  81.     self.contents.font.color = system_color
  82.     self.contents.draw_text(a[1][0] - 16 , a[1][1] - 32, 80, 32, "攻")
  83.     self.contents.draw_text(a[2][0] - 4, a[2][1] - 32, 80, 32, "防")
  84.     self.contents.draw_text(a[6][0] - 28, a[6][1] - 16, 80, 32, "力")
  85.     self.contents.draw_text(a[5][0] - 16, a[5][1], 80, 32, "敏")
  86.     self.contents.draw_text(a[4][0] - 4, a[4][1], 80, 32, "速")
  87.     self.contents.draw_text(a[3][0] + 8, a[3][1] - 16, 80, 32, "魔")
  88.     #描绘边框
  89.     for i in 1...a.size
  90.       self.contents.drawline(a[0][0], a[0][1], a[i][0], a[i][1], 1, disabled_color)
  91.     end
  92.     self.contents.drawline(a[1][0], a[1][1], a[2][0], a[2][1], 1, text_color(6))
  93.     self.contents.drawline(a[2][0], a[2][1], a[3][0], a[3][1], 1, text_color(6))
  94.     self.contents.drawline(a[3][0], a[3][1], a[4][0], a[4][1], 1, text_color(6))
  95.     self.contents.drawline(a[4][0], a[4][1], a[5][0], a[5][1], 1, text_color(6))
  96.     self.contents.drawline(a[5][0], a[5][1], a[6][0], a[6][1], 1, text_color(6))
  97.     self.contents.drawline(a[6][0], a[6][1], a[1][0], a[1][1], 1, text_color(6))
  98.     #描绘能力曲线
  99.     b = [] #获取能力值
  100.     b.push(@actor.atk)
  101.     b.push(@actor.pdef)
  102.     b.push(@actor.int)
  103.     b.push(@actor.agi)
  104.     b.push(@actor.dex)
  105.     b.push(@actor.str)
  106. =begin
  107.     #跟999作比较
  108.     c = []
  109.     for i in 0...b.size
  110.       c[i] = get_position(a[0][0], a[0][1], a[i+1][0], a[i+1][1], b[i] / 999.0)
  111.     end
  112.     for i in 0...c.size
  113.       self.contents.drawline(c[i][0], c[i][1], c[i-1][0], c[i-1][1], 1, text_color(3))
  114.     end   
  115. =end
  116. #=begin
  117.     #跟最高能力值比较
  118.     max_abi = 0
  119.     b.each{|i| max_abi = [max_abi, i].max}
  120.     max_abi = max_abi.to_f
  121.     c = [] #获得能力值的坐标
  122.     for i in 0...b.size
  123.       c[i] = get_position(a[0][0], a[0][1], a[i+1][0], a[i+1][1], b[i] / max_abi)
  124.     end
  125.     for i in 0...c.size
  126.       self.contents.drawline(c[i][0], c[i][1], c[i-1][0], c[i-1][1], 1, text_color(3))
  127.     end   
  128. #=end
  129.     #描绘能力数值
  130.     self.contents.font.color = knockout_color
  131.     self.contents.font.size = 14
  132.     for i in 0...b.size
  133.       self.contents.draw_text(c[i][0], c[i][1], 32, 24, b[i].to_s)
  134.     end
  135.     self.contents.font.size = 22
  136.     #以下未修改   
  137.     draw_actor_graphic(@actor, 40, 112)
  138.     draw_actor_name(@actor, 4, 0)
  139.     draw_actor_class(@actor, 4 + 144, 0)
  140.     draw_actor_level(@actor, 96, 32)
  141.     draw_actor_state(@actor, 96, 64)
  142.     draw_actor_hp(@actor, 96, 112, 172)
  143.     draw_actor_sp(@actor, 96, 144, 172)
  144.     self.contents.font.color = system_color
  145.     self.contents.draw_text(320, 48, 80, 32, "EXP")
  146.     self.contents.draw_text(320, 80, 80, 32, "NEXT")
  147.     self.contents.font.color = normal_color
  148.     self.contents.draw_text(320 + 80, 48, 84, 32, @actor.exp_s, 2)
  149.     self.contents.draw_text(320 + 80, 80, 84, 32, @actor.next_rest_exp_s, 2)
  150.     self.contents.font.color = system_color
  151.     self.contents.draw_text(320, 160, 96, 32, "装备")
  152.     draw_item_name($data_weapons[@actor.weapon_id], 320 + 16, 208)
  153.     draw_item_name($data_armors[@actor.armor1_id], 320 + 16, 256)
  154.     draw_item_name($data_armors[@actor.armor2_id], 320 + 16, 304)
  155.     draw_item_name($data_armors[@actor.armor3_id], 320 + 16, 352)
  156.     draw_item_name($data_armors[@actor.armor4_id], 320 + 16, 400)
  157.   end
  158. end
复制代码



效果就是这样的。。。
没有显示人物的魔法防御(不知道七边形怎么画。。。),建议用ps画一个图表,仅使用drawline画能力值的曲线就好,嗯,直线还会有点锯齿,有待改进。


悄悄更新一个抗锯齿的图片,脚本还没写好,过几天再更新


题目有点夸张,改了一个。。。
作者: 美兽    时间: 2007-3-7 02:39
如果边数是素数,但不是费尔马素数时,无法用尺规作图画出。

LZ可以利用一水平边做基准,用三角函数求近似值,不过最好的方法还是用PS的360/7角,做个七边形,记录相对坐标,再用在程序中。
作者: 亿万星辰    时间: 2007-3-7 02:44
话说......firework里有个智能多边形........{/lh}
作者: 美兽    时间: 2007-3-7 02:49
以下引用亿万星辰于2007-3-6 18:44:36的发言:

话说......firework里有个智能多边形........


如此一提,冷然想起PS的形状库也有多个正多边形……{/fd}
作者: Deathless    时间: 2007-3-7 03:05
以下引用美兽于2007-3-6 18:39:57的发言:

如果边数是素数,但不是费尔马素数时,无法用尺规作图画出。

LZ可以利用一水平边做基准,用三角函数求近似值,不过最好的方法还是用PS的360/7角,做个七边形,记录相对坐标,再用在程序中。


好像尺规作图能画出的,不一定我这里也能画出,我是用3^0.5 / 2来算的,其他多边形用计算器应该也可以算,只是偷懒而已。。。这样把魔防当作隐藏能力也不错。。。主要还是直线的锯齿比较不爽
作者: 美兽    时间: 2007-3-7 03:24
不可以,
不过LZ若真能做出来,肯定可震惊数学界,打破高斯的证明,

在数学界尺规作图的标准是

仅限于有限次地用没有刻度的直尺和圆规进行作图称为尺规作图。
    目前,在尺规作图中,一般认为直尺和圆规的功能为
(1)、过两点作一直线,并可无限延长一直线;
(2)、若两已知直线相交,可作出它们的交点;
(3)、以任一已知点为圆心,任意定长为半径可画一个圆或一段弧;
(4)、一已知直线和一已知圆若有公共点,可作出它们的公共点。
(5)、作图时,只能有限次使用直尺和圆规;不能利用直尺的刻度或在直尺上做任何记号;不能把直尺和圆规合并使用;也不能把几个直尺合并使用。


至于锯齿现象,图象处理中标准的解决方法为,描画过渡边界。

作者: Deathless    时间: 2007-3-7 03:29
我只是用计算器算啊。。。科学计算器有sin和cos,据说用泰勒公式也可以

过渡边界的点的颜色怎么算,是用两个颜色对应的属性相加除2吗
作者: 美兽    时间: 2007-3-7 03:39
以下引用Deathless于2007-3-6 19:29:34的发言:

我只是用计算器算啊。。。科学计算器有sin和cos,据说用泰勒公式也可以

过渡边界的点的颜色怎么算,是用两个颜色对应的属性相加除2吗


[本贴由作者于 2007-3-6 19:31:55 最后编辑]


1:科学计算器有sin和cos得到的仅是近似值,不是标准值,为七分是无限小数,不可能直接利用数值求解.

2:保持相对主色,例如我画的那条红线偏红,保持R不变,之后根据渐变边缘的层数弱花,例如那个例子距目测试好象是四层,但最难的是渐变点的分布并非直线式,我还不能完全模仿PS那么柔和,只能相对柔和,最主要这种技术网络上找不到相关讲解,我也只是通过目测来推算。
作者: 风雪优游    时间: 2007-3-7 19:00
感觉很好……虽然上面说的多半不明白~但期待完整版~一万个支持!!
作者: gpra8764    时间: 2007-3-7 23:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: Deathless    时间: 2007-3-8 00:10
以下引用gpra8764于2007-3-7 15:39:55的发言:
……叫六边形状态图会不会好点?……


{/pz}标题确实不知道起什么好,不过你这个也不怎么样。。。
因为默认人物状态有7个数据,我又不会画7边形,所以起了这个名字,是说不能完整显示7个数据的意思,不是说这个脚本才做到一半,脚本已经是完整版了,如果有个状态图的话我可以修改一下脚本,比如下面这个是从三国11素材里头拿出来的(居然只有5边形。。。)

作者: 柳柳    时间: 2007-3-8 21:49
由于实用价值很高,发布了,在这里:
http://rpg.blue/web/htm/news633.htm




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1