Project1

标题: RPG maker xp的独立开关问题,求解大佬? [打印本页]

作者: 情歌诀    时间: 2022-11-23 09:05
标题: RPG maker xp的独立开关问题,求解大佬?
RPG maker XP中独立开关设置,只有默认A,B,C,D四个,能不能把这个增加多一些,做事件才能更多花样,求求大佬帮帮忙,谢谢 [qq]3339357969[/qq]

QQ截图20221123090340.png (53.02 KB, 下载次数: 21)

QQ截图20221123090340.png

作者: 灯笼菜刀王    时间: 2022-11-23 10:24
本帖最后由 灯笼菜刀王 于 2022-11-23 11:26 编辑

一般来说4个是够用的, 我16年XP使用生涯, 同时使用3个独立开关的情况都没几次,笑

如果你非要扩展也不是不行
  1. class Game_Switches
  2.   #在这里设置id对应的开关名称,注意名称要加双引号,格式: id=>"名称"
  3.   LIST = {1=>"E",2=>"F"}  
  4.   
  5.   #下面不要动--------------------------------
  6.   alias old []
  7.   def [](id)
  8.     a = $game_map.map_id
  9.     b = $game_system.map_interpreter.instance_variable_get(:@event_id)
  10.     return $game_self_switches[[a,b,LIST[id]]] if LIST.keys.include?(id)
  11.     old(id)
  12.   end
  13.   
  14.   alias old2 []=
  15.   def []=(id,val)
  16.     if LIST.keys.include?(id)
  17.       a = $game_map.map_id
  18.       b = $game_system.map_interpreter.instance_variable_get(:@event_id)
  19.       $game_self_switches[[a,b,LIST[id]]] = val
  20.     else
  21.       old(id,val)
  22.     end
  23.   end
  24.   
  25.   def event_page_swi(event_id,id)
  26.     return false if !LIST.keys.include?(id)
  27.     return $game_self_switches[[$game_map.map_id,event_id,LIST[id]]]
  28.   end
  29. end

  30. class Game_Event < Game_Character
  31.   #--------------------------------------------------------------------------
  32.   # ● 刷新
  33.   #--------------------------------------------------------------------------
  34.   def refresh
  35.     # 初始化本地变量 new_page
  36.     new_page = nil
  37.     # 无法暂时消失的情况下
  38.     unless @erased
  39.       # 从编号大的事件页按顺序调查
  40.       for page in @event.pages.reverse
  41.         # 可以参考事件条件 c
  42.         c = page.condition
  43.         # 确认开关条件 1
  44.         if c.switch1_valid
  45.           next if !$game_switches.event_page_swi(@id,c.switch1_id)
  46.         end
  47.         # 确认开关条件 2
  48.         if c.switch2_valid
  49.           next if !$game_switches.event_page_swi(@id,c.switch2_id)
  50.         end
  51.         # 确认变量条件
  52.         if c.variable_valid
  53.           if $game_variables[c.variable_id] < c.variable_value
  54.             next
  55.           end
  56.         end
  57.         # 确认独立开关条件
  58.         if c.self_switch_valid
  59.           key = [@map_id, @event.id, c.self_switch_ch]
  60.           if $game_self_switches[key] != true
  61.             next
  62.           end
  63.         end
  64.         # 设置本地变量 new_page
  65.         new_page = page
  66.         # 跳出循环
  67.         break
  68.       end
  69.     end
  70.     # 与上次同一事件页的情况下
  71.     if new_page == @page
  72.       # 过程结束
  73.       return
  74.     end
  75.     # @page 设置为现在的事件页
  76.     @page = new_page
  77.     # 清除启动中标志
  78.     clear_starting
  79.     # 没有满足条件的页面的时候
  80.     if @page == nil
  81.       # 设置各实例变量
  82.       @tile_id = 0
  83.       @character_name = ""
  84.       @character_hue = 0
  85.       @move_type = 0
  86.       @through = true
  87.       @trigger = nil
  88.       @list = nil
  89.       @interpreter = nil
  90.       # 过程结束
  91.       return
  92.     end
  93.     # 设置各实例变量
  94.     @tile_id = @page.graphic.tile_id
  95.     @character_name = @page.graphic.character_name
  96.     @character_hue = @page.graphic.character_hue
  97.     if @original_direction != @page.graphic.direction
  98.       @direction = @page.graphic.direction
  99.       @original_direction = @direction
  100.       @prelock_direction = 0
  101.     end
  102.     if @original_pattern != @page.graphic.pattern
  103.       @pattern = @page.graphic.pattern
  104.       @original_pattern = @pattern
  105.     end
  106.     @opacity = @page.graphic.opacity
  107.     @blend_type = @page.graphic.blend_type
  108.     @move_type = @page.move_type
  109.     @move_speed = @page.move_speed
  110.     @move_frequency = @page.move_frequency
  111.     @move_route = @page.move_route
  112.     @move_route_index = 0
  113.     @move_route_forcing = false
  114.     @walk_anime = @page.walk_anime
  115.     @step_anime = @page.step_anime
  116.     @direction_fix = @page.direction_fix
  117.     @through = @page.through
  118.     @always_on_top = @page.always_on_top
  119.     @trigger = @page.trigger
  120.     @list = @page.list
  121.     @interpreter = nil
  122.     # 目标是 [并行处理] 的情况下
  123.     if @trigger == 4
  124.       # 生成并行处理用解释器
  125.       @interpreter = Interpreter.new
  126.     end
  127.     # 自动事件启动判定
  128.     check_event_trigger_auto
  129.   end
  130. end
