设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3058|回复: 2
打印 上一主题 下一主题

[原创发布] RPGMaker XP脚本 【泛用画面弹框 BGM显示】

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
207 小时
注册时间
2014-8-16
帖子
132
跳转到指定楼层
1
发表于 2015-4-24 21:17:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 a107480098 于 2015-4-24 21:25 编辑

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


RUBY 代码复制
  1. #==============================================================================  
  2. # ■ 自动弹框+地图BGM显示   
  3. # 修改自地图名显示脚本 by Yuee  
  4. # 原脚本取自66RPG [url]http://rpg.blue[/url]  
  5. #------------------------------------------------------------------------------  
  6. # 功能:提供一组自动设置大小的弹出式提示框  
  7. # 可以在所有的Scene里弹出显示文字  
  8. # 一段时间后自动消失  
  9. # 用法:  
  10. # 事件或脚本中直接调用以下代码  
  11. # $scene.popup(text, mode, x, y)  
  12. #  
  13. # text:要使用的文字。可以使用FUKI的转义法,和多行文字。例如:"新任务: \\c[6]"[email protected]  
  14. # mode:模式字符串  
  15. #       later:在前面的弹框显示完之后再显示  
  16. #       其他任意:马上显示  
  17. # x,y :位置  
  18. #       不指定位置:窗口会自动放在屏幕上中且不会遮挡其他自动窗口  
  19. #       指定位置:窗口会放在指定位置,会和同一位置其他窗口重合  
  20. # 样例:  
  21. #       在屏幕中心显示任务信息:  $scene.popup("任务情报更新了: \\c[6]"+@missions[name].name_b, "now")  
  22. #       在屏幕左上方显示BGM名称: $scene.popup("♫BGM: " +$game_system.playing_bgm.name, "later", 0, 0)  
  23.  
  24. # ps:如果想关闭显示,可以打开SWITCH指定的公共开关(默认#25)  
  25. #==============================================================================  
  26. module FUKImini  
  27.   #--------------------------------------------------------------------------  
  28.   # ○ 描绘信息处理 in FUKI  
  29.   #--------------------------------------------------------------------------  
  30.   def draw_message(msg)  
  31.       text=msg  
  32.       # 限制文字处理  
  33.       begin  
  34.         last_text = text.clone  
  35.         text.gsub!(/\
  36. Vv]\[([09]+)
  37. /) { $game_variables[$1.to_i] }  
  38.       end until text == last_text  
  39.       text.gsub!(/\
  40. Nn]\[([09]+)
  41. /) do  
  42.         $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""  
  43.       end  
  44.       # 为了方便、将 "\\\\" 变换为 "\000"   
  45.       text.gsub!(/\\\\/) { "\000" }  
  46.       # "\\C" 变为 "\001"、"\\G" 变为 "\002"  
  47.       text.gsub!(/\
  48. Cc]\[([09]+)
  49. /) { "\001[#{$1}]" }  
  50.       text.gsub!(/\\[Gg]/) { "\002" }  
  51.       # c 获取 1 个字  
  52.       if ((c = text.slice!(/./m)) != nil)  
  53.         # 选择项的情况  
  54. =begin  
  55.         if @dy >= $game_temp.choice_start  
  56.           # 处理字的缩进  
  57.           @dx = 8  
  58.           # 描绘文字  
  59.           self.contents.draw_text(4 + @dx, 32 * @dy, 40, 32, c)  
  60.           # x 为要描绘文字宽度的加法运算  
  61.           @dx += self.contents.text_size(c).width  
  62.           # 循环  
  63.           while ((c = text.slice!(/./m)) != "\n")  
  64.             # 描绘文字  
  65.             self.contents.draw_text(4 + @dx, 32 * @dy, 40, 32, c)  
  66.             # x 为要描绘文字宽度的加法运算  
  67.             @dx += self.contents.text_size(c).width  
  68.           end  
  69.           if c == "\n"  
  70.             # 更新光标宽度  
  71.             @cursor_width = [@cursor_width, @dx].max  
  72.             # dy 累加 1  
  73.             @dy += 1  
  74.             @dx = 0  
  75.           end  
  76.           return  
  77.         end  
  78. =end  
  79.         # \\ 的情况下  
  80.         if c == "\000"  
  81.           # 还原为本来的文字  
  82.           c = "\\"  
  83.         end  
  84.         #\C[n] 的情况下  
  85.         if c == "\001"  
  86.           # 更改文字色  
  87.           text.sub!(/
  88. ([09]+)
  89. /, "")  
  90.           color = $1.to_i  
  91.           if color >= 0 and color <= 7  
  92.             self.contents.font.color = text_color(color)  
  93.           end  
  94.         end  
  95.         # \G 的情况下  
  96.         if c == "\002"  
  97.           # 生成金钱窗口  
  98.           if @gold_window == nil  
  99.             @gold_window = Window_Gold.new  
  100.             @gold_window.x = 560 - @gold_window.width  
  101.             if $game_temp.in_battle  
  102.               @gold_window.y = 192  
  103.             else  
  104.               @gold_window.y = self.y >= 128 ? 32 : 384  
  105.             end  
  106.             @gold_window.opacity = self.opacity  
  107.             @gold_window.back_opacity = self.back_opacity  
  108.           end  
  109.         end  
  110.         # 另起一行文字的情况下  
  111.         if c == "\n"  
  112.           # dy 累加 1  
  113.           @dy += 1  
  114.           @dx = 0  
  115.         end  
  116.         # 描绘文字  
  117.         # self.contents.font.size = FUKI::MES_FONT_SIZE  
  118.         font_size = self.contents.font.size  
  119.         if c == "\001" or c == "\002" or c == "\003" or c == "\n"  
  120.          c = ""  
  121.         else  
  122.          self.contents.draw_text(4+@dx, (font_size+10)*@dy, font_size, font_size, c)  
  123.         end  
  124.  
  125.         @dx += self.contents.text_size(c).width  
  126.       end  
  127.   end  
  128. end  
  129.  
  130. #==============================================================================  
  131. # ■ 自动弹框+地图BGM显示  
  132. #     by viktor  
  133. #------------------------------------------------------------------------------  
  134. # Window_PopText 弹框窗口类 修改自地图名显示脚本 by Yuee  
  135. #==============================================================================  
  136. class Window_PopText < Window_Base  
  137.   # 暂时屏蔽用的开关  
  138.   SWITCH = 25  
  139.  
  140.   # 显示时间设置  
  141.   SHOW_TIME_0 = 10  # 地图名出现前等待的帧数  
  142.   SHOW_TIME_1 = 10  # 地图名从不可见变成可见的帧数  
  143.   SHOW_TIME_2 = 140  # 地图名完全可见的帧数  
  144.   SHOW_TIME_3 = 26  # 地图名从可见变成不可见的帧数  
  145.  
  146.   # 完全可见时的透明度设置  
  147.   OPACITY_1 = 130   # 边框  
  148.   OPACITY_2 = 130   # 背景  
  149.   OPACITY_3 = 255   # 文字  
  150.  
  151.   # 地图名字的颜色  
  152.   TEXT_COLOR = Color.new(240, 240, 240, 240)  
  153.  
  154.   attr_accessor :fsize  
  155.   attr_reader :alive  
  156.  
  157.   def initialize(x, y, width, height)  
  158.     super(x, y, width, height)  
  159.     # 初始化窗口透明度  
  160.     self.opacity = 0  
  161.     self.back_opacity = 0  
  162.     self.contents_opacity = 0  
  163.     self.contents = Bitmap.new(width - 32, height - 32)  
  164.     @fsize=32  
  165.     # 剩余帧数初始化  
  166.     @show_time = 0  
  167.     @text=nil  
  168.     @display_time = SHOW_TIME_0 + SHOW_TIME_1 + SHOW_TIME_2 + SHOW_TIME_3  
  169.   end  
  170.  
  171.   def bottom  
  172.     return self.y+self.height  
  173.   end  
  174.  
  175.   def scale_time(x)  
  176.     @show_time *=x  
  177.   end  
  178.  
  179.   include FUKImini  
  180.  
  181.   def set_text(text)  
  182.     # 设置显示时间  
  183.     # 插入文字  
  184.     if text!=nil      
  185.       @text=text  
  186.       @alive=true  
  187.       @show_time=@display_time  
  188.     end  
  189.     @dx=@dy=0  
  190.   end  
  191.  
  192.   def update  
  193.     # 开关判断  
  194.     #return if !$game_switches[SWITCH]  
  195.     #p "here"  
  196.     super  
  197.     return if !@alive  
  198.     time=@display_time  
  199.     # 剩余帧数为0时消失  
  200.      if @show_time < 1  
  201.         @alive=false  
  202.         self.opacity = 0  
  203.         self.back_opacity = 0  
  204.         self.contents_opacity = 0  
  205.         @show_time=0  
  206.         return  
  207.      end  
  208.     # 主处理  
  209.     #self.contents.clear  
  210.     #self.contents.font.color = TEXT_COLOR  
  211.     # 描绘  
  212.     yy=0  
  213.     self.contents.font.size=fsize  
  214.     self.contents.font.name="Arial"  
  215.     #@text.each{|line|  
  216.     #  self.contents.draw_text(4, yy , width - 40, fsize, line, 1)  
  217.     #  yy+=fsize+4  
  218.     #}  
  219.     # viktor: 调用fuki的打字函数  
  220.     draw_message(@text)  
  221.     # 根本帧数设定窗口透明度  
  222.     if @show_time > (SHOW_TIME_2 + SHOW_TIME_3)  
  223.       self.opacity = @show_time < time ? (((OPACITY_1 / SHOW_TIME_1) * (time - @show_time)).to_i) : 0  
  224.       self.back_opacity = @show_time < time ? (((OPACITY_2 / SHOW_TIME_1 )* (time - @show_time)).to_i) : 0  
  225.       self.contents_opacity = @show_time < time ? (((OPACITY_3 / SHOW_TIME_1) * (time - @show_time)).to_i) : 0  
  226.     else  
  227.       self.opacity = @show_time < (SHOW_TIME_3 / 16 * 14) ? ((OPACITY_1 / SHOW_TIME_3) * @show_time).to_i : OPACITY_1  
  228.       self.back_opacity = @show_time < (SHOW_TIME_3 / 16 * 9) ? ((OPACITY_2 / SHOW_TIME_3) * @show_time).to_i : OPACITY_2  
  229.       self.contents_opacity = @show_time < SHOW_TIME_3 ? ((OPACITY_3 / SHOW_TIME_3)* @show_time).to_i : OPACITY_3  
  230.     end        
  231.     @show_time -= 1  
  232.  
  233.   end  
  234. end  
  235.  
  236. #------------------------------------  
  237. # Windowset_PopText  
  238. # 管理弹出窗口的窗口组。当前显示的窗口在window中,等待队列的窗口在window_queue中  
  239. #------------------------------------  
  240. class Windowset_PopText  
  241.   def initialize  
  242.     @window=[]  
  243.     @window_queue=[]  
  244.   end  
  245.  
  246.   def add_window(text, mode="later", x=-1, y=-1)  
  247.       # 计算文字行数和长度  
  248.       len=0; nline=0  
  249.       text.each{|line|  
  250.         nline+=1  
  251.         len=[len, line.size].max  
  252.       }  
  253.       nline=[nline, 1].max  
  254.       # 字体大小  
  255.       fsize=[[140/nline-4, 9].max, 24].min  
  256.       # 窗口大小  
  257.       h=[(fsize+4)*nline+28, 140].min  
  258.       w=[[fsize*(len/2+4), 140].max, $height].min  
  259.       # 窗口位置  
  260.       if x+y<0  # 没有指定位置的情况下  
  261.         #自动决定位置  
  262.         new_x=[($width-w)/2, 20].max  
  263.         new_y = @window[-1].bottom rescue 96  
  264.       else  
  265.         new_x=x; new_y=y  
  266.       end        
  267.       # 初始化窗口  
  268.       wtext=Window_PopText.new(new_x, new_y, w, h)  
  269.       wtext.fsize=fsize;  
  270.       wtext.set_text(text)      
  271.  
  272.     # 插入显示队列  
  273.     if mode == "later"  
  274.       @window_queue.push(wtext)  
  275.     else  
  276.       wtext.scale_time(@window.size.to_f*0.3+1)  
  277.       @window.push(wtext)  
  278.     end  
  279.   end  
  280.  
  281.   def update  
  282.     if @window.size == 0  
  283.       tmp = @window_queue.shift  
  284.       @window.push(tmp) if tmp!=nil  
  285.     end  
  286.     @window.each{|w|  
  287.       w.update  
  288.       @window.delete(w) if !w.alive  
  289.     }  
  290.   end  
  291.  
  292.   def dispose  
  293.     (@window + @window_queue).each{|w|w.dispose if w!=nil}  
  294.   end  
  295.  
  296. end  
  297.  
  298. #---------------------------------------  
  299. # 接入部分 (@晴兰:原来这样就可以接入所有的Scene了!)  
  300. #---------------------------------------  
  301. # 因为标题菜单没有game_temp所以干脆弄成全局变量  
  302. # 后果是所有的Scene必须更新这货  
  303. $windowset_popup = Windowset_PopText.new  
  304.  
  305. ObjectSpace.each_object(Class){|klass| klass.class_eval{  
  306.   alias viktor_smt_update update rescue 0  
  307.   def update  
  308.     $windowset_popup.update  
  309.     viktor_smt_update  
  310.   end  
  311.  
  312.   def popup(text, mode="later", x=-1, y=-1)  
  313.     $windowset_popup.add_window(text, mode, x, y)  
  314.   end  
  315.  
  316. } if klass.to_s["Scene"]!=nil}  
  317.  
  318. #-----------------------------------------------  
  319. # 附带:BGM显示。就作为PopText的一个样例吧www  
  320. #-----------------------------------------------  
  321. class Game_System  
  322.   def bgm_play(bgm)  
  323.     @playing_bgm = bgm  
  324.  
  325.     $scene.popup("【♫ BGM ♪♪】" +$game_system.playing_bgm.name,  
  326.                  "later", 0, 0) rescue 0  
  327.  
  328.     if bgm != nil and bgm.name != "" and @bgm_sw  
  329.       Audio.bgm_play("Audio/BGM/" + bgm.name, bgm.volume*@bgm_v/DS<100 ? bgm.volume*@bgm_v/DS : 100, bgm.pitch)  
  330.     else  
  331.       Audio.bgm_stop  
  332.     end  
  333.     Graphics.frame_reset  
  334.   end  
  335. end
   

a.png (1.26 MB, 下载次数: 38)

a.png

b.png (1.35 MB, 下载次数: 33)

b.png

点评

根本就不会用。。。  发表于 2016-10-24 23:51

评分

参与人数 2星屑 +75 收起 理由
574656549 + 15 我很赞同
刺夜之枪 + 60 精品文章

查看全部评分

Lv1.梦旅人

梦石
0
星屑
65
在线时间
232 小时
注册时间
2014-8-1
帖子
144

开拓者

2
发表于 2015-4-25 06:00:58 | 只看该作者
好像很厉害的样子!搞个范例出来啊!XP的嘎嘎
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 08:13

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表