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
改来的脚本。不能直接使用(需配合素材)。但作对本文理解的一个参考,还是可以的。
class Bitmap
def draw_picnumber(x, y, nu,pic = RPG::Cache.picture("数字0"),k = 0)
w = pic.width
h = pic.height
re = Rect.new(0,0,w,h)
nu=nu.to_s
ar = nu.split(//)
for i in 0...ar.size
ar[i] = ar[i].to_i
end
case k
when 0
x = x #左对齐
for sz in ar
shuzi = sz
self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x+= w
end
when 2
x += w*(1 - ar.size) #右对齐
for sz in ar
shuzi = sz
self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x+= w
end
when 1 #居中
pf = ar.size
nn = (-1)**pf
ar1 =[]
ar2 =[]
if nn == 1 #偶数
mi = ar.size/2 #2
for i in 0..(mi - 1) #0,1
ar1.push(ar[i])
end
for i in mi..(ar.size-1) #2,3
ar2.push(ar[i])
end
#开始描绘
x1 = x -(w/2) #left
x1 -= w*(ar1.size)
for sz1 in ar1
shuzi = sz1
self.blt(x1,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x1+= w
end
x2 = x -(w/2)#right
for sz2 in ar2
shuzi = sz2
self.blt(x2,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x2+= w
end
else #奇数
mi = (ar.size-1)/2 #2
for i in 0..(mi - 1) #0,1
ar1.push(ar[i])
end
for i in (mi+1)..(ar.size-1) #3,4
ar2.push(ar[i])
end
#开始描绘
shuzi = ar[mi]
self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x1 = x #left
x1 -= w*(ar1.size)
for sz1 in ar1
shuzi = sz1
self.blt(x1,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x1+= w
end
x2 = x +w #right
for sz2 in ar2
shuzi = sz2
self.blt(x2,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x2+= w
end
end
end
end
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
改来的脚本。不能直接使用(需配合素材)。但作对本文理解的一个参考,还是可以的。
class Bitmap
def draw_picnumber(x, y, nu,pic = RPG::Cache.picture("数字0"),k = 0)
w = pic.width
h = pic.height
re = Rect.new(0,0,w,h)
nu=nu.to_s
ar = nu.split(//)
for i in 0...ar.size
ar[i] = ar[i].to_i
end
case k
when 0
x = x #左对齐
for sz in ar
shuzi = sz
self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x+= w
end
when 2
x += w*(1 - ar.size) #右对齐
for sz in ar
shuzi = sz
self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x+= w
end
when 1 #居中
pf = ar.size
nn = (-1)**pf
ar1 =[]
ar2 =[]
if nn == 1 #偶数
mi = ar.size/2 #2
for i in 0..(mi - 1) #0,1
ar1.push(ar[i])
end
for i in mi..(ar.size-1) #2,3
ar2.push(ar[i])
end
#开始描绘
x1 = x -(w/2) #left
x1 -= w*(ar1.size)
for sz1 in ar1
shuzi = sz1
self.blt(x1,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x1+= w
end
x2 = x -(w/2)#right
for sz2 in ar2
shuzi = sz2
self.blt(x2,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x2+= w
end
else #奇数
mi = (ar.size-1)/2 #2
for i in 0..(mi - 1) #0,1
ar1.push(ar[i])
end
for i in (mi+1)..(ar.size-1) #3,4
ar2.push(ar[i])
end
#开始描绘
shuzi = ar[mi]
self.blt(x,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x1 = x #left
x1 -= w*(ar1.size)
for sz1 in ar1
shuzi = sz1
self.blt(x1,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x1+= w
end
x2 = x +w #right
for sz2 in ar2
shuzi = sz2
self.blt(x2,y,pict = RPG::Cache.picture("数字"+shuzi.to_s),re)
x2+= w
end
end
end
end
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])
分别返回居中、靠左、靠右的字符串。
p "foo".center(10) # => " foo "
p "foo".ljust(10) # => "foo "
p "foo".rjust(10) # => " foo"
复制代码
当字符串长度超过width时,将返回原字符串的拷贝。
s = "foo"
p s.center(1).id == s.id # => false
复制代码
若使用了第二参数padding的话,将使用padding来填充空白。
p "foo".center(10,"*") # => "***foo****"
p "foo".ljust(10,"*") # => "foo*******"
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