复制代码


把这个脚本塞到 main 这个脚本之上

设置方法, 在第三行的哈希表里设置开关对应关系,  比如 1号开关对应E 就在表里写上 1=>"E" 注意E要加英文标点的双引号, 你可以无限加,不限英文字母,  每个项目之间用英文逗号隔开,要换行就从逗号处换行

设置好后, 你就可以把对应id的开关当独立开关用了, 比如要打开某事件的独立开关E, 那就在该事件里把1号开关打开即可, 注意, 此时1号开关是对应到每个事件的哦, 你在1号事件打开1号开关是影响不了2号事件的
作者: 情歌诀    时间: 2022-11-23 10:39
灯笼菜刀王 发表于 2022-11-23 10:24
一般来说4个是够用的, 我16年XP使用生涯, 同时使用3个独立开关的情况都没几次,笑

如果你非要扩展也不是不 ...

谢谢大佬,主要这种方式简单,脚本晚点也会写的
作者: 情歌诀    时间: 2022-11-23 11:09
情歌诀 发表于 2022-11-23 10:39
谢谢大佬,主要这种方式简单,脚本晚点也会写的

出现错误了,我是现在不会ruby脚本

#---------------------------------------------------------------------------
#独立开关设置扩展
#
#在这里设置id对应的开关名称,注意名称要加双引号,格式: id=>"名称"
#设置方法, 在第三行的哈希表里设置开关对应关系,
#比如 1号开关对应E 就在表里写上 1=>"E"
#注意E要加英文标点的双引号, 你可以无限加,不限英文字母,
#每个项目之间用英文逗号隔开,要换行就从逗号处换行
#设置好后, 你就可以把对应id的开关当独立开关用了,
#不过操作独立开关需要用脚本命令:  独立开关("E", 1)
#这样即可把独立开关E打开(1为开,0为关), 注意这里的括号,双引号,逗号都要用英文标点
#---------------------------------------------------------------------------
  CAD_LIST = {1=>"E",2=>"F",3=>"G"}
#下面不要动--------------------------------
  alias old []
  def [](id)
    a = $game_map.map_id
    b = $game_system.map_interpreter.instance_variable_get(:@event_id)
    return $game_self_switches[[a,b,CAD_LIST[id]]] if CAD_LIST.keys.include?(id)
    old(id)
  end
end

