设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3213|回复: 15
打印 上一主题 下一主题

[已经解决] 有关菜单active属性的设置

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2014-2-6
帖子
11
跳转到指定楼层
1
发表于 2014-2-9 02:32:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
同一个画面有两个菜单,左选项菜单,右人物菜单。通过人物菜单可以进入人物的装备,技能等rm自带的菜单。
从装备等菜单返回的时候,默认是开启左菜单,冻结有菜单。我想返回的时候冻结做菜单,返回有菜单,如何设定?
由于不知道发帖的时候怎么贴图和代码,我会把图和代码贴在回复上。

点评

做菜单 !有菜单!  发表于 2014-2-9 14:30

Lv1.梦旅人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2014-2-6
帖子
11
2
 楼主| 发表于 2014-2-9 02:45:13 | 只看该作者
我的想法是在Scene_MenuBase里建一个@last_scene变量,
当进入skill等菜单时,@last_scene被赋值为3,当进入选项菜单时被赋值为1。这样只要判断这个变量是否为3可知玩家是从地图场景进入下图的菜单界面的,还是通过skill等菜单退回到如下的菜单界面的。
由此来决定是开启左菜单还是右菜单。可是我失败了。我发现如果把这个变量变为全局变量是可行的,这是为什么?或者大家还有没有其他好方法?
  1. class Scene_Menu < Scene_MenuBase
  2. #----------------------

  3. #---------------------
  4. #----------------------------------------------------------------------------
  5.   # * 创建菜单选项
  6.   #----------------------------------------------------------------------------
  7.   def create_menu_command
  8.     @menu_command = Window_MenuCommand.new
  9.     @menu_command.set_handler(:cancel, method(:return_scene))
  10.     @menu_command.set_handler(:item, method(:item_ok))
  11.     @menu_command.set_handler(:skill, method(:person_ok))
  12.     @menu_command.set_handler(:equip, method(:person_ok))
  13.     @menu_command.set_handler(:status, method(:person_ok))
  14.     @menu_command.set_handler(:formation, method(:person_ok))
  15.     @menu_command.set_handler(:save, method(:save_ok))
  16.     @menu_command.set_handler(:load, method(:load_ok))
  17.     @menu_command.set_handler(:game_end, method(:end_ok))
  18.     @menu_command.active = (@last_scene != 3 ? true : false)
  19.     @menu_command.select(@last_index)
  20.     @menu_command.opacity = 0
  21.   end
  22.   #-----------------------------------------------------------------------------
  23.   #  *创建人物状态菜单
  24.   #-----------------------------------------------------------------------------
  25.   def create_menustatus_command
  26.     @menustatus_command = Window_NewMenuStatus.new
  27.     @menustatus_command.active = (@last_scene == 3 ? true : false)
  28.     @menustatus_command.set_handler(:cancel, method(:back_command))
  29.     @menustatus_command.set_handler(:ok, method(:status_ok))
  30.     @menustatus_command.select(@last_index2)
  31.     @menustatus_command.opacity = 0
  32.   end
复制代码
  1. class Scene_Skill < Scene_ItemBase
  2.   #--------------------------------------------------------------------------
  3.   # ● 开始处理
  4.   #--------------------------------------------------------------------------
  5.   def start
  6.     super
  7.     create_help_window
  8.     create_command_window
  9.     create_status_window
  10.     create_item_window
  11.     @last_scene = 3
  12.   end
复制代码
  1. class Scene_MenuBase < Scene_Base
  2.   #-----------------------------------------------------------------------------
  3.   #    *初始化
  4.   #-----------------------------------------------------------------------------
  5.   def initialize
  6.     super
  7.     @last_index = 0 if @last_index == nil
  8.     @last_index2 = 0 if @last_index2 == nil
  9.     @last_scene = 0 if @last_scene == nil
  10.   end
  11. end
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
48
在线时间
841 小时
注册时间
2010-8-11
帖子
1135
3
发表于 2014-2-9 05:34:49 | 只看该作者
VA可以直接使用
  1. SceneManager.return
复制代码
返回到前一个场景
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6643
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

4
发表于 2014-2-9 08:33:15 | 只看该作者
返回时使用SceneManager.return而不是SceneManager.call

点评

并且切换场景的时候窗口不都被Scene_Base里面的terminate给dispose掉了……  发表于 2014-2-9 14:18
萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
200
在线时间
120 小时
注册时间
2007-8-17
帖子
147
5
发表于 2014-2-9 09:15:27 | 只看该作者
楼主想的真复杂
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
9 小时
注册时间
2014-2-6
帖子
11
6
 楼主| 发表于 2014-2-9 13:23:30 | 只看该作者
