じ☆ve冰风 发表于 2024-4-19 23:03:49

RPGMaker XP脚本 【泛用画面弹框 BGM显示】

功能:
提供一组自动设置大小的弹出式提示框,可以在所有的Scene里弹出显示文字,一段时间后自动消失
附带:显示当前BGM名字的脚本
效果:左上角窗口。


RUBY 代码
#==============================================================================
# ■ 自动弹框+地图BGM显示   
# 修改自地图名显示脚本 by Yuee
# 原脚本取自66RPG http://rpg.blue
#------------------------------------------------------------------------------
# 功能:提供一组自动设置大小的弹出式提示框
# 可以在所有的Scene里弹出显示文字
# 一段时间后自动消失
# 用法:
# 事件或脚本中直接调用以下代码
# $scene.popup(text, mode, x, y)
#
# text:要使用的文字。可以使用FUKI的转义法,和多行文字。例如:"新任务: \\c"
# mode:模式字符串
#       later:在前面的弹框显示完之后再显示
#       其他任意:马上显示
# x,y :位置
#       不指定位置:窗口会自动放在屏幕上中且不会遮挡其他自动窗口
#       指定位置:窗口会放在指定位置,会和同一位置其他窗口重合
# 样例:
#       在屏幕中心显示任务信息:$scene.popup("任务情报更新了: \\c"+@missions.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]\[(+)
/){$game_variables[$1.to_i]}
      enduntil text == last_text
      text.gsub!(/\
Nn]\[(+)
/)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]\[(+)
/){"\001[#{$1}]"}
      text.gsub!(/\\/){"\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 的情况下
      if c == "\001"
          # 更改文字色
          text.sub!(/
(+)
/, "")
          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
    #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=.max
      }
      nline=.max
      # 字体大小
      fsize=[.max, 24].min
      # 窗口大小
      h=[(fsize+4)*nline+28, 140].min
      w=[.max, $height].min
      # 窗口位置
      if x+y
页: [1]
查看完整版本: RPGMaker XP脚本 【泛用画面弹框 BGM显示】