class Interpreter
  def 独立开关(key,val)
    $game_self_switches[[$game_map.map_id,@event_id,key]] = (val == 1)
  end
end


是这样设置了,但是显示语法错误提示,无法运行游戏。
作者: 情歌诀    时间: 2022-11-23 11:22
具体该怎么写,大佬帮帮忙?
作者: 情歌诀    时间: 2022-11-23 11:31
情歌诀 发表于 2022-11-23 11:22
具体该怎么写,大佬帮帮忙?

我试试,真的是麻烦你了
作者: 情歌诀    时间: 2022-11-23 11:41
灯笼菜刀王 发表于 2022-11-23 10:24
一般来说4个是够用的, 我16年XP使用生涯, 同时使用3个独立开关的情况都没几次,笑

如果你非要扩展也不是不 ...

#==============================================================================
# ■ Game_Switches
#------------------------------------------------------------------------------
#  处理开关的类。编入的是类 Array 的外壳。本类的实例请参考
# $game_switches。
#==============================================================================

class Game_Switches
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    @data = []
  end
  #--------------------------------------------------------------------------
  # ● 获取开关
  #     switch_id : 开关 ID
  #--------------------------------------------------------------------------
  def [](switch_id)
    if switch_id <= 5000 and @data[switch_id] != nil
      return @data[switch_id]
    else
      return false
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置开关
  #     switch_id : 开关 ID
  #     value     : ON (true) / OFF (false)
  #--------------------------------------------------------------------------
  def []=(switch_id, value)
    if switch_id <= 5000
      @data[switch_id] = value
    end
  end
end
#---------------------------------------------------------------------------
#独立开关设置扩展
#
#在这里设置id对应的开关名称,注意名称要加双引号,格式: id=>"名称"
#设置方法, 在第三行的哈希表里设置开关对应关系,
#比如 1号开关对应E 就在表里写上 1=>"E"
#注意E要加英文标点的双引号, 你可以无限加,不限英文字母,
#每个项目之间用英文逗号隔开,要换行就从逗号处换行
#设置好后, 你就可以把对应id的开关当独立开关用了,
#不过操作独立开关需要用脚本命令:  独立开关("E", 1)
#这样即可把独立开关E打开(1为开,0为关), 注意这里的括号,双引号,逗号都要用英文标点
#---------------------------------------------------------------------------
  CAD_LIST = {1=>"E",2=>"F",3=>"G"}
  #下面不要动--------------------------------
  alias old []
  def [](id)
    a = $game_map.map_id
    b = $game_system.map_interpreter.instance_variable_get(:@event_id)
    return $game_self_switches[[a,b,LIST[id]]] if LIST.keys.include?(id)
    old(id)
  end
  
  alias old2 []=
  def []=(id,val)
    if LIST.keys.include?(id)
      a = $game_map.map_id
      b = $game_system.map_interpreter.instance_variable_get(:@event_id)
      $game_self_switches[[a,b,LIST[id]]] = val
    else
      old(id,val)
    end
  end
  
  def event_page_swi(event_id,id)
    return false if !LIST.keys.include?(id)
    return $game_self_switches[[$game_map.map_id,event_id,LIST[id]]]
  end
