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)
所以,默认情况下,是没有办法一边对话一边进行公共事件的。

当然,你这个公共事件的内容比较简单,不涉及并行操作,因此可以手动实现。
你可以插入下面这段脚本。

RUBY 代码复制
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_Message
  4. #------------------------------------------------------------------------------
  5. #  显示文字信息的窗口。
  6. #==============================================================================
  7.  
  8. class Window_Message < Window_Base
  9.   #--------------------------------------------------------------------------
  10.   # ● [覆盖]处理输入等待
  11.   #--------------------------------------------------------------------------
  12.   def input_pause
  13.     self.pause = true
  14.     wait(10)
  15.     #==================================================================
  16.     while !(Input.trigger?(:B) || Input.trigger?(:C))
  17.       if Scene_Map === (s = SceneManager.scene)
  18.         CLD99::COMMON_EVENT[15] if Input.trigger?(:X)
  19.       end
  20.       Fiber.yield
  21.     end   
  22.     #==================================================================
  23.     Input.update
  24.     self.pause = false
  25.   end
  26. end
  27.  
  28. module CLD99
  29.   module COMMON_EVENT
  30.     class << self
  31.       def [](n)
  32.         send(sprintf("event_%03d", n))
  33.       end
  34.  
  35.       def event_015
  36.         RPG::SE.new("Battle1", 90, 110).play
  37.         $game_map.screen.start_flash(Color.new(255,255,255), 10)
  38.         10.times { Graphics.update }
  39.         if $game_switches[180]
  40.           $game_map.screen.start_tone_change(Tone.new(0,0,17,34), 1)
  41.         else        
  42.           $game_map.screen.start_tone_change(Tone.new(0,0,17,187), 1)
  43.         end
  44.         $game_switches[180] = !$game_switches[180]
  45.       end
  46.     end
  47.   end
  48. end


这段脚本的原理也很简单,就是把你的公共事件"翻译”成脚本直接运行。
当然,如果有更多这样的需求,就需要找人帮你了。
作者: Nil2018    时间: 2019-6-27 16:01
本帖最后由 Nil2018 于 2019-6-29 23:39 编辑
KB.Driver 发表于 2019-6-27 15:00
根据RM的设计,对话窗口运行时会中止事件解释器(Game_Interpreter)
所以,默认情况下,是没有办法一边对 ...


..又要麻烦大佬一下,
游戏里有个公共事件需要显示图片,事件指令:


我修改以后..发现图片的显示有问题...日历大佬可以帮修正一下吗 ..
[attach]358124[/attach]
作者: KB.Driver    时间: 2019-6-27 17:46
Nil2018 发表于 2019-6-27 16:01
..又要麻烦大佬一下,
游戏里有个公共事件需要显示图片,事件指令:

RUBY 代码复制
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_Message
  4. #------------------------------------------------------------------------------
  5. #  显示文字信息的窗口。
  6. #==============================================================================
  7.  
  8. class Window_Message < Window_Base
  9.   #--------------------------------------------------------------------------
  10.   # ● [覆盖]处理输入等待
  11.   #--------------------------------------------------------------------------
  12.   def input_pause
  13.     self.pause = true
  14.     wait(10)
  15.     #==================================================================
  16.     while !(Input.trigger?(:B) || Input.trigger?(:C))
  17.       if Scene_Map === (s = SceneManager.scene)
  18.         CLD99::COMMON_EVENT[15] if Input.trigger?(:X)
  19.       end
  20.       Fiber.yield
  21.     end   
  22.     #==================================================================
  23.     Input.update
  24.     self.pause = false
  25.   end
  26. end
  27.  
  28. class Scene_Map
  29.   def update_spriteset(duration)
  30.     duration.times do
  31.       Graphics.update
  32.       @spriteset.update  
  33.     end
  34.   end
  35. end
  36.  
  37. module CLD99
  38.   module COMMON_EVENT
  39.     class << self
  40.       def [](n)
  41.         send(sprintf("event_%03d", n))
  42.       end
  43.  
  44.       def event_015
  45.         RPG::SE.new("Absorb1", 90, 100).play
  46.  
  47.  
  48.         $game_map.screen.pictures[2].show("sight2", 0, 0, 0, 100, 100, 255, 0)
  49.         SceneManager.scene.update_spriteset(2)           
  50.         $game_map.screen.pictures[3].show("sight3", 0, 0, 0, 100, 100, 255, 0)
  51.         SceneManager.scene.update_spriteset(2)
  52.         $game_map.screen.pictures[4].show("sight4", 0, 0, 0, 100, 100, 255, 0)
  53.         SceneManager.scene.update_spriteset(2)
  54.         $game_map.screen.pictures[5].show("sight5", 0, 0, 0, 100, 100, 255, 0)
  55.         SceneManager.scene.update_spriteset(2)
  56.         $game_map.screen.pictures[6].show("dark", 0, 0, 0, 100, 100, 255, 0)
  57.         SceneManager.scene.update_spriteset(2)
  58.  
  59.         if $game_switches[180]
  60.           $game_map.screen.start_tone_change(Tone.new(0,0,17,34), 1)
  61.         else        
  62.           $game_map.screen.start_tone_change(Tone.new(0,0,17,187), 1)
  63.         end
  64.         $game_switches[180] = !$game_switches[180]
  65.  
  66.         $game_map.screen.pictures[6].erase
  67.         SceneManager.scene.update_spriteset(2)
  68.         $game_map.screen.pictures[5].erase
  69.         SceneManager.scene.update_spriteset(2)
  70.         $game_map.screen.pictures[4].erase
  71.         SceneManager.scene.update_spriteset(2)
  72.         $game_map.screen.pictures[3].erase
  73.         SceneManager.scene.update_spriteset(2)
  74.         $game_map.screen.pictures[2].erase
  75.  
  76.       end
  77.     end
  78.   end
  79. 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