查看: 2130|回复: 7

[已经解决] 關於在主菜單內 在自行新增一個菜單 的問題

[复制链接]
梦石
0
星屑
5246
在线时间
760 小时
注册时间
2009-1-21
回帖
236
发表于 2013-11-11 21:48:14 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 御之嵐 于 2013-11-12 21:51 编辑

RT

目前的成果是

主選單內
新增了一個選項
名為『新增的選單』
%%1.jpg


點入後
會跑出全螢幕大小的 視窗
%%2.jpg

用來顯示一些參數的資訊


但是加入了返回指令後
仍然辦法返回

=======================================

我的作法是

1.
在
Window_MenuCommand
新增一條
[pre lang="ruby" line="1"]    add_command("新增的選單", :task,   main_commands_enabled)[/pre]


2.
然後 新增一個 名為『Window_Task』的腳本
[pre lang="ruby" line="1"]class Window_Task < Window_Selectable

  #--------------------------------------------------------------------------
  # ● 初始化對象
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, Graphics.width, Graphics.height)
  end[/pre]

3.
在Scene_Menu
插入
[pre lang="ruby" line="1"]@command_window.set_handler(:task,      method(:command_task))[/pre]


4.
再新增一個 名為『Scene_Task』的腳本
[pre lang="ruby" line="1"]
class Scene_Task< Scene_MenuBase            
  #--------------------------------------------------------------------------
  # ● 開始處理
  #--------------------------------------------------------------------------
  def start                               #開始
    super
    create_background               #創建選單背景
    create_menu_command
  end
  
  #----------------------------------------------------------------------------
# * 创建菜单选项
#----------------------------------------------------------------------------
def create_menu_command
@menu_command = Window_Task.new  #呼叫視窗
  @menu_command.set_handler(:cancel,    method(:return_scene))   #返回上一個場景
end

  #--------------------------------------------------------------------------
  # ● 生成背景
  #--------------------------------------------------------------------------
  def create_background
    @background_sprite = Sprite.new
    @background_sprite.bitmap = SceneManager.background_bitmap
    @background_sprite.color.set(16, 16, 16, 128)
  end
  #--------------------------------------------------------------------------
  # ● 釋放背景
  #--------------------------------------------------------------------------
  def dispose_background
    @background_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● 結束處理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_background
  end
end[/pre]

進的去
出不來

這該怎麼解決?

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2013-11-11 23:40:49 | 显示全部楼层
没有改scene_menu?
你是怎么进去的……?

点评

漏了,已補上  发表于 2013-11-12 14:13
回复

使用道具 举报

梦石
0
星屑
100
在线时间
211 小时
注册时间
2011-8-16
回帖
246
发表于 2013-11-11 23:47:03 | 显示全部楼层
没有来获取玩家的退出指令的代码

评分

参与人数 1星屑 +1 收起 理由
御之嵐 + 1

查看全部评分

RPGMaker 脚本/学习交流群:143356012
回复

使用道具 举报

梦石
0
星屑
5246
在线时间
760 小时
注册时间
2009-1-21
回帖
236
 楼主| 发表于 2013-11-12 14:21:18 | 显示全部楼层
本帖最后由 御之嵐 于 2013-11-12 14:30 编辑
774741359 发表于 2013-11-11 23:47
没有来获取玩家的退出指令的代码


昨天也有測試出來了
只是不太肯定是不是那個的關係  所以就跑來問問了

Window_Task
改成了
[pre lang="ruby" line="1"]class Window_Task < Window_Selectable
#--------------------------------------------------------------------------
  # ● 初始化對象
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(0, 0, Graphics.width, Graphics.height)
     @actor= actor
    refresh
    activate
  end
  #--------------------------------------------------------------------------
  # ● 設置角色
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor== actor
    @actor= actor
  end
end[/pre]


Scene_Task
改成了
[pre lang="ruby" line="1"]
class Scene_Task< Scene_MenuBase            
  
  #--------------------------------------------------------------------------
  # ● 開始處理
  #--------------------------------------------------------------------------
  def start                               #開始
    super
    create_background               #創建選單背景
    create_menu_command
  end
  
  #----------------------------------------------------------------------------
# * 创建菜单选项
#----------------------------------------------------------------------------
def create_menu_command
  @menu_command = Window_Task.new(@actor)
#~ @menu_command = Window_Task.new
  @menu_command.set_handler(:cancel,    method(:return_scene))
end

  #--------------------------------------------------------------------------
  # ● 生成背景
  #--------------------------------------------------------------------------
  def create_background
    @background_sprite = Sprite.new
    @background_sprite.bitmap = SceneManager.background_bitmap
    @background_sprite.color.set(16, 16, 16, 128)
  end
  #--------------------------------------------------------------------------
  # ● 釋放背景
  #--------------------------------------------------------------------------
  def dispose_background
    @background_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● 結束處理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_background
  end
end
[/pre]

這樣的確是可以返回了...

這只是利用Window_Status
東砍西砍 誤打誤撞的結果
不知道有沒有比較漂亮的寫法?   
回复

