功能:
提供一组自动设置大小的弹出式提示框,可以在所有的Scene里弹出显示文字,一段时间后自动消失
附带:显示当前BGM名字的脚本
效果:左上角窗口。
RUBY 代码
[code]#==============================================================================  
# ■ 自动弹框+地图BGM显示   
# 修改自地图名显示脚本 by Yuee  
# 原脚本取自66RPG 
http://rpg.blue  
#------------------------------------------------------------------------------  
# 功能:提供一组自动设置大小的弹出式提示框  
# 可以在所有的Scene里弹出显示文字  
# 一段时间后自动消失  
# 用法:  
# 事件或脚本中直接调用以下代码  
# $scene.popup(text, mode, x, y)  
#  
# text:要使用的文字。可以使用FUKI的转义法,和多行文字。例如:"新任务: \\c[6]"[email protected]  
# mode:模式字符串  
#       later:在前面的弹框显示完之后再显示  
#       其他任意:马上显示  
# x,y :位置  
#       不指定位置:窗口会自动放在屏幕上中且不会遮挡其他自动窗口  
#       指定位置:窗口会放在指定位置,会和同一位置其他窗口重合  
# 样例:  
#       在屏幕中心显示任务信息:  $scene.popup("任务情报更新了: \\c[6]"+@missions[name].name_b, "now")  
#       在屏幕左上方显示BGM名称: $scene.popup("♫BGM: " +$game_system.playing_bgm.name, "later", 0, 0)  
# ps:如果想关闭显示,可以打开SWITCH指定的公共开关(默认#25)  
#==============================================================================  
module FUKImini  
  #--------------------------------------------------------------------------  
  # ○ 描绘信息处理 in FUKI  
  #--------------------------------------------------------------------------  
  def draw_message(msg)  
      text=msg  
      # 限制文字处理  
      begin  
        last_text = text.clone  
        text.gsub!(/\
Vv]\[([0−9]+)
/){$game_variables[$1.to_i]}  
      enduntil text == last_text  
      text.gsub!(/\
Nn]\[([0−9]+)
/)do  
        $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""  
      end  
      # 为了方便、将 "\\\\" 变换为 "\000"   
      text.gsub!(/\\\\/){"\000"}  
      # "\\C" 变为 "\001"、"\\G" 变为 "\002"  
      text.gsub!(/\
Cc]\[([0−9]+)
/){"\001[#{$1}]"}  
      text.gsub!(/\\[Gg]/){"\002"}  
      # c 获取 1 个字  
      if((c = text.slice!(/./m)) != nil)  
        # 选择项的情况  
=begin  
        if @dy >= $game_temp.choice_start  
          # 处理字的缩进  
          @dx = 8  
          # 描绘文字  
          self.contents.draw_text(4 + @dx, 32 * @dy, 40, 32, c)  
          # x 为要描绘文字宽度的加法运算  
          @dx += self.contents.text_size(c).width  
          # 循环  
          while ((c = text.slice!(/./m)) != "\n")  
            # 描绘文字  
            self.contents.draw_text(4 + @dx, 32 * @dy, 40, 32, c)  
            # x 为要描绘文字宽度的加法运算  
            @dx += self.contents.text_size(c).width  
          end  
          if c == "\n"  
            # 更新光标宽度  
            @cursor_width = [@cursor_width, @dx].max  
            # dy 累加 1  
            @dy += 1  
            @dx = 0  
          end  
          return  
        end  
=end  
        # \\ 的情况下  
        if c == "\000"  
          # 还原为本来的文字  
          c = "\\"  
        end  
        #\C[n] 的情况下  
        if c == "\001"  
          # 更改文字色  
          text.sub!(/
([0−9]+)
/, "")  
          color = $1.to_i  
          if color >= 0and color = 128 ? 32 : 384  
            end  
            @gold_window.opacity = self.opacity  
            @gold_window.back_opacity = self.back_opacity  
          end  
        end  
        # 另起一行文字的情况下  
        if c == "\n"  
          # dy 累加 1  
          @dy += 1  
          @dx = 0  
        end  
        # 描绘文字  
        # self.contents.font.size = FUKI::MES_FONT_SIZE  
        font_size = self.contents.font.size  
        if c == "\001"or c == "\002"or c == "\003"or c == "\n"  
         c = ""  
        else  
         self.contents.draw_text(4+@dx, (font_size+10)*@dy, font_size, font_size, c)  
        end  
        @dx += self.contents.text_size(c).width  
      end  
  end  
