查看: 1820|回复: 4

[已经解决] 【新手提问】关于菜单脚本里添加二级菜单后不消失的问题

[复制链接]
梦石
0
星屑
50
在线时间
41 小时
注册时间
2014-5-31
回帖
3
发表于 2015-2-19 18:08:51 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 RyanBern 于 2015-2-19 20:47 编辑

[pre lang="Ruby"]#==============================================================================
# ■ Scene_Menu
#------------------------------------------------------------------------------
#  处理菜单画面的类。
#==============================================================================

class Scene_Menu
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     menu_index : 命令光标的初期位置
  #--------------------------------------------------------------------------
  def initialize(menu_index = 0)
    @menu_index = menu_index
  end
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    # 生成命令窗口
    s1 = "属性"
    s2 = "魔法"
    s3 = "物品"
    s4 = "系统"
    @command_window = Window_Command.new(100, [s1, s2, s3, s4])
    @command_window.index = @menu_index
    @command_window.x = 0
    @command_window.y = 64
    # 同伴人数为 0 的情况下
    if $game_party.actors.size == 0
      # 物品、特技、装备、状态无效化
      @command_window.disable_item(0)
      @command_window.disable_item(1)
      @command_window.disable_item(2)
      @command_window.disable_item(3)
    end
    # 禁止存档的情况下
    if $game_system.save_disabled
      # 存档无效
      @command_window.disable_item(4)
    end
    # 生成金钱窗口
    @gold_window = Window_Gold.new
    @gold_window.x = 0
    @gold_window.y = 0
    # 生成属性二级菜单
    m1 = "状态"
    m2 = "穿戴"
    @attribute_window = Window_Command.new(85, [m1, m2])
    @attribute_window.index = 0
    @attribute_window.x = 80
    @attribute_window.y = 70
    @attribute_window.visible = false
    # 生成物品二级菜单
    a1 = "使用"
    a2 = "装备"
    @items_window = Window_Command.new(85, [a1, a2])
    @items_window.index = 0
    @items_window.x = 80
    @items_window.y = 100
    @items_window.visible = false
    # 生成系统二级菜单
    h1 = "读入进度"
    h2 = "储存进度"
    h3 = "游戏设置"
    h4 = "结束游戏"
    @system_window = Window_Command.new(90, [h1, h2, h3, h4])
    @system_window.index = 0
    @system_window.x = 80
    @system_window.y = 115
    @system_window.visible = false
    # 生成系统三级菜单
    c1 = "音乐开"
    c2 = "音乐关"
    @system2_window = Window_Command.new(85, [c1, c2])
    @system2_window.index = 0
    @system2_window.x = 155
    @system2_window.y = 175
    @system2_window.visible = false
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果切换画面就中断循环
      if $scene != self
        break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @command_window.dispose
    @gold_window.dispose
    @attribute_window.dispose
    @items_window.dispose
    @system_window.dispose
    @system2_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新窗口
    @command_window.update
    @gold_window.update
    @attribute_window.update
    @items_window.update
    @system_window.update
    @system2_window.update
    # 命令窗口被激活的情况下: 调用 update_command
    if @command_window.active
      update_command
      return
    end
    # 属性窗口被激活的情况下: 调用 update_attribute
    if @attribute_window.active
      update_attribute
      return
    end
     # 物品窗口被激活的情况下: 调用 update_items
    if @items_window.active
      update_items
      return
    end
    # 系统窗口被激活的情况下: 调用 update_system
    if @system_window.active
      update_system
      return
    end
    # 系统设置窗口被激活的情况下: 调用 update_system2
    if @system2_window.active
      update_system2
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (命令窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_command
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换的地图画面
      $scene = Scene_Map.new
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 同伴人数为 0、存档、游戏结束以外的场合
      if $game_party.actors.size == 0 and @command_window.index < 4
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 命令窗口的光标位置分支
      case @command_window.index
      when 0  # 属性
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活属性二级菜单
        @attribute_window.visible = true
        @command_window.active = false
        @attribute_window.active = true
        @attribute_window.index = 0
      when 1  # 魔法
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        $scene = Scene_Skill.new(0)
      when 2  # 物品
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活物品二级菜单
        @items_window.visible = true
        @command_window.active = false
        @items_window.active = true
        @items_window.index = 0
      when 3  # 系统
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活系统二级菜单
        @system_window.visible = true
        @command_window.active = false
        @system_window.active = true
        @system_window.index = 0
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (属性二级菜单被激活的情况下)
  #--------------------------------------------------------------------------
   def update_attribute
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 上一层菜单
      @command_window.active = true
      @attribute_window.active = false
      @attribute_window.visible = false
      return
    end
     if Input.trigger?(Input::C)
      # 命令窗口的光标位置分支
      case @attribute_window.index
      when 0  # 状态
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到物品画面
        $Scene = Scene_Status.new
      when 1  # 穿戴
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (物品二级菜单被激活的情况下)
  #--------------------------------------------------------------------------
   def update_items
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 上一层菜单
      @command_window.active = true
      @items_window.active = false
      @items_window.visible = false
    end
     if Input.trigger?(Input::C)
      # 命令窗口的光标位置分支
      case @items_window.index
      when 0  # 使用
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到物品画面
        $Scene = Scene_Status.new
      when 1  # 装备
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (系统二级菜单被激活的情况下)
  #--------------------------------------------------------------------------
   def update_system
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 上一层菜单
      @command_window.active = true
      @system_window.active = false
      @system_window.visible = false
    end
     if Input.trigger?(Input::C)
      # 命令窗口的光标位置分支
      case @system_window.index
      when 0  # 读入进度
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到物品画面
      when 1  # 储存进度
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
      when 2  # 游戏设置
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到物品画面
        @system_window.active = false
        @system2_window.active = true
        @system2_window.visible = true
      when 3  # 结束游戏
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
      end
    end
  end
    #--------------------------------------------------------------------------
  # ● 刷新画面 (系统三级菜单被激活的情况下)
  #--------------------------------------------------------------------------
   def update_system2
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 上一层菜单
      @system_window.active = true
      @system2_window.active = false
      @system2_window.visible = false
    end
     if Input.trigger?(Input::C)
      # 命令窗口的光标位置分支
      case @system2_window.index
      when 0  # 音乐开
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到物品画面
        $Scene = Scene_Status.new
      when 1  # 音乐关
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        @command_window.active = false
      end
    end
  end
end
[/pre]
自己改的脚本就是以上,然后问题来了,和图片中一样,当第一次打开菜单时,属性选项很正常,但是物品选项和系统选项选择后出现了二级菜单,但是按B键不能使二级菜单消失,然后再按就挤在一起了,但是回到主菜单不回到地图的话再选择一次物品和系统,这两个就正常了,就能正常得选择和取消,但是如果回到地图以后再来按一次菜单,就又出现了问题无法取消,新手提问,感谢各位大神能够指出错误,小弟在这里谢谢了 QQ图片20150219180142.png

薄凉看客

梦石
0
星屑
50
在线时间
1269 小时
注册时间
2010-6-20
回帖
1223
发表于 2015-2-19 18:33:54 | 显示全部楼层
生成N级命令窗口的时候需要保证:active= false ,visible = false
你不仅要有
@attribute_window.visible = false 也要有
@attribute_window.active = false

回复

使用道具 举报

梦石
0
星屑
50
在线时间
41 小时
注册时间
2014-5-31
回帖
3
 楼主| 发表于 2015-2-20 11:38:36 | 显示全部楼层
恐惧剑刃 发表于 2015-2-19 18:33
生成N级命令窗口的时候需要保证:active= false ,visible = false
你不仅要有
@attribute_window.visible  ...

可是我有了啊,第一个的二级菜单就没问题,只有第三和第四个才不正常
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2015-2-20 11:55:31 | 显示全部楼层
出现此问题的原因是一切Window_Selectable初始的active属性均为true,当第一次生成的时候,请务必将主菜单的active设置为true,其他各级菜单的active设置为false。否则会因为有多个窗口的active为true而引发刷新混乱。
解决方法很简单,只要在main方法里面生成窗口那里把各级菜单的active也设置为false即可。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
41 小时
注册时间
2014-5-31
回帖
3
 楼主| 发表于 2015-2-20 13:08:16 | 显示全部楼层
RyanBern 发表于 2015-2-20 11:55
出现此问题的原因是一切Window_Selectable初始的active属性均为true,当第一次生成的时候,请务必将主菜单 ...

解决了谢谢!
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部