我的设想是:地图场景→场景1:技能→人物→场景2:技能菜单。(从地图进入菜单先冻结右边的菜单)回来的时候:场景2:技能菜单→场景1:人物→技能→地图场景(就是说从技能菜单回来先冻结的是左边的菜单)。可现在是这样的:场景2:技能菜单→场景1:技能→地图场景(和从地图进入菜单一样冻结了右边的菜单),我就想设置一下相应情况左菜单和右菜单的active属性。不是转换场景的问题。

点评

当你从场景1进入场景2后 使用return就会回到场景1 并且自动恢复进入场景2之前的状态  发表于 2014-2-9 14:00
只要你转换场景时使用return就不会有这个问题  发表于 2014-2-9 13:59
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21609
在线时间
9412 小时
注册时间
2012-6-19
帖子
7117

开拓者短篇九导演组冠军

7
发表于 2014-2-9 13:40:18 | 只看该作者
首先是关于你说的那个为什么用实例变量不可行而用全局变量可行的问题……
打开菜单实际上是打开一个菜单实例,切换到其他界面的时候这个菜单实例就被干掉了,实例变量自然无法保留
用局部变量来类比的话差不多是这样:
  1. def mwm5
  2.   jiecao = 0
  3. end
  4. def mwm6
  5.   p jiecao
  6. end
复制代码
上面两个方法,即使执行了mwm5以后执行mwm6结果还是nil,局部变量这个方法结束以后就被干掉了,实例变量这个实例释放以后就被干掉了,一个道理

然后全局变量不会因为实例的释放而被干掉,应该说怎么都干不掉……所以自然能满足你的要求

其他更好的方法的话,你可以试试使用类变量,具体的应用的话原生的脚本中记录菜单的选项位置那块有使用到,或者你也可以上网查查类变量的用法什么的,不过我自己感觉类变量完全没有全局变量用起来方便所以你自己考虑吧……

点评

当然在被弹出来以前和被干掉了差不多……  发表于 2014-2-9 14:02
如果是call的话 菜单实例就没有被干掉 而是存在了SceneManager的栈中  发表于 2014-2-9 14:01
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21609
在线时间
9412 小时
注册时间
2012-6-19
帖子
7117

开拓者短篇九导演组冠军

8
发表于 2014-2-9 14:00:08 | 只看该作者
本帖最后由 喵呜喵5 于 2014-2-9 14:25 编辑


唔,最后直接上脚本
没有经过太详细的测试,不保证百分百没有BUG
  1. class Window_MenuCommand  
  2.   def self.read_command_position
  3.     @@last_command_symbol
  4.   end
  5. end
  6. class Scene_Menu
  7.   alias m5_start start
  8.   def start
  9.     m5_start
  10.     symbol = Window_MenuCommand.read_command_position   
  11.     if symbol == :skill or symbol == :equip or symbol == :status      
  12.       @command_window.deactivate      
  13.       command_personal      
  14.     end   
  15.   end
  16. end
复制代码

点评

谢谢,我用了类变量成功了  发表于 2014-2-9 18:56

评分

参与人数 1梦石 +1 收起 理由
迷糊的安安 + 1 认可答案,非常感谢您的帮助~

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21609
在线时间
9412 小时
注册时间
2012-6-19
帖子
7117

开拓者短篇九导演组冠军

9
发表于 2014-2-9 14:09:54 | 只看该作者
余烬之中 发表于 2014-2-9 08:33
返回时使用SceneManager.return而不是SceneManager.call

会被干掉啊?
原生脚本用的都是SceneManager.return返回上一个场景,不使用类变量连菜单的光标都无法保留啊?
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

百合控

梦石
0
星屑
6643
在线时间
1275 小时
注册时间
2013-8-21
帖子
3657

开拓者

10
发表于 2014-2-9 14:41:25 | 只看该作者
喵呜喵5 发表于 2014-2-9 14:09
会被干掉啊?
原生脚本用的都是SceneManager.return返回上一个场景,不使用类变量连菜单的光标都无法保留 ...

楼主显然是这种情况:呼叫通过set_handler指定的方法激活了人物菜单 然后SceneManager.call呼出更详细的界面(比如某个角色的技能列表)
  1.   def self.call(scene_class)
  2.     @stack.push(@scene)
  3.     [url=home.php?mod=space&uid=420706]@Scene[/url] = scene_class.new
  4.   end

  5.   def self.return
  6.     @scene = @stack.pop
  7.   end
复制代码
这样的话存储结构大概可以这样描述
@stack == [Scene_Menu的实例, Scene_Map的实例, SceneTitle的实例……]
@scene == Scene_Skill的实例
pop的时候会重新new吗?

我写着写着突然顿悟了 根本不需要重新new 但是我们要的不是new……Scene里面起作用的是start 跟随main执行………………
萌新瑟瑟发抖
看到我请叫我去干活
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-12 20:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表