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]