Project1

标题: [左对齐,右对齐,居中]的实现 [打印本页]

作者: 猫哥哥    时间: 2007-12-15 11:54
标题: [左对齐,右对齐,居中]的实现
在写脚本的时候,有时会涉及到“左对齐”,“右对齐”或者“居中”的概念。这些东西看起来不起眼,实现起来还是需要思考一下的。

先用图来分析一下“左对齐”,“右对齐”和“居中”。
(我自己的概念。和RM在draw_text等内部的方法可能不一样。没有试验过。)
[LINE]1,#dddddd[/LINE]
[左对齐]

[右对齐]

[居中]

[LINE]1,#dddddd[/LINE]
在逐个描绘的时候,
左对齐的情况是最简单的,只要从原点不停地增加x坐标便能办到。
右对齐的情况下,从原点依次x坐标减去宽度,便能办到。

居中的情况比较复杂。分奇数和偶数两种情况。我是如下处理的:
在奇数个描绘对象时,先取出最中间一个对象,从原点处开始描绘。再将此对象之前的对象,从原点扩展一个宽度的距离后,全部用右对齐的方式描绘;之后的对象,从原点扩展一个宽度的距离后,全部以左对齐的方式描绘。
在偶数个描绘对象时,直接将对象分成前后两部分。前一部分,从原点缩进半个宽度的距离后,全部以右对齐的方式描绘;后一部分,从原点缩进半个宽度的距离后,全部以左对齐的方式描绘。
[LINE]1,#dddddd[/LINE]
自用脚本一个。从神思的脚本http://rpg.blue/web/htm/news629.htm改来的脚本。不能直接使用(需配合素材)。但作对本文理解的一个参考,还是可以的。
  1. class Bitmap
  2.    
  3.   def draw_picnumber(x, y, nu,pic = RPG::Cache.picture("数字0"),k = 0)

  4.     w = pic.width
  5.     h = pic.height
  6.     re = Rect.new(0,0,w,h)
  7.     nu=nu.to_s

  8.     ar = nu.split(//)

  9.     for i in 0...ar.size
  10.       ar[i] = ar[i].to_i
  11.     end
  12.     case k
  13.     when 0
  14.            x = x                   #左对齐
  15.            for sz in ar
  16.               shuzi = sz
  17.               self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  18.               x+= w
  19.             end
  20.             
  21.      when 2
  22.            x += w*(1 - ar.size)    #右对齐
  23.             for sz in ar
  24.               shuzi = sz
  25.               self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  26.               x+= w
  27.             end
  28.             
  29.      when 1 #居中
  30.             pf = ar.size
  31.             nn = (-1)**pf
  32.             ar1 =[]
  33.             ar2 =[]
  34.             if nn == 1 #偶数
  35.               mi = ar.size/2 #2
  36.               for i in 0..(mi - 1) #0,1
  37.                 ar1.push(ar[i])
  38.               end
  39.               for i in mi..(ar.size-1) #2,3
  40.                 ar2.push(ar[i])
  41.               end
  42.               #开始描绘
  43.               x1 = x -(w/2)  #left
  44.               x1 -= w*(ar1.size)
  45.               for sz1 in ar1
  46.                 shuzi = sz1
  47.                 self.blt(x1,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  48.                 x1+= w
  49.               end
  50.               
  51.               x2 = x -(w/2)#right
  52.               for sz2 in ar2
  53.                 shuzi = sz2
  54.                 self.blt(x2,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  55.                 x2+= w
  56.               end
  57.               
  58.             else #奇数
  59.               mi = (ar.size-1)/2 #2
  60.               for i in 0..(mi - 1) #0,1
  61.                 ar1.push(ar[i])
  62.               end
  63.               for i in (mi+1)..(ar.size-1) #3,4
  64.                 ar2.push(ar[i])
  65.               end
  66.               #开始描绘
  67.                 shuzi = ar[mi]
  68.                 self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  69.                
  70.               x1 = x   #left
  71.               x1 -= w*(ar1.size)
  72.               for sz1 in ar1
  73.                 shuzi = sz1
  74.                 self.blt(x1,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  75.                 x1+= w
  76.               end
  77.               
  78.               x2 = x +w #right
  79.               for sz2 in ar2
  80.                 shuzi = sz2
  81.                 self.blt(x2,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  82.                 x2+= w
  83.               end
  84.             end
  85.         end
  86.   end
  87. end
复制代码

作者: 猫哥哥    时间: 2007-12-15 11:54
标题: [左对齐,右对齐,居中]的实现
在写脚本的时候,有时会涉及到“左对齐”,“右对齐”或者“居中”的概念。这些东西看起来不起眼,实现起来还是需要思考一下的。

先用图来分析一下“左对齐”,“右对齐”和“居中”。
(我自己的概念。和RM在draw_text等内部的方法可能不一样。没有试验过。)
[LINE]1,#dddddd[/LINE]
[左对齐]

[右对齐]

[居中]

[LINE]1,#dddddd[/LINE]
在逐个描绘的时候,
左对齐的情况是最简单的,只要从原点不停地增加x坐标便能办到。
右对齐的情况下,从原点依次x坐标减去宽度,便能办到。

居中的情况比较复杂。分奇数和偶数两种情况。我是如下处理的:
在奇数个描绘对象时,先取出最中间一个对象,从原点处开始描绘。再将此对象之前的对象,从原点扩展一个宽度的距离后,全部用右对齐的方式描绘;之后的对象,从原点扩展一个宽度的距离后,全部以左对齐的方式描绘。
在偶数个描绘对象时,直接将对象分成前后两部分。前一部分,从原点缩进半个宽度的距离后,全部以右对齐的方式描绘;后一部分,从原点缩进半个宽度的距离后,全部以左对齐的方式描绘。
[LINE]1,#dddddd[/LINE]
自用脚本一个。从神思的脚本http://rpg.blue/web/htm/news629.htm改来的脚本。不能直接使用(需配合素材)。但作对本文理解的一个参考,还是可以的。
  1. class Bitmap
  2.    
  3.   def draw_picnumber(x, y, nu,pic = RPG::Cache.picture("数字0"),k = 0)

  4.     w = pic.width
  5.     h = pic.height
  6.     re = Rect.new(0,0,w,h)
  7.     nu=nu.to_s

  8.     ar = nu.split(//)

  9.     for i in 0...ar.size
  10.       ar[i] = ar[i].to_i
  11.     end
  12.     case k
  13.     when 0
  14.            x = x                   #左对齐
  15.            for sz in ar
  16.               shuzi = sz
  17.               self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  18.               x+= w
  19.             end
  20.             
  21.      when 2
  22.            x += w*(1 - ar.size)    #右对齐
  23.             for sz in ar
  24.               shuzi = sz
  25.               self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  26.               x+= w
  27.             end
  28.             
  29.      when 1 #居中
  30.             pf = ar.size
  31.             nn = (-1)**pf
  32.             ar1 =[]
  33.             ar2 =[]
  34.             if nn == 1 #偶数
  35.               mi = ar.size/2 #2
  36.               for i in 0..(mi - 1) #0,1
  37.                 ar1.push(ar[i])
  38.               end
  39.               for i in mi..(ar.size-1) #2,3
  40.                 ar2.push(ar[i])
  41.               end
  42.               #开始描绘
  43.               x1 = x -(w/2)  #left
  44.               x1 -= w*(ar1.size)
  45.               for sz1 in ar1
  46.                 shuzi = sz1
  47.                 self.blt(x1,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  48.                 x1+= w
  49.               end
  50.               
  51.               x2 = x -(w/2)#right
  52.               for sz2 in ar2
  53.                 shuzi = sz2
  54.                 self.blt(x2,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  55.                 x2+= w
  56.               end
  57.               
  58.             else #奇数
  59.               mi = (ar.size-1)/2 #2
  60.               for i in 0..(mi - 1) #0,1
  61.                 ar1.push(ar[i])
  62.               end
  63.               for i in (mi+1)..(ar.size-1) #3,4
  64.                 ar2.push(ar[i])
  65.               end
  66.               #开始描绘
  67.                 shuzi = ar[mi]
  68.                 self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  69.                
  70.               x1 = x   #left
  71.               x1 -= w*(ar1.size)
  72.               for sz1 in ar1
  73.                 shuzi = sz1
  74.                 self.blt(x1,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  75.                 x1+= w
  76.               end
  77.               
  78.               x2 = x +w #right
  79.               for sz2 in ar2
  80.                 shuzi = sz2
  81.                 self.blt(x2,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
  82.                 x2+= w
  83.               end
  84.             end
  85.         end
  86.   end
  87. end
复制代码

作者: Eclair    时间: 2007-12-15 19:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: 猫哥哥    时间: 2007-12-19 20:54
= =谢谢小绿(根据头发…),其实只是打算给用得着的人一个思路。脚本有空我会改一下。
[LINE]1,#dddddd[/LINE]
补充一点。若操作的对象是String,还可以用以下的方法

center(width)
ljust(width)
rjust(width)
center(width[, padding])
ljust(width[, padding])  
rjust(width[, padding])
分别返回居中、靠左、靠右的字符串。
  1. p "foo".center(10)      # => "   foo    "
  2. p "foo".ljust(10)       # => "foo       "
  3. p "foo".rjust(10)       # => "       foo"
复制代码

当字符串长度超过width时,将返回原字符串的拷贝。
  1. s = "foo"
  2. p s.center(1).id == s.id   # => false
复制代码

若使用了第二参数padding的话,将使用padding来填充空白。
  1. p "foo".center(10,"*")      # => "***foo****"
  2. p "foo".ljust(10,"*")       # => "foo*******"
  3. p "foo".rjust(10,"*")       # => "*******foo"
复制代码



作者: enghao_lim    时间: 2007-12-19 21:01
强人又发帖了!支持。{/qiang}
要说的都被楼主与小林说完了,我也没什么更好的建议。
只能说纯支持。
作者: cmbljsw    时间: 2007-12-19 21:03
以下引用enghao_lim于2007-12-19 13:01:52的发言:

强人又发帖了!支持。
要说的都被楼主与小林说完了,我也没什么更好的建议。
只能说纯支持。

干什么用的??{/fd}
作者: Eclair    时间: 2008-1-26 05:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: haorenqq    时间: 2008-1-26 23:17
{/se}{/se}{/se}{/se}




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