查看: 4413|回复: 3

[交流讨论] [VX改VA脚本] 多个对话框同时显示

[复制链接]
梦石
0
星屑
650
在线时间
67 小时
注册时间
2017-7-25
回帖
1
发表于 2020-2-26 11:31:28 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 辰落九缈 于 2020-2-27 20:15 编辑

        有时候想表现人物同时说话的氛围,奈何对话框只能显示一个。我去论坛里逛了逛,发现都是花里胡哨的对话框加强,自己写又有各种bug(还是对ruby不熟悉),后来找到了一个VX脚本,发现作者的逻辑十分简洁,就改编成了VA脚本。
        VX脚本来源:https://lm-t.at.webry.info/200909/article_2.html
        作者的想法是在Window_Message类下增加子窗口,通过主窗口的更新一并更新所有子窗口,主窗口消亡则子窗口一并消亡。改成VA脚本后要注意的点就是Fiber,VA通过Fiber切换执行不同的代码。
        当所有窗口显示完文章,等待用户输入时,主窗口要判断用户是否输入确定键或退出键,如果用户没有输入就让出Fiber,如果用户进行相应的输入就往下执行,并且调用结束子窗口停顿的函数。子窗口停顿时,等待主窗口调用结束停顿的函数,如果主窗口没有调用就让出Fiber。
        这里只贴出核心代码:

脚本内容
  1. #==============================================================================
  2. # ■ Ex
  3. #------------------------------------------------------------------------------
  4. # VX Script Author: J-SON
  5. # blog: https://lm-t.at.webry.info/200909/article_2.html
  6. #
  7. # ●功能
  8. #   ◆设置子对话框
  9. #   Ex.submessage( idx, msg, fname, fidx, bktype, msgpos )
  10. #
  11. #==============================================================================

  12. module Ex
  13.   #--------------------------------------------------------------------------
  14.   # ● 常量
  15.   #--------------------------------------------------------------------------
  16.   #对话框背景
  17.   MSGBK_NORMAL = 0  #普通
  18.   MSGBK_DARK = 1    #暗色背景
  19.   MSGBK_NONE = 2    #透明背景
  20.   
  21.   #对话框位置
  22.   MSGPOS_TOP = 0     #上
  23.   MSGPOS_CENTER = 1  #中
  24.   MSGPOS_BOTTOM = 2  #下
  25.   
  26.   #--------------------------------------------------------------------------
  27.   # ● 子消息设置
  28.   #     index   : 子消息id(0 or 1)
  29.   #     message : 子消息文章内容
  30.   #     fname   : 脸图文件名
  31.   #     findex  : 脸图id
  32.   #     bktype  : 对话框背景类型(0, 1, 2)
  33.   #     msgpos  : 对话框位置
  34.   #--------------------------------------------------------------------------
  35.   def self.submessage(
  36.     index,
  37.     message = [],
  38.     fname = "",
  39.     findex = 0,
  40.     bktype = MSGBK_NORMAL,
  41.     msgpos = MSGPOS_BOTTOM
  42.   )
  43.     return if index < 0 or index > 1
  44.     submsg = $game_sub_messages[index]
  45.     submsg.clear
  46.     submsg.texts = message
  47.     submsg.face_name = fname
  48.     submsg.face_index = findex
  49.     submsg.background = bktype
  50.     submsg.position = msgpos
  51.   end
  52. end

  53. class Window_Message < Window_Base
  54.   #--------------------------------------------------------------------------
  55.   # ● 初始化对象
  56.   #--------------------------------------------------------------------------
  57.   def initialize(game_message = nil, main_window = true)
  58.     super(0, 0, window_width, window_height)
  59.     self.z = 200
  60.     self.openness = 0
  61.     create_all_windows
  62.     create_back_bitmap
  63.     create_back_sprite
  64.     clear_instance_variables
  65.    
  66.     # ADD --------->
  67.     @game_message = (game_message == nil ? $game_message : game_message)
  68.     @main_window = main_window
  69.    
  70.     @sub_windows = [ nil, nil ]
  71.     if @main_window == true
  72.       @sub_windows[0] = Window_Message.new($game_sub_messages[0], false)
  73.       @sub_windows[1] = Window_Message.new($game_sub_messages[1], false)
  74.     end
  75.     #<--------------
  76.   end
  77.   #--------------------------------------------------------------------------
  78.   # ● 更新画面
  79.   #--------------------------------------------------------------------------
  80.   def update
  81.     super
  82.     update_all_windows
  83.     # ADD --------->
  84.     update_sub_windows
  85.     #<--------------
  86.     update_back_sprite
  87.     update_fiber
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 更新子窗口
  91.   #--------------------------------------------------------------------------
  92.   def update_sub_windows
  93.     if @main_window == true
  94.       for i in 0..1
  95.         @sub_windows[i].update if @sub_windows[i] != nil
  96.       end
  97.     end
  98.   end

  99. ... ... ... ... ... ...

  100.   #--------------------------------------------------------------------------
  101.   # ● 处理输入等待
  102.   #--------------------------------------------------------------------------
  103.   def input_pause
  104.     self.pause = true
  105.     wait(10)
  106.     if @main_window == true
  107.       Fiber.yield until Input.trigger?(:B) || Input.trigger?(:C)
  108.       Input.update
  109.       finish_pause
  110.     else
  111.       Fiber.yield while self.pause
  112.     end
  113.   end
  114.   #--------------------------------------------------------------------------
  115.   # ● 等待结束
  116.   #--------------------------------------------------------------------------
  117.   def finish_pause
  118.     self.pause = false
  119.     if @main_window == true
  120.       for i in 0..1
  121.         @sub_windows[i].finish_pause if @sub_windows[i] != nil
  122.       end
  123.     end
  124.   end

  125. end
