查看: 2504|回复: 2

[RMVX发布] 【学习Ruby三天】一个很渣的Sprite浮动文字系统

[复制链接]
梦石
1
星屑
602
在线时间
2 小时
注册时间
2010-11-1
回帖
1
发表于 2014-8-30 20:17:45 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 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:}

使用说明&效果示意:
教程.JPG

更新日志:
v0.65 aleph

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

[pre lang="ruby" line="1" file="MyFloatingText"]#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
#  RPGMaker VX Sprite浮动文字系统 by Spacesoft
#  本系统用于在RPGMaker VX环境下方便快捷地产生浮动文字。所生成的浮动文字为
#  Sprite的子类,并提供一个Scene_Base类下的方法快捷产生浮动文字。支持浮现、
#  渐隐和移动。目前暂时只能显示单行字符,其他功能还在开发中~
#  输入字符支持“/字母[数字]"格式的一些属性设定,具体见函数说明。
#
#  - MyFloatingText
#------------------------------------------------------------------------------
#  浮动文字类
#  版本:0.9 beth
#  作者:Spacesoft
#------------------------------------------------------------------------------
#  全部文件:
#  ┗★MyFloatingText
#  ┗  MyTempFloatingText
#  ┗  MyScene_Base
#
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
class MyFloatingText < Sprite
  #--------------------------------------------------------------------------
  # * 物件初始化
  #     x : 視窗X座標
  #     y : 視窗Y座標
  #     text : 要显示的文字内容
  #     属性设定字:
  #       字号设定/p[n]
  #       颜色设定/c[n]
  #       粗体设定/b[n]:0为普通,1为斜体,其它无效
  #       斜体设定/i[n]:0为普通,1为斜体,其它无效
  #       阴影设定/s[n]:0为无阴影,1为有阴影,其它无效
  #       字体设定/f[n]
  #       字符"/"被用作转义符,想要显示"/"请输入"//"
  #       暂不支持换行符,不能多行显示
  #  示例:$scene.floating_text(100,100,"示例/c[2]文/p[50]字",0,0,100,1)
  #--------------------------------------------------------------------------
  def initialize(x,y,text)
    super()
    self.x=x
    self.y=y
   
    #计算bitmap的大小,因此只需要对字号大小进行判断
    text_copy=text.downcase
    dummy_bitmap=Bitmap.new(1,1)
    size_x=0
    size_y=0
    while text_copy!=""
      if text_copy.slice!(/^\/([pcbisf])\[([0-9]+)\]/)!=nil #匹配成功
        case $1
        when "p" #是字号设定\\p[n]
          dummy_bitmap.font.size=$2.to_i
        else
        end
      elsif text_copy.slice!(/^\/\//)!=nil  #字符"//"变为"/"
        size_x+=dummy_bitmap.text_size("/").width
        if dummy_bitmap.text_size("/").height>size_y
          size_y=dummy_bitmap.text_size("/").height
        else
        end
      elsif text_copy.slice!(/^\//)!=nil  #字符"/"消掉
      else  #普通字符
        text_copy.slice!(/^(.)/)  #削下一个字符
        size_x+=dummy_bitmap.text_size($1).width
        if dummy_bitmap.text_size($1).height>size_y
          size_y=dummy_bitmap.text_size($1).height
        else
        end
      end
    end
    dummy_bitmap.dispose
   
    #按照上面求出的大小绘制Bitmap
    text_copy=text.downcase
    text_bitmap=Bitmap.new(size_x,size_y)
    #字符转义
    #判断是否为字号设定/p[n]
    #判断是否为颜色设定/c[n]
    #判断是否为粗体设定/b[n]
    #判断是否为斜体设定/i[n]
    #判断是否为阴影设定/s[n]
    now_start_x=0 #目前x坐标起始位置
    now_start_y=0 #目前y坐标起始位置
    while text_copy!=""
      if text_copy.slice!(/^\/([pcbisf])\[([0-9]+)\]/)!=nil #匹配成功
        case $1
        when "p" #是字号设定/p[n]
          text_bitmap.font.size=$2.to_i
        when "c" #是颜色设定/c[n]
          text_bitmap.font.color=text_color($2.to_i)
        when "b" #是粗体设定/b[n]
          case $2.to_i
          when 0
            text_bitmap.font.bold=false
          when 1
            text_bitmap.font.bold=true
          else
          end
        when "i" #是斜体设定/i[n]
          case $2.to_i
          when 0
            text_bitmap.font.italic=false
          when 1
            text_bitmap.font.italic=true
          else
          end
        when "s" #是阴影设定/s[n]
          case $2.to_i
          when 0
            text_bitmap.font.shadow=false
          when 1
            text_bitmap.font.shadow=true
          else
          end
        when "f" #是字体设定/f[n]
          if Font.default_name[$2.to_i]!=nil
            text_bitmap.font.name=Font.default_name[$2.to_i]
          end
        else
        end
      elsif text_copy.slice!(/^\/\//)!=nil  #字符"//"变为"/"
        char_width=text_bitmap.text_size("/").width
        char_height=text_bitmap.text_size("/").height
        text_bitmap.draw_text(now_start_x,size_y-char_height,char_width,char_height,"/",0)
        now_start_x+=char_width
      elsif text_copy.slice!(/^\//)!=nil  #字符"/"消掉
      else  #普通字符
        text_copy.slice!(/^(.)/)  #削下一个字符
        char_width=text_bitmap.text_size($1).width
        char_height=text_bitmap.text_size($1).height
        text_bitmap.draw_text(now_start_x,size_y-char_height,char_width,char_height,$1,0)
        now_start_x+=char_width
      end
      #p text_copy
      #text_bitmap.draw_text(100,0,10,20,"i",0)
    end
    #text_bitmap.draw_text(100,0,10,20,"i",0)
    self.bitmap=text_bitmap
    #self.bitmap = @animation_bitmap1
  end
  def text_color(n)
    x = 64 + (n % 8) * 8
    y = 96 + (n / 8) * 8
    windowskin = Cache.system("Window")
    return windowskin.get_pixel(x, y)
  end
  
end[/pre]

[pre lang="ruby" line="1" file="MyTempFloatingText"]#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
#  RPGMaker VX Sprite浮动文字系统 by Spacesoft
#  本系统用于在RPGMaker VX环境下方便快捷地产生浮动文字。所生成的浮动文字为
#  Sprite的子类,并提供一个Scene_Base类下的方法快捷产生浮动文字。支持浮现、
#  渐隐和移动。目前暂时只能显示单行字符,其他功能还在开发中~
#  输入字符支持“/字母[数字]"格式的一些属性设定,具体见函数说明。
#
#  - MyTempFloatingText
#------------------------------------------------------------------------------
#  高级的浮动文字类,支持浮现、渐隐和运动
#  版本:0.9 beth
#  作者:Spacesoft
#------------------------------------------------------------------------------
#  全部文件:
#  ┗  MyFloatingText
#  ┗★MyTempFloatingText
#  ┗  MyScene_Base
#
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
class MyTempFloatingText < MyFloatingText
  attr_accessor:birth_time
  attr_accessor:hold_time
  attr_accessor:fade_time
  attr_accessor:existence_time  #已经存在了的时间
  attr_accessor:velocity    #浮动文字的运动速度,每帧移动的像素数
  attr_accessor:direction   #浮动文字的运动方向,角度制。0为正北,逆时针旋转
  attr_accessor:x_f    #x坐标的浮点版本,以防误差
  attr_accessor:y_f    #y坐标的浮点版本,以防误差
  include Math
  def initialize(x,y,text,birth_time=10,hold_time=100,fade_time=10,velocity=0,direction=0)
    super(x,y,text)
    @birth_time=birth_time
    @hold_time=hold_time
    @fade_time=fade_time
    @velocity=velocity
    @direction=direction
    @existence_time=0
    @x_f=x
    @y_f=y
  end
  def linear_move  #浮动文字线性运动一帧。
    if self.velocity!=0
      real_rad_dir=(self.direction.to_f+90)*PI/180 #角度转换为弧度并加90度修正
      self.x_f=self.x_f+self.velocity*cos(real_rad_dir)
      self.y_f=self.y_f-self.velocity*sin(real_rad_dir)
      self.x=self.x_f.to_i
      self.y=self.y_f.to_i
    end
  end
end[/pre]

[pre lang="ruby" line="1" file="MyScene_Base"]#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
#  RPGMaker VX Sprite浮动文字系统 by Spacesoft
#  本系统用于在RPGMaker VX环境下方便快捷地产生浮动文字。所生成的浮动文字为
#  Sprite的子类,并提供一个Scene_Base类下的方法快捷产生浮动文字。支持浮现、
#  渐隐和移动。目前暂时只能显示单行字符,其他功能还在开发中~
#  输入字符支持“/字母[数字]"格式的一些属性设定,具体见函数说明。
#
#  - MyScene_Base
#------------------------------------------------------------------------------
#  增强Scene_Base类,添加对高级浮动文字的支持
#  版本:0.9 beth
#  作者:Spacesoft
#------------------------------------------------------------------------------
#  全部文件:
#  ┗  MyFloatingText
#  ┗  MyTempFloatingText
#  ┗★MyScene_Base
#
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

class Scene_Base
  include Math
  alias base_start start
  def start
    base_start
    @ft_array=[]    #存放浮动文字的数组
  end
  def floating_text(x,y,text,birth_time=10,hold_time=100,fade_time=10,velocity=0,direction=0)
    new_text=MyTempFloatingText.new(x,y,text,birth_time,hold_time,fade_time,velocity,direction)
    @ft_array.push(new_text)
  end
  alias base_update update
  def update
    base_update
    update_floating_text
  end
  alias base_pt pre_terminate
  def pre_terminate
    base_pt
    @ft_array.each do |i|
      i.dispose
    end
    @ft_array.clear
  end
  def update_floating_text
    @ft_array.each do |i|
      i.existence_time+=1 #已存在时间时间+=1
      case i.existence_time
      when 1 .. i.birth_time
        i.opacity=(i.existence_time.to_f/i.birth_time*255).to_i
        i.linear_move   #线性移动一帧
      when i.birth_time+1 .. i.birth_time+i.hold_time
        i.opacity=255
        i.linear_move   #线性移动一帧
      when i.birth_time+i.hold_time+1 .. i.birth_time+i.hold_time+i.fade_time
        i.opacity=((i.birth_time.to_f+i.hold_time+i.fade_time-i.existence_time)/i.fade_time*255).to_i
        i.linear_move   #线性移动一帧
      else
        @ft_array.delete(i).dispose
      end
    end
  end
end[/pre]

评分

参与人数 2星屑 +301 梦石 +1 收起 理由
怪蜀黍 + 300 + 1 发布奖励
Fakmab + 1 来自iphone6土豪金的原创好评

查看全部评分

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-8-31 07:00:09 | 显示全部楼层
本帖最后由 taroxd 于 2014-8-31 07:05 编辑
虽然也有把窗框背景设为全透明的方法可选,但感觉是不是有点脱裤子放屁


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

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

加油,好好学吧

评分

参与人数 1星屑 +100 收起 理由
怪蜀黍 + 100 语法纠正、参与讨论奖励,VX没有ex.

查看全部评分

回复

使用道具 举报

梦石
1
星屑
602
在线时间
2 小时
注册时间
2010-11-1
回帖
1
 楼主| 发表于 2014-9-1 16:22:35 | 显示全部楼层
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:}

评分

参与人数 1星屑 +20 收起 理由
夜狠简单 + 20 拿去用了

查看全部评分

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部