#==============================================================================
# ■ 自动弹框+地图BGM显示
# 修改自地图名显示脚本 by Yuee
# 原脚本取自66RPG [url]http://rpg.blue[/url]
#------------------------------------------------------------------------------
# 功能:提供一组自动设置大小的弹出式提示框
# 可以在所有的Scene里弹出显示文字
# 一段时间后自动消失
# 用法:
# 事件或脚本中直接调用以下代码
# $scene.popup(text, mode, x, y)
#
# 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] }
end until 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 >= 0 and color <= 7
self.contents.font.color = text_color(color)
end
end
# \G 的情况下
if c == "\002"
# 生成金钱窗口
if @gold_window == nil
@gold_window = Window_Gold.new
@gold_window.x = 560 - @gold_window.width
if $game_temp.in_battle
@gold_window.y = 192
else
@gold_window.y = self.y >= 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
return self.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
return if !@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<0 # 没有指定位置的情况下
#自动决定位置
new_x=[($width-w)/2, 20].max
new_y = @window[-1].bottom rescue 96
else
new_x=x; new_y=y
end
# 初始化窗口
wtext=Window_PopText.new(new_x, new_y, w, h)
wtext.fsize=fsize;
wtext.set_text(text)
# 插入显示队列
if mode == "later"
@window_queue.push(wtext)
else
wtext.scale_time(@window.size.to_f*0.3+1)
@window.push(wtext)
end
end
def update
if @window.size == 0
tmp = @window_queue.shift
@window.push(tmp) if tmp!=nil
end
@window.each{|w|
w.update
@window.delete(w) if !w.alive
}
end
def dispose
(@window + @window_queue).each{|w|w.dispose if w!=nil}
end
end
#---------------------------------------
# 接入部分 (@晴兰:原来这样就可以接入所有的Scene了!)
#---------------------------------------
# 因为标题菜单没有game_temp所以干脆弄成全局变量
# 后果是所有的Scene必须更新这货
$windowset_popup = Windowset_PopText.new
ObjectSpace.each_object(Class){|klass| klass.class_eval{
alias viktor_smt_update update rescue 0
def update
$windowset_popup.update
viktor_smt_update
end
def popup(text, mode="later", x=-1, y=-1)
$windowset_popup.add_window(text, mode, x, y)
end
} if klass.to_s["Scene"]!=nil}
#-----------------------------------------------
# 附带:BGM显示。就作为PopText的一个样例吧www
#-----------------------------------------------
class Game_System
def bgm_play(bgm)
@playing_bgm = bgm
$scene.popup("【♫ BGM ♪♪】" +$game_system.playing_bgm.name,
"later", 0, 0) rescue 0
if bgm != nil and bgm.name != "" and @bgm_sw
Audio.bgm_play("Audio/BGM/" + bgm.name, bgm.volume*@bgm_v/DS<100 ? bgm.volume*@bgm_v/DS : 100, bgm.pitch)
else
Audio.bgm_stop
end
Graphics.frame_reset
end
end