Project1
标题: 请问如何能在对话中通过按键执行公共事件(已解决) [打印本页]
作者: Nil2018 时间: 2019-6-27 13:56
标题: 请问如何能在对话中通过按键执行公共事件(已解决)
本帖最后由 Nil2018 于 2019-6-29 23:39 编辑
demo:[attach]358119[/attach]
里面使用到脚本: YEA - 按键触发公共事件 按下A键可以执行一个公共事件,效果是画面闪烁+色调切换,可是对话中无法执行。
有什么办法能解决这个问题吗?
作者: KB.Driver 时间: 2019-6-27 15:00
根据RM的设计,对话窗口运行时会中止事件解释器(Game_Interpreter)
所以,默认情况下,是没有办法一边对话一边进行公共事件的。
当然,你这个公共事件的内容比较简单,不涉及并行操作,因此可以手动实现。
你可以插入下面这段脚本。
#encoding:utf-8
#==============================================================================
# ■ Window_Message
#------------------------------------------------------------------------------
# 显示文字信息的窗口。
#==============================================================================
class Window_Message < Window_Base
#--------------------------------------------------------------------------
# ● [覆盖]处理输入等待
#--------------------------------------------------------------------------
def input_pause
self.pause = true
wait(10)
#==================================================================
while !(Input.trigger?(:B) || Input.trigger?(:C))
if Scene_Map === (s = SceneManager.scene)
CLD99::COMMON_EVENT[15] if Input.trigger?(:X)
end
Fiber.yield
end
#==================================================================
Input.update
self.pause = false
end
end
module CLD99
module COMMON_EVENT
class << self
def [](n)
send(sprintf("event_%03d", n))
end
def event_015
RPG::SE.new("Battle1", 90, 110).play
$game_map.screen.start_flash(Color.new(255,255,255), 10)
10.times { Graphics.update }
if $game_switches[180]
$game_map.screen.start_tone_change(Tone.new(0,0,17,34), 1)
else
$game_map.screen.start_tone_change(Tone.new(0,0,17,187), 1)
end
$game_switches[180] = !$game_switches[180]
end
end
end
end
#encoding:utf-8
#==============================================================================
# ■ Window_Message
#------------------------------------------------------------------------------
# 显示文字信息的窗口。
#==============================================================================
class Window_Message < Window_Base
#--------------------------------------------------------------------------
# ● [覆盖]处理输入等待
#--------------------------------------------------------------------------
def input_pause
self.pause = true
wait(10)
#==================================================================
while !(Input.trigger?(:B) || Input.trigger?(:C))
if Scene_Map === (s = SceneManager.scene)
CLD99::COMMON_EVENT[15] if Input.trigger?(:X)
end
Fiber.yield
end
#==================================================================
Input.update
self.pause = false
end
end
module CLD99
module COMMON_EVENT
class << self
def [](n)
send(sprintf("event_%03d", n))
end
def event_015
RPG::SE.new("Battle1", 90, 110).play
$game_map.screen.start_flash(Color.new(255,255,255), 10)
10.times { Graphics.update }
if $game_switches[180]
$game_map.screen.start_tone_change(Tone.new(0,0,17,34), 1)
else
$game_map.screen.start_tone_change(Tone.new(0,0,17,187), 1)
end
$game_switches[180] = !$game_switches[180]
end
end
end
end
这段脚本的原理也很简单,就是把你的公共事件"翻译”成脚本直接运行。
当然,如果有更多这样的需求,就需要找人帮你了。
作者: Nil2018 时间: 2019-6-27 16:01
本帖最后由 Nil2018 于 2019-6-29 23:39 编辑
..又要麻烦大佬一下,
游戏里有个公共事件需要显示图片,事件指令:
我修改以后..发现图片的显示有问题...日历大佬可以帮修正一下吗 ..
[attach]358124[/attach]
作者: KB.Driver 时间: 2019-6-27 17:46
#encoding:utf-8
#==============================================================================
# ■ Window_Message
#------------------------------------------------------------------------------
# 显示文字信息的窗口。
#==============================================================================
class Window_Message < Window_Base
#--------------------------------------------------------------------------
# ● [覆盖]处理输入等待
#--------------------------------------------------------------------------
def input_pause
self.pause = true
wait(10)
#==================================================================
while !(Input.trigger?(:B) || Input.trigger?(:C))
if Scene_Map === (s = SceneManager.scene)
CLD99::COMMON_EVENT[15] if Input.trigger?(:X)
end
Fiber.yield
end
#==================================================================
Input.update
self.pause = false
end
end
class Scene_Map
def update_spriteset(duration)
duration.times do
Graphics.update
@spriteset.update
end
end
end
module CLD99
module COMMON_EVENT
class << self
def [](n)
send(sprintf("event_%03d", n))
end
def event_015
RPG::SE.new("Absorb1", 90, 100).play
$game_map.screen.pictures[2].show("sight2", 0, 0, 0, 100, 100, 255, 0)
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[3].show("sight3", 0, 0, 0, 100, 100, 255, 0)
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[4].show("sight4", 0, 0, 0, 100, 100, 255, 0)
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[5].show("sight5", 0, 0, 0, 100, 100, 255, 0)
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[6].show("dark", 0, 0, 0, 100, 100, 255, 0)
SceneManager.scene.update_spriteset(2)
if $game_switches[180]
$game_map.screen.start_tone_change(Tone.new(0,0,17,34), 1)
else
$game_map.screen.start_tone_change(Tone.new(0,0,17,187), 1)
end
$game_switches[180] = !$game_switches[180]
$game_map.screen.pictures[6].erase
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[5].erase
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[4].erase
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[3].erase
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[2].erase
end
end
end
end
#encoding:utf-8
#==============================================================================
# ■ Window_Message
#------------------------------------------------------------------------------
# 显示文字信息的窗口。
#==============================================================================
class Window_Message < Window_Base
#--------------------------------------------------------------------------
# ● [覆盖]处理输入等待
#--------------------------------------------------------------------------
def input_pause
self.pause = true
wait(10)
#==================================================================
while !(Input.trigger?(:B) || Input.trigger?(:C))
if Scene_Map === (s = SceneManager.scene)
CLD99::COMMON_EVENT[15] if Input.trigger?(:X)
end
Fiber.yield
end
#==================================================================
Input.update
self.pause = false
end
end
class Scene_Map
def update_spriteset(duration)
duration.times do
Graphics.update
@spriteset.update
end
end
end
module CLD99
module COMMON_EVENT
class << self
def [](n)
send(sprintf("event_%03d", n))
end
def event_015
RPG::SE.new("Absorb1", 90, 100).play
$game_map.screen.pictures[2].show("sight2", 0, 0, 0, 100, 100, 255, 0)
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[3].show("sight3", 0, 0, 0, 100, 100, 255, 0)
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[4].show("sight4", 0, 0, 0, 100, 100, 255, 0)
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[5].show("sight5", 0, 0, 0, 100, 100, 255, 0)
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[6].show("dark", 0, 0, 0, 100, 100, 255, 0)
SceneManager.scene.update_spriteset(2)
if $game_switches[180]
$game_map.screen.start_tone_change(Tone.new(0,0,17,34), 1)
else
$game_map.screen.start_tone_change(Tone.new(0,0,17,187), 1)
end
$game_switches[180] = !$game_switches[180]
$game_map.screen.pictures[6].erase
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[5].erase
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[4].erase
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[3].erase
SceneManager.scene.update_spriteset(2)
$game_map.screen.pictures[2].erase
end
end
end
end
所以情况复杂了以后就没那么简单了。
因为一次执行中涉及到图像的动态变化(需要不断更新才能显示出变化),必须手动在流程中加入update
为了防止代码太长,我把update做成了Scene_Map里的方法
如果不好理解的话,只要把SceneManager.scene.update_spriteset(n)当做刷新图片显示 并等待n帧 就好
另外,由于Game_Picture规定的图片z值最大不能超过100,而对话框的z值是200
所以你的“眨眼”图片会被对话框盖住。
这是RM机制的问题,如果不想这样的话就只能自己弄精灵自己设定更大的Z值。
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |