查看: 3978|回复: 7

[已经解决] 请问如何能在对话中通过按键执行公共事件(已解决)

[复制链接]
梦石
1
星屑
14373
在线时间
2109 小时
注册时间
2017-9-28
回帖
607
发表于 2019-6-27 13:56:35 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Nil2018 于 2019-6-29 23:39 编辑

demo:

里面使用到脚本: YEA - 按键触发公共事件  按下A键可以执行一个公共事件,效果是画面闪烁+色调切换,可是对话中无法执行。
有什么办法能解决这个问题吗?

GI2F.gif
VA外站脚本汉化群:226308173   |    部分远古文件备份:https://wwzv.lanzoue.com/b02rac5pc  密码:acgm
梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2019-6-27 15:00:12 | 显示全部楼层
根据RM的设计,对话窗口运行时会中止事件解释器(Game_Interpreter)
所以,默认情况下,是没有办法一边对话一边进行公共事件的。

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

[pre lang="ruby"]#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[/pre]

这段脚本的原理也很简单,就是把你的公共事件"翻译”成脚本直接运行。
当然,如果有更多这样的需求,就需要找人帮你了。

点评

呜呜呜,好不容易找到这里,发现版本不对......如果大佬还能看到的话,能给一个MV版本的脚本吗  发表于 2023-8-15 23:15
阿我知道了...谢谢日历大佬!  发表于 2019-6-27 15:28
用头画头像,用脚写脚本
回复

使用道具 举报

梦石
1
星屑
14373
在线时间
2109 小时
注册时间
2017-9-28
回帖
607
 楼主| 发表于 2019-6-27 16:01:07 | 显示全部楼层
本帖最后由 Nil2018 于 2019-6-29 23:39 编辑
KB.Driver 发表于 2019-6-27 15:00
根据RM的设计,对话窗口运行时会中止事件解释器(Game_Interpreter)
所以,默认情况下,是没有办法一边对 ...


..又要麻烦大佬一下,
游戏里有个公共事件需要显示图片,事件指令:
Snipaste_2019-06-27_15-20-36.png

我修改以后..发现图片的显示有问题...日历大佬可以帮修正一下吗 ..
VA外站脚本汉化群:226308173   |    部分远古文件备份:https://wwzv.lanzoue.com/b02rac5pc  密码:acgm
回复

使用道具 举报

梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2019-6-27 17:46:46 | 显示全部楼层
Nil2018 发表于 2019-6-27 16:01
..又要麻烦大佬一下,
游戏里有个公共事件需要显示图片,事件指令:

[pre lang="ruby"]#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[/pre]

所以情况复杂了以后就没那么简单了。
因为一次执行中涉及到图像的动态变化(需要不断更新才能显示出变化),必须手动在流程中加入update

为了防止代码太长,我把update做成了Scene_Map里的方法
如果不好理解的话,只要把SceneManager.scene.update_spriteset(n)当做刷新图片显示 并等待n帧 就好

另外,由于Game_Picture规定的图片z值最大不能超过100,而对话框的z值是200
所以你的“眨眼”图片会被对话框盖住。
这是RM机制的问题,如果不想这样的话就只能自己弄精灵自己设定更大的Z值。

点评

醋虾,感谢日历大佬!  发表于 2019-6-27 18:31
如果想了解更多关于精灵刷新的知识,可以看看这篇教程 https://rpg.blue/thread-477333-1-1.html  发表于 2019-6-27 17:48

评分

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

查看全部评分

用头画头像,用脚写脚本
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部