end  
#==============================================================================  
# ■ 自动弹框+地图BGM显示  
#     by viktor  
#------------------------------------------------------------------------------  
# Window_PopText 弹框窗口类 修改自地图名显示脚本 by Yuee  
#==============================================================================  
class Window_PopText < Window_Base  
  # 暂时屏蔽用的开关  
  SWITCH = 25  
  # 显示时间设置  
  SHOW_TIME_0 = 10  # 地图名出现前等待的帧数  
  SHOW_TIME_1 = 10  # 地图名从不可见变成可见的帧数  
  SHOW_TIME_2 = 140  # 地图名完全可见的帧数  
  SHOW_TIME_3 = 26  # 地图名从可见变成不可见的帧数  
  # 完全可见时的透明度设置  
  OPACITY_1 = 130   # 边框  
  OPACITY_2 = 130   # 背景  
  OPACITY_3 = 255   # 文字  
  # 地图名字的颜色  
  TEXT_COLOR = Color.new(240, 240, 240, 240)  
  attr_accessor :fsize  
  attr_reader :alive  
  def initialize(x, y, width, height)  
    super(x, y, width, height)  
    # 初始化窗口透明度  
    self.opacity = 0  
    self.back_opacity = 0  
    self.contents_opacity = 0  
    self.contents = Bitmap.new(width - 32, height - 32)  
    @fsize=32  
    # 剩余帧数初始化  
    @show_time = 0  
    @text=nil  
    @display_time = SHOW_TIME_0 + SHOW_TIME_1 + SHOW_TIME_2 + SHOW_TIME_3  
  end  
  def bottom  
    returnself.y+self.height  
  end  
  def scale_time(x)  
    @show_time *=x  
  end  
  include FUKImini  
  def set_text(text)  
    # 设置显示时间  
    # 插入文字  
    if text!=nil      
      @text=text  
      @alive=true  
      @show_time=@display_time  
    end  
    @dx=@dy=0  
  end  
  def update  
    # 开关判断  
    #return if !$game_switches[SWITCH]  
    #p "here"  
    super  
    returnif !@alive  
    time=@display_time  
    # 剩余帧数为0时消失  
     if@show_time < 1  
        @alive=false  
        self.opacity = 0  
        self.back_opacity = 0  
        self.contents_opacity = 0  
        @show_time=0  
        return  
     end  
    # 主处理  
    #self.contents.clear  
    #self.contents.font.color = TEXT_COLOR  
    # 描绘  
    yy=0  
    self.contents.font.size=fsize  
    self.contents.font.name="Arial"  
    #@text.each{|line|  
    #  self.contents.draw_text(4, yy , width - 40, fsize, line, 1)  
    #  yy+=fsize+4  
    #}  
    # viktor: 调用fuki的打字函数  
    draw_message(@text)  
    # 根本帧数设定窗口透明度  
    if@show_time > (SHOW_TIME_2 + SHOW_TIME_3)  
      self.opacity = @show_time < time ? (((OPACITY_1 / SHOW_TIME_1) * (time - @show_time)).to_i) : 0  
      self.back_opacity = @show_time < time ? (((OPACITY_2 / SHOW_TIME_1 )* (time - @show_time)).to_i) : 0  
      self.contents_opacity = @show_time < time ? (((OPACITY_3 / SHOW_TIME_1) * (time - @show_time)).to_i) : 0  
    else  
      self.opacity = @show_time < (SHOW_TIME_3 / 16 * 14) ? ((OPACITY_1 / SHOW_TIME_3) * @show_time).to_i : OPACITY_1  
      self.back_opacity = @show_time < (SHOW_TIME_3 / 16 * 9) ? ((OPACITY_2 / SHOW_TIME_3) * @show_time).to_i : OPACITY_2  
      self.contents_opacity = @show_time < SHOW_TIME_3 ? ((OPACITY_3 / SHOW_TIME_3)* @show_time).to_i : OPACITY_3  
    end        
    @show_time -= 1  
  end  
end  
#------------------------------------  
# Windowset_PopText  
# 管理弹出窗口的窗口组。当前显示的窗口在window中,等待队列的窗口在window_queue中  
#------------------------------------  
class Windowset_PopText  
  def initialize  
    @window=[]  
    @window_queue=[]  
  end  
  def add_window(text, mode="later", x=-1, y=-1)  
      # 计算文字行数和长度  
      len=0; nline=0  
      text.each{|line|  
        nline+=1  
        len=[len, line.size].max  
      }  
      nline=[nline, 1].max  
      # 字体大小  
      fsize=[[140/nline-4, 9].max, 24].min  
      # 窗口大小  
      h=[(fsize+4)*nline+28, 140].min  
      w=[[fsize*(len/2+4), 140].max, $height].min  
      # 窗口位置  
      if x+y