end

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    # 初始化本地变量 new_page
    new_page = nil
    # 无法暂时消失的情况下
    unless @erased
      # 从编号大的事件页按顺序调查
      for page in @event.pages.reverse
        # 可以参考事件条件 c
        c = page.condition
        # 确认开关条件 1
        if c.switch1_valid
          next if !$game_switches.event_page_swi(@id,c.switch1_id)
        end
        # 确认开关条件 2
        if c.switch2_valid
          next if !$game_switches.event_page_swi(@id,c.switch2_id)
        end
        # 确认变量条件
        if c.variable_valid
          if $game_variables[c.variable_id] < c.variable_value
            next
          end
        end
        # 确认独立开关条件
        if c.self_switch_valid
          key = [@map_id, @event.id, c.self_switch_ch]
          if $game_self_switches[key] != true
            next
          end
        end
        # 设置本地变量 new_page
        new_page = page
        # 跳出循环
        break
      end
    end
    # 与上次同一事件页的情况下
    if new_page == @page
      # 过程结束
      return
    end
    # @page 设置为现在的事件页
    @page = new_page
    # 清除启动中标志
    clear_starting
    # 没有满足条件的页面的时候
    if @page == nil
      # 设置各实例变量
      @tile_id = 0
      @character_name = ""
      @character_hue = 0
      @move_type = 0
      @through = true
      @trigger = nil
      @list = nil
      @interpreter = nil
      # 过程结束
      return
    end
    # 设置各实例变量
    @tile_id = @page.graphic.tile_id
    @character_name = @page.graphic.character_name
    @character_hue = @page.graphic.character_hue
    if @original_direction != @page.graphic.direction
      @direction = @page.graphic.direction
      @original_direction = @direction
      @prelock_direction = 0
    end
    if @original_pattern != @page.graphic.pattern
      @pattern = @page.graphic.pattern
      @original_pattern = @pattern
    end
    @opacity = @page.graphic.opacity
    @blend_type = @page.graphic.blend_type
    @move_type = @page.move_type
    @move_speed = @page.move_speed
    @move_frequency = @page.move_frequency
    @move_route = @page.move_route
    @move_route_index = 0
    @move_route_forcing = false
    @walk_anime = @page.walk_anime
    @step_anime = @page.step_anime
    @direction_fix = @page.direction_fix
    @through = @page.through
    @always_on_top = @page.always_on_top
    @trigger = @page.trigger
    @list = @page.list
    @interpreter = nil
    # 目标是 [并行处理] 的情况下
    if @trigger == 4
      # 生成并行处理用解释器
      @interpreter = Interpreter.new
    end
    # 自动事件启动判定
    check_event_trigger_auto
  end
end



但是游戏还是报错,无法运行游戏,照样是语法错误
作者: 情歌诀    时间: 2022-11-23 11:51
灯笼菜刀王 发表于 2022-11-23 10:24
一般来说4个是够用的, 我16年XP使用生涯, 同时使用3个独立开关的情况都没几次,笑

如果你非要扩展也不是不 ...

#下面不要动--------------------------------
  alias old []
  def [](id)
    a = $game_map.map_id
    b = $game_system.map_interpreter.instance_variable_get(:@event_id)
    return $game_self_switches[[a,b,LIST[id]]] if LIST.keys.include?(id)
    old(id)
  end
  
  alias old2 []=
  def []=(id,val)
    if LIST.keys.include?(id)
      a = $game_map.map_id
      b = $game_system.map_interpreter.instance_variable_get(:@event_id)
      $game_self_switches[[a,b,LIST[id]]] = val
    else
      old(id,val)
    end
  end
  
  def event_page_swi(event_id,id)
    return false if !LIST.keys.include?(id)
    return $game_self_switches[[$game_map.map_id,event_id,LIST[id]]]
  end
end                   (大概是这里的样子,开始游戏老是说这里语法错误)

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    # 初始化本地变量 new_page
    new_page = nil
    # 无法暂时消失的情况下
    unless @erased
      # 从编号大的事件页按顺序调查
      for page in @event.pages.reverse
        # 可以参考事件条件 c
        c = page.condition
        # 确认开关条件 1
        if c.switch1_valid
          next if !$game_switches.event_page_swi(@id,c.switch1_id)
        end
        # 确认开关条件 2
        if c.switch2_valid
          next if !$game_switches.event_page_swi(@id,c.switch2_id)
        end
        # 确认变量条件
        if c.variable_valid
          if $game_variables[c.variable_id] < c.variable_value
            next
          end
        end
        # 确认独立开关条件
        if c.self_switch_valid
          key = [@map_id, @event.id, c.self_switch_ch]
          if $game_self_switches[key] != true
            next
          end
        end
        # 设置本地变量 new_page
        new_page = page
        # 跳出循环
        break
      end
    end
    # 与上次同一事件页的情况下
    if new_page == @page
      # 过程结束
      return
    end
    # @page 设置为现在的事件页
    @page = new_page
    # 清除启动中标志
    clear_starting
    # 没有满足条件的页面的时候
    if @page == nil
      # 设置各实例变量
      @tile_id = 0
      @character_name = ""
      @character_hue = 0
      @move_type = 0
      @through = true
      @trigger = nil
      @list = nil
      @interpreter = nil
      # 过程结束
      return
    end
    # 设置各实例变量
    @tile_id = @page.graphic.tile_id
    @character_name = @page.graphic.character_name
    @character_hue = @page.graphic.character_hue
    if @original_direction != @page.graphic.direction
      @direction = @page.graphic.direction
      @original_direction = @direction
      @prelock_direction = 0
    end
    if @original_pattern != @page.graphic.pattern
      @pattern = @page.graphic.pattern
      @original_pattern = @pattern
    end
    @opacity = @page.graphic.opacity
    @blend_type = @page.graphic.blend_type
    @move_type = @page.move_type
    @move_speed = @page.move_speed
    @move_frequency = @page.move_frequency
    @move_route = @page.move_route
    @move_route_index = 0
    @move_route_forcing = false
    @walk_anime = @page.walk_anime
    @step_anime = @page.step_anime
    @direction_fix = @page.direction_fix
    @through = @page.through
    @always_on_top = @page.always_on_top
    @trigger = @page.trigger
    @list = @page.list
    @interpreter = nil
    # 目标是 [并行处理] 的情况下
    if @trigger == 4
      # 生成并行处理用解释器
      @interpreter = Interpreter.new
    end
    # 自动事件启动判定
    check_event_trigger_auto
  end
end
作者: 情歌诀    时间: 2022-11-23 12:01
情歌诀 发表于 2022-11-23 11:51
#下面不要动--------------------------------
  alias old []
  def [](id)

不行,另外搞了,还是原地方出现语法错误
  #下面不要动--------------------------------
  alias old []
  def [](id)
    a = $game_map.map_id
    b = $game_system.map_interpreter.instance_variable_get(:@event_id)
    return $game_self_switches[[a,b,LIST[id]]] if LIST.keys.include?(id)
    old(id)
  end
  
  alias old2 []=
  def []=(id,val)
    if LIST.keys.include?(id)
      a = $game_map.map_id
      b = $game_system.map_interpreter.instance_variable_get(:@event_id)
      $game_self_switches[[a,b,LIST[id]]] = val
    else
      old(id,val)
    end
  end
  
  def event_page_swi(event_id,id)
    return false if !LIST.keys.include?(id)
    return $game_self_switches[[$game_map.map_id,event_id,LIST[id]]]
  end
end             ---------(还是提示语法错误,无法进行游戏)           

class Game_Event < Game_Character
作者: 情歌诀    时间: 2022-11-23 12:10
情歌诀 发表于 2022-11-23 12:01
不行,另外搞了,还是原地方出现语法错误
  #下面不要动--------------------------------
  alias old [ ...

是完成复制的,没有少一个字,这里只是告诉你出现问题,才搞这么短,方便浏览
作者: 情歌诀    时间: 2022-11-23 12:12
情歌诀 发表于 2022-11-23 12:01
不行,另外搞了,还是原地方出现语法错误
  #下面不要动--------------------------------
  alias old [ ...

可以运行游戏,刚才少输了一小段,真是抱歉
作者: 情歌诀    时间: 2022-11-23 12:21
灯笼菜刀王 发表于 2022-11-23 10:24
一般来说4个是够用的, 我16年XP使用生涯, 同时使用3个独立开关的情况都没几次,笑

如果你非要扩展也不是不 ...

刚才用在事件里面,就出现这个了,是不是我用的不对,还是?(这个是用事件里面脚本吧,是需要命令激活是吧)

执行脚本时发生NomEthodError。
undefined method '独立开关' for#<interpreter:0xef2e328>




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1