1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > RPGMaker XP脚本 【泛用画面弹框 BGM显示】

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

时间:2022-07-12 01:51:14

相关推荐

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

original code by viktor:/xulai1001/article/details/7614621转载须保留此信息

功能:

提供一组自动设置大小的弹出式提示框,可以在所有的Scene里弹出显示文字,一段时间后自动消失

附带:显示当前BGM名字的脚本

效果:左上角窗口。

#==============================================================================# ■ 自动弹框+地图BGM显示# 作者:viktor# 修改自地图名显示脚本 by Yuee# 原脚本取自66RPG #------------------------------------------------------------------------------# 功能:提供一组自动设置大小的弹出式提示框# 可以在所有的Scene里弹出显示文字# 一段时间后自动消失# 用法:# 事件或脚本中直接调用以下代码# $scene.popup(text, mode, x, y)## text:要使用的文字。可以使用FUKI的转义法,和多行文字。例如:"新任务: \\c[6]"+@quest.name# 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# 限制文字处理beginlast_text = text.clonetext.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }end until text == last_texttext.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)# 选择项的情况=beginif @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).widthendif c == "\n"# 更新光标宽度@cursor_width = [@cursor_width, @dx].max# dy 累加 1@dy += 1@dx = 0endreturnend=end# \\ 的情况下if c == "\000"# 还原为本来的文字c = "\\"end#\C[n] 的情况下if c == "\001"# 更改文字色text.sub!(/\[([0-9]+)\]/, "")color = $1.to_iif color >= 0 and color <= 7self.contents.font.color = text_color(color)endend# \G 的情况下if c == "\002"# 生成金钱窗口if @gold_window == nil@gold_window = Window_Gold.new@gold_window.x = 560 - @gold_window.widthif $game_temp.in_battle@gold_window.y = 192else@gold_window.y = self.y >= 128 ? 32 : 384end@gold_window.opacity = self.opacity@gold_window.back_opacity = self.back_opacityendend# 另起一行文字的情况下if c == "\n"# dy 累加 1@dy += 1@dx = 0end# 描绘文字# self.contents.font.size = FUKI::MES_FONT_SIZEfont_size = self.contents.font.sizeif c == "\001" or c == "\002" or c == "\003" or c == "\n"c = ""elseself.contents.draw_text(4+@dx, (font_size+10)*@dy, font_size, font_size, c)end@dx += self.contents.text_size(c).widthendendend#==============================================================================# ■ 自动弹框+地图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 :fsizeattr_reader :alivedef initialize(x, y, width, height)super(x, y, width, height)# 初始化窗口透明度self.opacity = 0self.back_opacity = 0self.contents_opacity = 0self.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_3enddef bottomreturn self.y+self.heightenddef scale_time(x)@show_time *=xendinclude FUKIminidef set_text(text)# 设置显示时间# 插入文字if text!=nil @text=text@alive=true@show_time=@display_timeend@dx=@dy=0enddef update# 开关判断#return if !$game_switches[SWITCH]#p "here"superreturn if !@alivetime=@display_time# 剩余帧数为0时消失if @show_time < 1@alive=falseself.opacity = 0self.back_opacity = 0self.contents_opacity = 0@show_time=0returnend# 主处理#self.contents.clear#self.contents.font.color = TEXT_COLOR# 描绘yy=0self.contents.font.size=fsizeself.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) : 0self.back_opacity = @show_time < time ? (((OPACITY_2 / SHOW_TIME_1 )* (time - @show_time)).to_i) : 0self.contents_opacity = @show_time < time ? (((OPACITY_3 / SHOW_TIME_1) * (time - @show_time)).to_i) : 0elseself.opacity = @show_time < (SHOW_TIME_3 / 16 * 14) ? ((OPACITY_1 / SHOW_TIME_3) * @show_time).to_i : OPACITY_1self.back_opacity = @show_time < (SHOW_TIME_3 / 16 * 9) ? ((OPACITY_2 / SHOW_TIME_3) * @show_time).to_i : OPACITY_2self.contents_opacity = @show_time < SHOW_TIME_3 ? ((OPACITY_3 / SHOW_TIME_3)* @show_time).to_i : OPACITY_3end@show_time -= 1endend#------------------------------------# Windowset_PopText# 管理弹出窗口的窗口组。当前显示的窗口在window中,等待队列的窗口在window_queue中#------------------------------------class Windowset_PopTextdef initialize@window=[]@window_queue=[]enddef add_window(text, mode="later", x=-1, y=-1)# 计算文字行数和长度len=0; nline=0text.each{|line|nline+=1len=[len, line.size].max}nline=[nline, 1].max# 字体大小fsize=[[140/nline-4, 9].max, 24].min# 窗口大小h=[(fsize+4)*nline+28, 140].minw=[[fsize*(len/2+4), 140].max, $height].min# 窗口位置if x+y<0 # 没有指定位置的情况下#自动决定位置new_x=[($width-w)/2, 20].maxnew_y = @window[-1].bottom rescue 96elsenew_x=x; new_y=yend# 初始化窗口wtext=Window_PopText.new(new_x, new_y, w, h)wtext.fsize=fsize;wtext.set_text(text) # 插入显示队列if mode == "later"@window_queue.push(wtext)elsewtext.scale_time(@window.size.to_f*0.3+1)@window.push(wtext)endenddef updateif @window.size == 0tmp = @window_queue.shift@window.push(tmp) if tmp!=nilend@window.each{|w|w.update@window.delete(w) if !w.alive}enddef dispose(@window + @window_queue).each{|w|w.dispose if w!=nil}endend#---------------------------------------# 接入部分 (@晴兰:原来这样就可以接入所有的Scene了!)#---------------------------------------# 因为标题菜单没有game_temp所以干脆弄成全局变量# 后果是所有的Scene必须更新这货$windowset_popup = Windowset_PopText.newObjectSpace.each_object(Class){|klass| klass.class_eval{alias viktor_smt_update update rescue 0def update$windowset_popup.updateviktor_smt_updateenddef 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_Systemdef bgm_play(bgm)@playing_bgm = bgm$scene.popup("【♫ BGM ♪♪】" +$game_system.playing_bgm.name,"later", 0, 0) rescue 0if bgm != nil and bgm.name != "" and @bgm_swAudio.bgm_play("Audio/BGM/" + bgm.name, bgm.volume*@bgm_v/DS<100 ? bgm.volume*@bgm_v/DS : 100, bgm.pitch)elseAudio.bgm_stopendGraphics.frame_resetendend

自带了一个袖珍的FUKI,可以显示简单的带颜色文字。

接入部分因为利用了ObjectSpace所以写的很简略了。

TODO:设定显示时间 这个可以很容易的写出来,尽管现在是写死的

好像还有几个Dispose没写,不知道资源释放上会不会有问题?

可以很方便的让指定位置的窗口也能自动摆放。只要把指定的xy与当前显示的xy比较一下就行了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。