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

Project1

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

[原创发布] scene gameover的SceneManager.goto(Scene_Title)变为(Scene_load)

[复制链接]

Lv2.观梦者

梦石
0
星屑
535
在线时间
49 小时
注册时间
2018-8-23
帖子
83
跳转到指定楼层
1
发表于 2018-11-17 11:42:57 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
首先,如何改呢?

评分

参与人数 2+2 收起 理由
guoxiaomi + 1 塞糖
真·可乐 + 1 塞糖

查看全部评分

这个账号已弃权

Lv4.逐梦者

梦石
8
星屑
4801
在线时间
1567 小时
注册时间
2014-1-9
帖子
402

开拓者

7
发表于 2018-11-17 20:02:21 | 只看该作者
本帖最后由 余音·魔眼 于 2018-11-17 20:07 编辑

楼主能改出来已经很不错了,不过不知道楼主有没有注意到这一点,跳转到读档界面后按x键就会直接退出窗口。那是因为本身Scene_Load的父类Scene_File中含有return_scene方法,它在
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 存档文件“取消”
  3.   #--------------------------------------------------------------------------
  4.   def on_savefile_cancel
  5.     Sound.play_cancel
  6.     return_scene
  7.   end
(也就是Scene_File的143-149行的位置)
这是因为楼主修改后依然调用的是goto,也就是SceneManager(这是个模块)中的goto方法,在SceneManager的49-54行位置可以找到
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 直接切换某个场景(无过渡)
  3.   #--------------------------------------------------------------------------
  4.   def self.goto(scene_class)
  5.     #这里没有存储场景
  6.     @scene = scene_class.new
  7.   end

它与55-61行的call方法有什么区别呢,再来看一下call方法
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 切换
  3.   #--------------------------------------------------------------------------
  4.   def self.call(scene_class)
  5.     @stack.push(@scene) #这里的@stack存储的是之前的场景,存储之后,在当前场景中按x键就可以返回先前@stack最后存储的场景了。
  6.     @scene = scene_class.new
  7.   end

我们再来看一下return_scene方法, return_scene定义在所有Scene 类(场景类)的父类中,在108-113行位置:
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 返回前一个场景
  3.   #--------------------------------------------------------------------------
  4.   def return_scene
  5.     SceneManager.return
  6.   end

调用的是SceneManager的.return方法,在SceneManager的62-67行位置
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 返回到上一个场景
  3.   #--------------------------------------------------------------------------
  4.   def self.return
  5.     @scene = @stack.pop
  6.   end

这里意思是将@stack存储的最后一个场景的类赋给当前场景,并删除之前存储的最后一个场景。好了我们知道goto方法中并没有存储之前的场景,所以这时@stack就为空数组,空数组本身就没任何元素,所以就不能删元素,所以就为nil了(这里不懂的话帮助文档Array当中都有),@stack.pop为nil,所以这时@scene = nil,@scene就为nil了,@scene为nil时就会自动退出游戏,不懂的话可以参考exit方法,也就是74-79行。
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 退出游戏
  3.   #--------------------------------------------------------------------------
  4.   def self.exit
  5.     @scene = nil
  6.   end


