Project1
标题:
【已解决】求指教,显示窗口不能及时消除(附带范例)
[打印本页]
作者:
迷你及其人
时间:
2021-1-25 23:19
标题:
【已解决】求指教,显示窗口不能及时消除(附带范例)
本帖最后由 迷你及其人 于 2021-1-26 16:02 编辑
小弟我想实现一个提示气泡的功能,但没找到现成的脚本。
我找了一个类似的脚本:
https://rpg.blue/thread-477446-1-1.html
按照
@芯☆淡茹水
大侠的这个脚本,我依葫芦画瓢写了我想要的功能。可是产生的提示窗口却不能及时消失,会堆积在一起。我是个脚本菜鸟,不知道问题在哪里,希望有大侠能看看。
[fold=脚本]
=begin
by 迷你及其人
说明:游戏中,玩家扮演的“推演程序”拥有轻松获取大量情报的能力,表现为游戏画面中
弹出的信息气泡。
思路:1.用哈希表存放所有提示信息。
2.用一个数组存放所有气泡窗口,并定义对该数组的显示和消除的方法。
3.定义一种气泡窗口,以及它的刷新方法等。
使用方法:在事件脚本中输入 show_msg_bubble(x) x代表要输出的文本编号。
输入 delete_msg_bubble(x) x代表要消除的文本编号。
=end
#==============================================================================
module MNJQR_MsgBubble_Set
#--------------------------------------------------------------------------
# ● 存放文本
#--------------------------------------------------------------------------
Helping_type1 = {
1 => "测试,这是第一条信息。测试极限长度。" , #该规格下最长文字
2 => "同样的,这是第二条。",
3 => "她耍了花招。硬币其实在她的手里。",
4 => "他这句话有一半是假的。",
5 => "能感受到他散发出的魔法力量。"
}
end
#==============================================================================
class Game_System
attr_accessor :additive_bubble, :deleted_bubble
#--------------------------------------------------------------------------
# ● 初始化
#--------------------------------------------------------------------------
alias msg_bubble_initialize initialize
def initialize
msg_bubble_initialize
setup_initial_bubble
end
#--------------------------------------------------------------------------
# ● 初始化信息气泡窗口组
#--------------------------------------------------------------------------
def setup_initial_bubble
@msg_bubble = []
@additive_bubble = nil
end
#--------------------------------------------------------------------------
# ● 不知道干啥用的,反正不能删
#--------------------------------------------------------------------------
def map_msg_bubble
return @msg_bubble.map{|d| d.id == id }
end
#--------------------------------------------------------------------------
# ● 获取气泡
#--------------------------------------------------------------------------
def get_msg_bubble(id)
return @msg_bubble.find{|d| d.id == id }
end
#--------------------------------------------------------------------------
# ● 判断气泡是否存在
#--------------------------------------------------------------------------
def has_msg_bubble(id)
return @msg_bubble.any?{|d| d.id == id }
end
#--------------------------------------------------------------------------
# ● 显示指令
#--------------------------------------------------------------------------
def show_msg_bubble(id)
return if has_msg_bubble(id) || id == 0
@msg_bubble.push(Window_MsgBubble.new(id))
@additive_bubble = id
end
#--------------------------------------------------------------------------
# ● 消除指令
#--------------------------------------------------------------------------
def delete_msg_bubble(id)
return if !has_msg_bubble(id)
window = get_msg_bubble(id)
@msg_bubble.delete(window)
window.dispose
@deleted_bubble = id
end
end
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# ● 唤出气泡
#--------------------------------------------------------------------------
def show_msg_bubble(id)
$game_system.show_msg_bubble(id)
end
#--------------------------------------------------------------------------
# ● 消除气泡
#--------------------------------------------------------------------------
def delete_msg_bubble(id)
$game_system.delete_msg_bubble(id)
end
end
#==============================================================================
class Window_MsgBubble < Window_Base
attr_reader :id
#--------------------------------------------------------------------------
# ● 初始化对象
#--------------------------------------------------------------------------
def initialize(id)
@id = id
super(50, 30, 480, fitting_height(2))
self.opacity = 0
self.contents_opacity = 255
self.z = 999
update
end
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
refresh
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
contents.clear
self.opacity = $game_variables[1]
draw_msg_text(id)
end
#--------------------------------------------------------------------------
# ● 绘制文字
#--------------------------------------------------------------------------
def draw_msg_text(id)
draw_text(contents.rect, MNJQR_MsgBubble_Set::Helping_type1[id], 0)
end
end
#==============================================================================
class Scene_Map < Scene_Base
#--------------------------------------------------------------------------
# ● 生成信息气泡窗口
#--------------------------------------------------------------------------
def create_msg_bubble_window(id)
$game_system.additive_bubble = nil
window_id = "@msg_bubble_window#{id}"
data = $game_system.get_msg_bubble(id)
window = instance_variable_get(window_id)
return if !!window && !window.disposed? || !data
instance_variable_set(window_id, Window_MsgBubble.new(data))
end
#--------------------------------------------------------------------------
# ● 消除信息气泡窗口
#--------------------------------------------------------------------------
def dispose_msg_bubble_window(id)
$game_system.deleted_bubble = nil
window_id = "@msg_bubble_window#{id}"
return if !instance_variable_get(window_id)
instance_variable_get(window_id).dispose
instance_variable_set(window_id, nil)
end
#--------------------------------------------------------------------------
# ● 生成所有窗口
#--------------------------------------------------------------------------
alias msg_bubble_create_all_windows create_all_windows
def create_all_windows
msg_bubble_create_all_windows
$game_system.map_msg_bubble.each{|id| create_msg_bubble_window(id) }
end
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
alias msg_bubble_update update
def update
msg_bubble_update
update_msg_bubble
end
#--------------------------------------------------------------------------
# ● 更新信息气泡窗口
#--------------------------------------------------------------------------
def update_msg_bubble
$game_system.additive_bubble && create_msg_bubble_window($game_system.additive_bubble)
$game_system.deleted_bubble && dispose_msg_bubble_window($game_system.deleted_bubble)
end
end
复制代码
[/fold]
脚本贴出来了,然后这是范例:
我的描述可能不太清楚,具体请下载范例,里面说的比较清楚。谢谢各位啦~~
作者:
百里_飞柳
时间:
2021-1-26 10:42
用数组可还行,既然你这里都是按序号的预设对话,推荐改成 Hash 表,方便很多
@msg_bubble = {}
新增时可以直接 @msg_bubble[3] = window,然后实际存储的就是 { 3 => window },既保证了id的唯一性,又方便索引使用,调用时直接 @msg_bubble[3] 就可以获得这个对应的 window
关于窗口未被消除,是因为window需要额外的手动dispose,光从数组中删去是不够的
在78行处,改成
window = get_msg_bubble(id)
@msg_bubble.delete(window)
window.dispose
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X5.0