Project1

标题: 【学习Ruby三天】一个很渣的Sprite浮动文字系统 [打印本页]

作者: xmttttt    时间: 2014-8-30 20:17
标题: 【学习Ruby三天】一个很渣的Sprite浮动文字系统
本帖最后由 xmttttt 于 2014-9-6 11:31 编辑

【学习Ruby三天】一个很渣的Sprite浮动文字系统

受到了Yuee的地图名显示脚本的启发
https://rpg.blue/thread-282895-1-1.html
但是他做的是window,如果遇到要直接浮动文字,不想有边框的情况怎么办呢?
虽然也有把窗框背景设为全透明的方法可选,但感觉是不是有点脱裤子放屁
然后就想能不能直接用Sprite显示浮动文字,于是就做了这个。{:2_275:}
刚学ruby,请轻喷{:2_277:}
ps:第一次认真使用RPGMaker的脚本编辑器,感觉功能还是很强大的。就算用不着我这个显示文字的功能,把我代码拿去改改显示个图像什么的也完全是没有问题{:2_274:}

使用说明&效果示意:


更新日志:
v0.65 aleph

v0.9 beth 修正了语法错误,添加了改变字体的功能

RUBY 代码复制下载
  1. #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
  2. #  RPGMaker VX Sprite浮动文字系统 by Spacesoft
  3. #  本系统用于在RPGMaker VX环境下方便快捷地产生浮动文字。所生成的浮动文字为
  4. #  Sprite的子类,并提供一个Scene_Base类下的方法快捷产生浮动文字。支持浮现、
  5. #  渐隐和移动。目前暂时只能显示单行字符,其他功能还在开发中~
  6. #  输入字符支持“/字母[数字]"格式的一些属性设定,具体见函数说明。
  7. #
  8. #  - MyFloatingText
  9. #------------------------------------------------------------------------------
  10. #  浮动文字类
  11. #  版本:0.9 beth
  12. #  作者:Spacesoft
  13. #------------------------------------------------------------------------------
  14. #  全部文件:
  15. #  ┗★MyFloatingText
  16. #  ┗  MyTempFloatingText
  17. #  ┗  MyScene_Base
  18. #
  19. #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
  20. class MyFloatingText < Sprite
  21.   #--------------------------------------------------------------------------
  22.   # * 物件初始化
  23.   #     x : 視窗X座標
  24.   #     y : 視窗Y座標
  25.   #     text : 要显示的文字内容
  26.   #     属性设定字:
  27.   #       字号设定/p[n]
  28.   #       颜色设定/c[n]
  29.   #       粗体设定/b[n]:0为普通,1为斜体,其它无效
  30.   #       斜体设定/i[n]:0为普通,1为斜体,其它无效
  31.   #       阴影设定/s[n]:0为无阴影,1为有阴影,其它无效
  32.   #       字体设定/f[n]
  33.   #       字符"/"被用作转义符,想要显示"/"请输入"//"
  34.   #       暂不支持换行符,不能多行显示
  35.   #  示例:$scene.floating_text(100,100,"示例/c[2]文/p[50]字",0,0,100,1)
  36.   #--------------------------------------------------------------------------
  37.   def initialize(x,y,text)
  38.     super()
  39.     self.x=x
  40.     self.y=y
  41.  
  42.     #计算bitmap的大小,因此只需要对字号大小进行判断
  43.     text_copy=text.downcase
  44.     dummy_bitmap=Bitmap.new(1,1)
  45.     size_x=0
  46.     size_y=0
  47.     while text_copy!=""
  48.       if text_copy.slice!(/^\/([pcbisf])\[([0-9]+)\]/)!=nil #匹配成功
  49.         case $1
  50.         when "p" #是字号设定\\p[n]
  51.           dummy_bitmap.font.size=$2.to_i
  52.         else
  53.         end
  54.       elsif text_copy.slice!(/^\/\//)!=nil  #字符"//"变为"/"
  55.         size_x+=dummy_bitmap.text_size("/").width
  56.         if dummy_bitmap.text_size("/").height>size_y
  57.           size_y=dummy_bitmap.text_size("/").height
  58.         else
  59.         end
  60.       elsif text_copy.slice!(/^\//)!=nil  #字符"/"消掉
  61.       else  #普通字符
  62.         text_copy.slice!(/^(.)/)  #削下一个字符
  63.         size_x+=dummy_bitmap.text_size($1).width
  64.         if dummy_bitmap.text_size($1).height>size_y
  65.           size_y=dummy_bitmap.text_size($1).height
  66.         else
  67.         end
  68.       end
  69.     end
  70.     dummy_bitmap.dispose
  71.  
  72.     #按照上面求出的大小绘制Bitmap
  73.     text_copy=text.downcase
  74.     text_bitmap=Bitmap.new(size_x,size_y)
  75.     #字符转义
  76.     #判断是否为字号设定/p[n]
  77.     #判断是否为颜色设定/c[n]
  78.     #判断是否为粗体设定/b[n]
  79.     #判断是否为斜体设定/i[n]
  80.     #判断是否为阴影设定/s[n]
  81.     now_start_x=0 #目前x坐标起始位置
  82.     now_start_y=0 #目前y坐标起始位置
  83.     while text_copy!=""
  84.       if text_copy.slice!(/^\/([pcbisf])\[([0-9]+)\]/)!=nil #匹配成功
  85.         case $1
  86.         when "p" #是字号设定/p[n]
  87.           text_bitmap.font.size=$2.to_i
  88.         when "c" #是颜色设定/c[n]
  89.           text_bitmap.font.color=text_color($2.to_i)
  90.         when "b" #是粗体设定/b[n]
  91.           case $2.to_i
  92.           when 0
  93.             text_bitmap.font.bold=false
  94.           when 1
  95.             text_bitmap.font.bold=true
  96.           else
  97.           end
  98.         when "i" #是斜体设定/i[n]
  99.           case $2.to_i
  100.           when 0
  101.             text_bitmap.font.italic=false
  102.           when 1
  103.             text_bitmap.font.italic=true
  104.           else
  105.           end
  106.         when "s" #是阴影设定/s[n]
  107.           case $2.to_i
  108.           when 0
  109.             text_bitmap.font.shadow=false
  110.           when 1
  111.             text_bitmap.font.shadow=true
  112.           else
  113.           end
  114.         when "f" #是字体设定/f[n]
  115.           if Font.default_name[$2.to_i]!=nil
  116.             text_bitmap.font.name=Font.default_name[$2.to_i]
  117.           end
  118.         else
  119.         end
  120.       elsif text_copy.slice!(/^\/\//)!=nil  #字符"//"变为"/"
  121.         char_width=text_bitmap.text_size("/").width
  122.         char_height=text_bitmap.text_size("/").height
  123.         text_bitmap.draw_text(now_start_x,size_y-char_height,char_width,char_height,"/",0)
  124.         now_start_x+=char_width
  125.       elsif text_copy.slice!(/^\//)!=nil  #字符"/"消掉
  126.       else  #普通字符
  127.         text_copy.slice!(/^(.)/)  #削下一个字符
  128.         char_width=text_bitmap.text_size($1).width
  129.         char_height=text_bitmap.text_size($1).height
  130.         text_bitmap.draw_text(now_start_x,size_y-char_height,char_width,char_height,$1,0)
  131.         now_start_x+=char_width
  132.       end
  133.       #p text_copy
  134.       #text_bitmap.draw_text(100,0,10,20,"i",0)
  135.     end
  136.     #text_bitmap.draw_text(100,0,10,20,"i",0)
  137.     self.bitmap=text_bitmap
  138.     #self.bitmap = @animation_bitmap1
  139.   end
  140.   def text_color(n)
  141.     x = 64 + (n % 8) * 8
  142.     y = 96 + (n / 8) * 8
  143.     windowskin = Cache.system("Window")
  144.     return windowskin.get_pixel(x, y)
  145.   end
  146.  
  147. end


RUBY 代码复制下载
  1. #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
  2. #  RPGMaker VX Sprite浮动文字系统 by Spacesoft
  3. #  本系统用于在RPGMaker VX环境下方便快捷地产生浮动文字。所生成的浮动文字为
  4. #  Sprite的子类,并提供一个Scene_Base类下的方法快捷产生浮动文字。支持浮现、
  5. #  渐隐和移动。目前暂时只能显示单行字符,其他功能还在开发中~
  6. #  输入字符支持“/字母[数字]"格式的一些属性设定,具体见函数说明。
  7. #
  8. #  - MyTempFloatingText
  9. #------------------------------------------------------------------------------
  10. #  高级的浮动文字类,支持浮现、渐隐和运动
  11. #  版本:0.9 beth
  12. #  作者:Spacesoft
  13. #------------------------------------------------------------------------------
  14. #  全部文件:
  15. #  ┗  MyFloatingText
  16. #  ┗★MyTempFloatingText
  17. #  ┗  MyScene_Base
  18. #
  19. #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
  20. class MyTempFloatingText < MyFloatingText
  21.   attr_accessor:birth_time
  22.   attr_accessor:hold_time
  23.   attr_accessor:fade_time
  24.   attr_accessor:existence_time  #已经存在了的时间
  25.   attr_accessor:velocity    #浮动文字的运动速度,每帧移动的像素数
  26.   attr_accessor:direction   #浮动文字的运动方向,角度制。0为正北,逆时针旋转
  27.   attr_accessor:x_f    #x坐标的浮点版本,以防误差
  28.   attr_accessor:y_f    #y坐标的浮点版本,以防误差
  29.   include Math
  30.   def initialize(x,y,text,birth_time=10,hold_time=100,fade_time=10,velocity=0,direction=0)
  31.     super(x,y,text)
  32.     @birth_time=birth_time
  33.     @hold_time=hold_time
  34.     @fade_time=fade_time
  35.     @velocity=velocity
  36.     @direction=direction
  37.     @existence_time=0
  38.     @x_f=x
  39.     @y_f=y
  40.   end
  41.   def linear_move  #浮动文字线性运动一帧。
  42.     if self.velocity!=0
  43.       real_rad_dir=(self.direction.to_f+90)*PI/180 #角度转换为弧度并加90度修正
  44.       self.x_f=self.x_f+self.velocity*cos(real_rad_dir)
  45.       self.y_f=self.y_f-self.velocity*sin(real_rad_dir)
  46.       self.x=self.x_f.to_i
  47.       self.y=self.y_f.to_i
  48.     end
  49.   end
  50. end


RUBY 代码复制下载
  1. #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
  2. #  RPGMaker VX Sprite浮动文字系统 by Spacesoft
  3. #  本系统用于在RPGMaker VX环境下方便快捷地产生浮动文字。所生成的浮动文字为
  4. #  Sprite的子类,并提供一个Scene_Base类下的方法快捷产生浮动文字。支持浮现、
  5. #  渐隐和移动。目前暂时只能显示单行字符,其他功能还在开发中~
  6. #  输入字符支持“/字母[数字]"格式的一些属性设定,具体见函数说明。
  7. #
  8. #  - MyScene_Base
  9. #------------------------------------------------------------------------------
  10. #  增强Scene_Base类,添加对高级浮动文字的支持
  11. #  版本:0.9 beth
  12. #  作者:Spacesoft
  13. #------------------------------------------------------------------------------
  14. #  全部文件:
  15. #  ┗  MyFloatingText
  16. #  ┗  MyTempFloatingText
  17. #  ┗★MyScene_Base
  18. #
  19. #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
  20.  
  21. class Scene_Base
  22.   include Math
  23.   alias base_start start
  24.   def start
  25.     base_start
  26.     @ft_array=[]    #存放浮动文字的数组
  27.   end
  28.   def floating_text(x,y,text,birth_time=10,hold_time=100,fade_time=10,velocity=0,direction=0)
  29.     new_text=MyTempFloatingText.new(x,y,text,birth_time,hold_time,fade_time,velocity,direction)
  30.     @ft_array.push(new_text)
  31.   end
  32.   alias base_update update
  33.   def update
  34.     base_update
  35.     update_floating_text
  36.   end
  37.   alias base_pt pre_terminate
  38.   def pre_terminate
  39.     base_pt
  40.     @ft_array.each do |i|
  41.       i.dispose
  42.     end
  43.     @ft_array.clear
  44.   end
  45.   def update_floating_text
  46.     @ft_array.each do |i|
  47.       i.existence_time+=1 #已存在时间时间+=1
  48.       case i.existence_time
  49.       when 1 .. i.birth_time
  50.         i.opacity=(i.existence_time.to_f/i.birth_time*255).to_i
  51.         i.linear_move   #线性移动一帧
  52.       when i.birth_time+1 .. i.birth_time+i.hold_time
  53.         i.opacity=255
  54.         i.linear_move   #线性移动一帧
  55.       when i.birth_time+i.hold_time+1 .. i.birth_time+i.hold_time+i.fade_time
  56.         i.opacity=((i.birth_time.to_f+i.hold_time+i.fade_time-i.existence_time)/i.fade_time*255).to_i
  57.         i.linear_move   #线性移动一帧
  58.       else
  59.         @ft_array.delete(i).dispose
  60.       end
  61.     end
  62.   end
  63. end

作者: taroxd    时间: 2014-8-31 07:00
本帖最后由 taroxd 于 2014-8-31 07:05 编辑
虽然也有把窗框背景设为全透明的方法可选,但感觉是不是有点脱裤子放屁


其实我正是推荐这个方式。默认脚本帮你都定义好了 draw_text_ex 了(VA是这样,VX不清楚)。

另外,when "p"||"P" 等价于 when "p",而正确的使用方式为 when "p", "P"
但是更推荐你在 case 语句里就加一个 downcase 转小写

加油,好好学吧
作者: xmttttt    时间: 2014-9-1 16:22
taroxd 发表于 2014-8-31 07:00
其实我正是推荐这个方式。默认脚本帮你都定义好了 draw_text_ex 了(VA是这样,VX不清楚)。

另外,when ...

vx没有draw_text_ex。我开始玩脚本的时候发现直接draw_text的话,xy坐标是边框开始的地方不是文字开始的地方(当然现在试出来边框宽高32,32,减一下就没问题.....),于是就写了这个加强下vx显示文本的功能,如果想方便地实现一句话里字体字号换来换去的话{:2_277:}(谁会这么蛋疼啊pia飞)
直觉感觉Window比Sprite更占资源,也不知道我想得对不对。语法问题感谢指正{:2_275:}




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