另外不介意在默认脚本中修改,应该以插件脚本的方式插入脚本库当中,以免修改错误还得从新工程复制重来,插件脚本可以这么写:
RUBY 代码复制
  1. module ReturnLoad #定义模块, ReturnLoad为模块的名字,取啥名都好,只要开头大写
  2.   SWI_ID = 10 #10号开关开启时返回读档界面,否则标题
  3. end
  4. class Scene_GameoverLoad < Scene_Load #将Scene_GameoverLoad类继承Scene_Load类,这里用继承是因为直接在Scene_Load中修改会影响其他调用Scene_Load的地方,毕竟只有游戏结束时的读档界面不能返回
  5. #前面我们找到了调用return_scene的地方,也就是on_savefile_cancel方法,所以将调用on_savefile_cancel的地方删除,重写update_savefile_selection方法(因为这是新建的类,所以重写也没事),将原来的
  6. #def update_savefile_selection
  7.    #return on_savefile_ok     if Input.trigger?(:C)
  8.     #return on_savefile_cancel if Input.trigger?(:B)
  9.    #update_cursor
  10.   #end
  11. #改为:
  12.   def update_savefile_selection
  13.     return on_savefile_ok     if Input.trigger?(:C)
  14.     update_cursor
  15.   end
  16. #--
  17. end
  18. class Scene_Gameover #引用Scene_Gameover类
  19.   alias return_load_goto_title goto_title,#重命名goto_title方法,将原先的goto_title名字改为return_load_goto_title
  20.   def goto_title
  21.     if $game_switches[ReturnLoad::SWI_ID] #如果开关[ReturnLoad模块的SWI_ID常量]开启时(方括号内为开关ID)
  22.       fadeout_all #淡出画面
  23.       SceneManager.goto(Scene_GameoverLoad) #直接切换到Scene_GameoverLoad场景(无过渡)(也就是不能返回上个场景的读档界面)
  24.     else #否则
  25.       return_load_goto_title #调用原先的goto_title方法,也就是现在的return_load_goto_title方法
  26.     end
  27.   end
  28. end

评分

参与人数 1+1 收起 理由
百里_飞柳 + 1 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
10
星屑
39587
在线时间
1920 小时
注册时间
2010-11-14
帖子
3320

R考场第七期纪念奖

6
发表于 2018-11-17 15:52:28 | 只看该作者
不是打击LZ,不过最好讲一讲猴子补丁。
直接改默认代码的话,改错一步还要从新工程里复制。
所以最好是复制一份Scene_Gameover到插件脚本的地方,删除不要的部分,再修改。

另外,凡是改默认代码尤其是使用率高的,都建议使用别名。
这样可以增加你的代码和别人代码的兼容性。
用alias关键字给你的方法起别名,然后新增一个module,在module里设置一个这样的开关,
用于控制是使用默认的返回标题还是打开读档。
这样会更加符合插件脚本的思想。
用头画头像,用脚写脚本
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
535
在线时间
49 小时
注册时间
2018-8-23
帖子
83
5
 楼主| 发表于 2018-11-17 11:57:40 | 只看该作者
效果很好(注意不是标题画面)

2345截图20181117115753.png (98.7 KB, 下载次数: 39)

2345截图20181117115753.png
这个账号已弃权
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
535
在线时间
49 小时
注册时间
2018-8-23
帖子
83
4
 楼主| 发表于 2018-11-17 11:49:47 | 只看该作者
本帖最后由 可爱的小灰灰 于 2018-11-17 11:56 编辑

之后把脚本第84行的SceneManager.goto(Scene_Title)改为SceneManager.goto(Scene_load)
(第80行的“切换到标题画面”你们自己改成“切换到读档画面”)
还有第82行和30行的的def goto_title goto_title if Input.trigger?(:C) 改为def goto_load goto_Load if Input.trigger?(:C)

2345截图20181117114931.png (28.47 KB, 下载次数: 37)

2345截图20181117114931.png

2345截图20181117115017.png (5.04 KB, 下载次数: 36)

2345截图20181117115017.png
这个账号已弃权
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
535
在线时间
49 小时
注册时间
2018-8-23
帖子
83
3
 楼主| 发表于 2018-11-17 11:46:05 | 只看该作者
然后找到scene gameover的脚本

2345截图20181117114628.png (6.91 KB, 下载次数: 35)

2345截图20181117114628.png
这个账号已弃权
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
535
在线时间
49 小时
注册时间
2018-8-23
帖子
83
2
 楼主| 发表于 2018-11-17 11:44:26 | 只看该作者
首先,打开脚本编辑器。

2345截图20181117114440.png (96.7 KB, 下载次数: 36)

2345截图20181117114440.png
这个账号已弃权
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 11:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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