查看: 3093|回复: 2

[已经解决] 【已解决】求指教,显示窗口不能及时消除(附带范例)

[复制链接]
梦石
10
星屑
9514
在线时间
1291 小时
注册时间
2014-11-2
回帖
30

开拓者

发表于 2021-1-25 23:19:03 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 迷你及其人 于 2021-1-26 16:02 编辑

小弟我想实现一个提示气泡的功能,但没找到现成的脚本。

我找了一个类似的脚本:https://rpg.blue/thread-477446-1-1.html

按照@芯☆淡茹水  大侠的这个脚本,我依葫芦画瓢写了我想要的功能。可是产生的提示窗口却不能及时消失,会堆积在一起。我是个脚本菜鸟,不知道问题在哪里,希望有大侠能看看。

脚本
  1. =begin

  2. by 迷你及其人

  3. 说明:游戏中,玩家扮演的“推演程序”拥有轻松获取大量情报的能力,表现为游戏画面中
  4.       弹出的信息气泡。

  5. 思路:1.用哈希表存放所有提示信息。
  6.       2.用一个数组存放所有气泡窗口,并定义对该数组的显示和消除的方法。
  7.       3.定义一种气泡窗口,以及它的刷新方法等。

  8. 使用方法:在事件脚本中输入 show_msg_bubble(x)    x代表要输出的文本编号。
  9.                       输入 delete_msg_bubble(x)  x代表要消除的文本编号。
  10.       
  11. =end
  12. #==============================================================================
  13. module MNJQR_MsgBubble_Set
  14.   #--------------------------------------------------------------------------
  15.   # ● 存放文本
  16.   #--------------------------------------------------------------------------
  17.   Helping_type1 = {
  18.     1 => "测试,这是第一条信息。测试极限长度。" , #该规格下最长文字
  19.     2 => "同样的,这是第二条。",
  20.     3 => "她耍了花招。硬币其实在她的手里。",
  21.     4 => "他这句话有一半是假的。",
  22.     5 => "能感受到他散发出的魔法力量。"
  23.   }
  24. end
  25. #==============================================================================
  26. class Game_System
  27.   attr_accessor :additive_bubble, :deleted_bubble
  28.   #--------------------------------------------------------------------------
  29.   # ● 初始化
  30.   #--------------------------------------------------------------------------
  31.   alias msg_bubble_initialize initialize
  32.   def initialize
  33.     msg_bubble_initialize
  34.     setup_initial_bubble
  35.   end
  36.   #--------------------------------------------------------------------------
  37.   # ● 初始化信息气泡窗口组
  38.   #--------------------------------------------------------------------------
  39.   def setup_initial_bubble
  40.     @msg_bubble = []
  41.     @additive_bubble = nil
  42.   end
  43.   #--------------------------------------------------------------------------
  44.   # ● 不知道干啥用的,反正不能删
  45.   #--------------------------------------------------------------------------
  46.   def map_msg_bubble
  47.     return @msg_bubble.map{|d| d.id == id }
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # ● 获取气泡
  51.   #--------------------------------------------------------------------------
  52.   def get_msg_bubble(id)
  53.     return @msg_bubble.find{|d| d.id == id }
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 判断气泡是否存在
  57.   #--------------------------------------------------------------------------
  58.   def has_msg_bubble(id)
  59.     return @msg_bubble.any?{|d| d.id == id }
  60.   end
  61.   #--------------------------------------------------------------------------
  62.   # ● 显示指令
  63.   #--------------------------------------------------------------------------
  64.   def show_msg_bubble(id)
  65.     return if has_msg_bubble(id) || id == 0
  66.     @msg_bubble.push(Window_MsgBubble.new(id))
  67.     @additive_bubble = id
  68.   end
  69.   #--------------------------------------------------------------------------
  70.   # ● 消除指令
  71.   #--------------------------------------------------------------------------
  72.   def delete_msg_bubble(id)
  73.     return if !has_msg_bubble(id)
  74.      window = get_msg_bubble(id)
  75.     @msg_bubble.delete(window)
  76.     window.dispose
  77.     @deleted_bubble = id
  78.   end
  79. end
  80. #==============================================================================
  81. class Game_Interpreter
  82.   #--------------------------------------------------------------------------
  83.   # ● 唤出气泡
  84.   #--------------------------------------------------------------------------
  85.   def show_msg_bubble(id)
  86.     $game_system.show_msg_bubble(id)
  87.   end
  88.   #--------------------------------------------------------------------------
  89.   # ● 消除气泡
  90.   #--------------------------------------------------------------------------
  91.   def delete_msg_bubble(id)
  92.     $game_system.delete_msg_bubble(id)
  93.   end
  94. end
  95. #==============================================================================
  96. class Window_MsgBubble < Window_Base
  97.   attr_reader :id
  98.   #--------------------------------------------------------------------------
  99.   # ● 初始化对象
  100.   #--------------------------------------------------------------------------
  101.   def initialize(id)
  102.     @id = id
  103.     super(50, 30, 480, fitting_height(2))
  104.     self.opacity = 0
  105.     self.contents_opacity = 255
  106.     self.z = 999
  107.     update
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # ● 更新画面
  111.   #--------------------------------------------------------------------------
  112.   def update
  113.     refresh
  114.   end
  115.   #--------------------------------------------------------------------------
  116.   # ● 刷新
  117.   #--------------------------------------------------------------------------
  118.   def refresh
  119.     contents.clear
  120.     self.opacity = $game_variables[1]
  121.     draw_msg_text(id)
  122.   end
  123.   #--------------------------------------------------------------------------
  124.   # ● 绘制文字
  125.   #--------------------------------------------------------------------------
  126.   def draw_msg_text(id)
  127.     draw_text(contents.rect, MNJQR_MsgBubble_Set::Helping_type1[id], 0)
  128.   end
  129. end
  130. #==============================================================================
  131. class Scene_Map < Scene_Base
  132.   #--------------------------------------------------------------------------
  133.   # ● 生成信息气泡窗口
  134.   #--------------------------------------------------------------------------
  135.   def create_msg_bubble_window(id)
  136.     $game_system.additive_bubble = nil
  137.     window_id = "@msg_bubble_window#{id}"
  138.     data = $game_system.get_msg_bubble(id)
  139.     window = instance_variable_get(window_id)
  140.     return if !!window && !window.disposed? || !data
  141.     instance_variable_set(window_id, Window_MsgBubble.new(data))
  142.   end
  143.   #--------------------------------------------------------------------------
  144.   # ● 消除信息气泡窗口
  145.   #--------------------------------------------------------------------------
  146.   def dispose_msg_bubble_window(id)
  147.     $game_system.deleted_bubble = nil
  148.     window_id = "@msg_bubble_window#{id}"
  149.     return if !instance_variable_get(window_id)
  150.     instance_variable_get(window_id).dispose
  151.     instance_variable_set(window_id, nil)
  152.   end
  153.   #--------------------------------------------------------------------------
  154.   # ● 生成所有窗口
  155.   #--------------------------------------------------------------------------
  156.   alias msg_bubble_create_all_windows create_all_windows
  157.   def create_all_windows  
  158.     msg_bubble_create_all_windows
  159.     $game_system.map_msg_bubble.each{|id| create_msg_bubble_window(id) }
  160.   end
  161.   #--------------------------------------------------------------------------
  162.   # ● 更新画面
  163.   #--------------------------------------------------------------------------
  164.   alias msg_bubble_update update
  165.   def update
  166.     msg_bubble_update
  167.     update_msg_bubble
  168.   end
  169.   #--------------------------------------------------------------------------
  170.   # ● 更新信息气泡窗口
  171.   #--------------------------------------------------------------------------
  172.   def update_msg_bubble
  173.     $game_system.additive_bubble && create_msg_bubble_window($game_system.additive_bubble)
  174.     $game_system.deleted_bubble  && dispose_msg_bubble_window($game_system.deleted_bubble)
  175.   end
  176. end
复制代码


脚本贴出来了,然后这是范例:

我的描述可能不太清楚,具体请下载范例,里面说的比较清楚。谢谢各位啦~~

Test1.rar

1.4 MB, 下载次数: 79

迷你型机器人,bibibibibi~~

老鹰

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

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

发表于 2021-1-26 10:42:25 | 显示全部楼层
用数组可还行,既然你这里都是按序号的预设对话,推荐改成 Hash 表,方便很多

@msg_bubble = {}
新增时可以直接 @msg_bubble[3] = window,然后实际存储的就是 { 3 => window },既保证了id的唯一性,又方便索引使用,调用时直接 @msg_bubble[3] 就可以获得这个对应的 window

关于窗口未被消除,是因为window需要额外的手动dispose,光从数组中删去是不够的
在78行处,改成
  1. window = get_msg_bubble(id)
  2. @msg_bubble.delete(window)
  3. window.dispose
复制代码

点评

原来是这个原因,学到了!谢谢老鹰大大,问题解决了~~  发表于 2021-1-26 16:01

评分

参与人数 1星屑 +150 收起 理由
VIPArcher + 150 认可答案

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部