使用道具 举报

梦石
0
星屑
100
在线时间
211 小时
注册时间
2011-8-16
回帖
246
发表于 2013-11-12 14:31:16 | 显示全部楼层
御之嵐 发表于 2013-11-12 14:21
昨天也有測試出來了
只是不太肯定是不是那個的關係  所以就跑來問問了

VA简化了很多步骤,建议都自己写一写。

点评

恩 了解  发表于 2013-11-12 21:14
RPGMaker 脚本/学习交流群:143356012
回复

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2013-11-12 17:32:14 | 显示全部楼层
虽然你说你已经改了但是我看了你的脚本还是非常混乱……
Scene_Menu里面你还没有定义名为command_task的方法居然没有报错还能用的好好的实在不可思议……

默认情况下,如果你没有对自带脚本修改的太过分,离开某个scene界面的方法使用的是下面这句:
  1. @menu_command.set_handler(:cancel,    method(:return_scene))
复制代码
这句的意思是告诉系统在当前的场景中这个窗口支持一个名字叫cancel的处理,这个处理对应的内容为return_scene

上面的处理被用在了Window_Selectable及其子类中
  1.   def cancel_enabled?
  2.     handle?(:cancel)
  3.   end
复制代码
这个方法用来检查这个窗口在当前场景是否有名为cancel的处理,如果有,则表示这个窗口支持取消
  1.   def process_handling
  2.     return unless open? && active
  3.     return process_ok       if ok_enabled?        && Input.trigger?(:C)
  4.     return process_cancel   if cancel_enabled?    && Input.trigger?(:B)
  5.     return process_pagedown if handle?(:pagedown) && Input.trigger?(:R)
  6.     return process_pageup   if handle?(:pageup)   && Input.trigger?(:L)
  7.   end
复制代码
上面这个方法用于判定玩家按下了哪些按键并判定按键是否有效,比如这个例子中,第四行就判定了玩家是否按下了取消键同时窗口是否支持取消键,如果支持的话,便会执行取消的处理
  1.   def process_cancel
  2.     Sound.play_cancel
  3.     Input.update
  4.     deactivate
  5.     call_cancel_handler
  6.   end
  7.   def call_cancel_handler
  8.     call_handler(:cancel)
  9.   end
复制代码
上面的代码就是取消的处理,关键其实是倒数第二行的call_handler(:cancel),这句代码的作用就是执行该场景中给取消键定义的方法

于是回到最开始的场景中
@menu_command.set_handler(:cancel,    method(:return_scene))

前面已经说了,这个取消对应的方法是return_scene,这个return_scene在Scene_Base中,也就是基本上所有的场景默认都支持这个方法
[pre lang="ruby" line="1"]  def return_scene
    SceneManager.return
  end[/pre]
这句中的SceneManager.return就是返回到上一个场景,即离开任务界面返回菜单界面的主要语句。

评分

参与人数 1星屑 +1 收起 理由
御之嵐 + 1 那個,我是在文章忘了說明吶 ( 艸).

查看全部评分

回复

使用道具 举报

梦石
1
星屑
23241
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2013-11-12 18:04:07 | 显示全部楼层
自己写了一遍以后终于发现你的问题出在哪里了

Window_Selectable的子类在载入后会deactivate而你的任务窗口载入之后没有activate,所以窗口没有被激活,无法响应你的操作

以下是完整的脚本:
  1. #~ 窗口部分
  2. #~ 菜单添加选项
  3. class Window_MenuCommand < Window_Command
  4.   alias m5_20131112_add_original_commands add_original_commands
  5.   def add_original_commands
  6.     m5_20131112_add_original_commands
  7.     add_command("查看任务", :m5_task)
  8.   end
  9. end
  10. #~ 设置显示任务的窗口
  11. class Window_M5Task < Window_Selectable
  12.   def initialize
  13.     super(0, 0, Graphics.width, Graphics.height)
  14.     draw_text_ex(4, 0, "随便写点什么玩意儿吧")
  15.     activate
  16.   end
  17. end
  18. #~ 场景部分
  19. #~ 场景添加方法
  20. class Scene_Menu < Scene_MenuBase
  21.   alias m5_20131112_create_command_window create_command_window
  22.   def create_command_window
  23.     m5_20131112_create_command_window
  24.     @command_window.set_handler(:m5_task,method(:command_m5_task))
  25.   end
  26.   def command_m5_task
  27.     SceneManager.call(Scene_M5Task)
  28.   end
  29. end
  30. #~ 设置显示任务的场景
  31. class Scene_M5Task < Scene_MenuBase  
  32.   def start
  33.     super
  34.     @status_window = Window_M5Task.new
  35.     @status_window.set_handler(:cancel,   method(:return_scene))
  36.   end  
  37. end
复制代码

点评

感謝,我了解了,就是視窗開啟之後 要多加一句 activate 功能才會作用,對吧?。感謝你的幫忙  发表于 2013-11-12 21:29

评分

参与人数 1星屑 +2 收起 理由
御之嵐 + 2

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部