复制代码

        
用法:
        如果要显示多个对话框,每次在显示文章前,启用“脚本”功能,写入以下内容。
        Ex.submessage( idx, msg, fname, fidx, bktype, msgpos )
        #参数说明
        #idx:子消息id号(0或者1)
        #msg:["第一行文章内容", "第二行", ...]
        #fname:脸图文件名
        #fidx:文件中脸图id号
        #bktype:背景类型(普通:0,暗色背景:1,透明背景:2)
        #msgpos:对话框位置(上:0,中:1,下:2)

        使用样例:

         图片1.png
         图片2.png
        
        完整项目: HelloWorld.rar (1.42 MB, 下载次数: 120)

评分

参与人数 1赞 +1 收起 理由
hyrious + 1 精品文章

查看全部评分

老鹰

梦石
40
星屑
37812
在线时间
7091 小时
注册时间
2012-5-26
回帖
3297

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

发表于 2020-2-26 12:38:16 | 显示全部楼层
本帖最后由 百里_飞柳 于 2020-2-26 12:39 编辑

如此脚本方式的对话框设置,总觉得会直接劝退很多想尝试的人

毕竟我自己的对话框只是扩展了转义符,就很多人根本搞不懂了
回复

使用道具 举报

梦石
0
星屑
650
在线时间
67 小时
注册时间
2017-7-25
回帖
1
 楼主| 发表于 2020-2-26 13:44:49 | 显示全部楼层
百里_飞柳 发表于 2020-2-26 12:38
如此脚本方式的对话框设置,总觉得会直接劝退很多想尝试的人

毕竟我自己的对话框只是扩展了转义符,就很多 ...

是的,没有很强烈的需求的话大家都尽量避免用脚本设置,尤其是带有这种代码形式的
只是以后如果有人有这种实现想法的话,也算多一份参考吧
回复

使用道具 举报

梦石
0
星屑
103
在线时间
7 小时
注册时间
2020-1-28
回帖
7
发表于 2020-2-26 15:29:54 | 显示全部楼层
围观一下,可能以后会用到,留着备用。
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部