#============================================================================== # ■ 自动弹框+地图BGM显示 # 修改自地图名显示脚本 by Yuee # 原脚本取自66RPG [url]http://rpg.blue[/url] #------------------------------------------------------------------------------ # 功能:提供一组自动设置大小的弹出式提示框 # 可以在所有的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] } 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
a.png (1.26 MB, 下载次数: 34)
b.png (1.35 MB, 下载次数: 31)
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |