Project1
标题: 關於在主菜單內 在自行新增一個菜單 的問題 [打印本页]
作者: 御之嵐 时间: 2013-11-11 21:48
标题: 關於在主菜單內 在自行新增一個菜單 的問題
本帖最后由 御之嵐 于 2013-11-12 21:51 编辑
RT
目前的成果是
主選單內
新增了一個選項
名為『新增的選單』
點入後
會跑出全螢幕大小的 視窗
用來顯示一些參數的資訊
但是加入了返回指令後
仍然辦法返回
=======================================
我的作法是
1.
在
Window_MenuCommand
新增一條
add_command("新增的選單", :task, main_commands_enabled)
add_command("新增的選單", :task, main_commands_enabled)
2.
然後 新增一個 名為『Window_Task』的腳本
class Window_Task < Window_Selectable
#--------------------------------------------------------------------------
# ● 初始化對象
#--------------------------------------------------------------------------
def initialize
super(0, 0, Graphics.width, Graphics.height)
end
class Window_Task < Window_Selectable
#--------------------------------------------------------------------------
# ● 初始化對象
#--------------------------------------------------------------------------
def initialize
super(0, 0, Graphics.width, Graphics.height)
end
3.
在Scene_Menu
插入
@command_window.set_handler(:task, method(:command_task))
@command_window.set_handler(:task, method(:command_task))
4.
再新增一個 名為『Scene_Task』的腳本
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
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
進的去
出不來
這該怎麼解決?
作者: 喵呜喵5 时间: 2013-11-11 23:40
没有改scene_menu?
你是怎么进去的……?
作者: 774741359 时间: 2013-11-11 23:47
没有来获取玩家的退出指令的代码
作者: 御之嵐 时间: 2013-11-12 14:21
本帖最后由 御之嵐 于 2013-11-12 14:30 编辑
774741359 发表于 2013-11-11 23:47 
没有来获取玩家的退出指令的代码
昨天也有測試出來了
只是不太肯定是不是那個的關係 所以就跑來問問了
Window_Task
改成了
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
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
Scene_Task
改成了
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
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
這樣的確是可以返回了...
這只是利用Window_Status
東砍西砍 誤打誤撞的結果
不知道有沒有比較漂亮的寫法?
作者: 774741359 时间: 2013-11-12 14:31
御之嵐 发表于 2013-11-12 14:21 
昨天也有測試出來了
只是不太肯定是不是那個的關係 所以就跑來問問了
VA简化了很多步骤,建议都自己写一写。
作者: 喵呜喵5 时间: 2013-11-12 17:32
虽然你说你已经改了但是我看了你的脚本还是非常混乱……
Scene_Menu里面你还没有定义名为command_task的方法居然没有报错还能用的好好的实在不可思议……
默认情况下,如果你没有对自带脚本修改的太过分,离开某个scene界面的方法使用的是下面这句:- @menu_command.set_handler(:cancel, method(:return_scene))
复制代码 这句的意思是告诉系统在当前的场景中这个窗口支持一个名字叫cancel的处理,这个处理对应的内容为return_scene
上面的处理被用在了Window_Selectable及其子类中- def cancel_enabled?
- handle?(:cancel)
- end
复制代码 这个方法用来检查这个窗口在当前场景是否有名为cancel的处理,如果有,则表示这个窗口支持取消- def process_handling
- return unless open? && active
- return process_ok if ok_enabled? && Input.trigger?(:C)
- return process_cancel if cancel_enabled? && Input.trigger?(:B)
- return process_pagedown if handle?(:pagedown) && Input.trigger?(:R)
- return process_pageup if handle?(:pageup) && Input.trigger?(:L)
- end
复制代码 上面这个方法用于判定玩家按下了哪些按键并判定按键是否有效,比如这个例子中,第四行就判定了玩家是否按下了取消键同时窗口是否支持取消键,如果支持的话,便会执行取消的处理- def process_cancel
- Sound.play_cancel
- Input.update
- deactivate
- call_cancel_handler
- end
- def call_cancel_handler
- call_handler(:cancel)
- end
复制代码 上面的代码就是取消的处理,关键其实是倒数第二行的call_handler(:cancel),这句代码的作用就是执行该场景中给取消键定义的方法
于是回到最开始的场景中
@menu_command.set_handler(:cancel, method(:return_scene))
前面已经说了,这个取消对应的方法是return_scene,这个return_scene在Scene_Base中,也就是基本上所有的场景默认都支持这个方法
def return_scene
SceneManager.return
end
def return_scene
SceneManager.return
end
这句中的SceneManager.return就是返回到上一个场景,即离开任务界面返回菜单界面的主要语句。
作者: 喵呜喵5 时间: 2013-11-12 18:04
自己写了一遍以后终于发现你的问题出在哪里了
Window_Selectable的子类在载入后会deactivate而你的任务窗口载入之后没有activate,所以窗口没有被激活,无法响应你的操作
以下是完整的脚本:- #~ 窗口部分
- #~ 菜单添加选项
- class Window_MenuCommand < Window_Command
- alias m5_20131112_add_original_commands add_original_commands
- def add_original_commands
- m5_20131112_add_original_commands
- add_command("查看任务", :m5_task)
- end
- end
- #~ 设置显示任务的窗口
- class Window_M5Task < Window_Selectable
- def initialize
- super(0, 0, Graphics.width, Graphics.height)
- draw_text_ex(4, 0, "随便写点什么玩意儿吧")
- activate
- end
- end
- #~ 场景部分
- #~ 场景添加方法
- class Scene_Menu < Scene_MenuBase
- alias m5_20131112_create_command_window create_command_window
- def create_command_window
- m5_20131112_create_command_window
- @command_window.set_handler(:m5_task,method(:command_m5_task))
- end
- def command_m5_task
- SceneManager.call(Scene_M5Task)
- end
- end
- #~ 设置显示任务的场景
- class Scene_M5Task < Scene_MenuBase
- def start
- super
- @status_window = Window_M5Task.new
- @status_window.set_handler(:cancel, method(:return_scene))
- end
- end
复制代码
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |