赞 | 5 |
VIP | 71 |
好人卡 | 22 |
积分 | 6 |
经验 | 32145 |
最后登录 | 2013-8-9 |
在线时间 | 184 小时 |
Lv2.观梦者 天仙
- 梦石
- 0
- 星屑
- 620
- 在线时间
- 184 小时
- 注册时间
- 2008-4-15
- 帖子
- 5023
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
雪流星脚本教程 Scene_Base
应禾西的要求写了 Scene_Base 的教程
首先先来看看RMXP的脚本(RGSS),RGSS中并没有Scene_Base这个脚本,所以我们先来看看 Scene_End
以下脚本是我为了缩短篇幅以及容易解释而简化的:
- class Scene_End
- def main
- @command_window = Window_Command.new(192, ["返回标题画面", "退出", "取消"])
- @command_window.x = 320 - @command_window.width / 2
- @command_window.y = 240 - @command_window.height / 2
- Graphics.transition
- loop do
- Graphics.update
- Input.update
- update
- if $scene != self
- break
- end
- end
- Graphics.freeze
- @command_window.dispose
- if $scene.is_a?(Scene_Title)
- Graphics.transition
- Graphics.freeze
- end
- end
- def update
- @command_window.update
- if Input.trigger?(Input::B)
- $game_system.se_play($data_system.cancel_se)
- $scene = Scene_Menu.new(5)
- return
- end
- if Input.trigger?(Input::C)
- case @command_window.index
- when 0
- $game_system.se_play($data_system.decision_se)
- Audio.bgm_fade(800)
- Audio.bgs_fade(800)
- Audio.me_fade(800)
- $scene = Scene_Title.new
- when 1
- $game_system.se_play($data_system.decision_se)
- Audio.bgm_fade(800)
- Audio.bgs_fade(800)
- Audio.me_fade(800)
- $scene = nil
- when 2
- $game_system.se_play($data_system.decision_se)
- $scene = Scene_Menu.new(5)
- end
- return
- end
- end
- end
复制代码
我们可以看到,事实上一个Scene只有两个(事实上是三个)方法,main 和 update
而main里面也就是一个不断调用update的循环,换句话说,一个Scene完全可以只有一个main就足够了。
之所以分成这么多个方法,就如同前面提到过的,是为了重复调用、以及让脚本清晰化。
如果你注意看看XP的脚本,每个Scene都有一个main,然后在main的前面生成各种对象,main的后面释放各种对象。
中间的loop do ……. end 完全是重复的
这就是Scene_Base在RGSS2中会出现的原因,
我们来看看Scene_Base的main里面有调用什么方法,依序是:
start, perform_transition, post_start, update, pre_terminate, terminate
其中perform_transition只有一句,完全是为了让脚本作者扩充所用,这次就先不谈它了。
对应XP脚本当中「生成对象」和「释放对象」的部分就是start和terminate。
所以Scene_Base直接将main当中的循环写出来,
其他的Scene只要调用方法把生成对象、解放对象的代码写在start和terminate两个方法里面就行了。
post_start 和 pre_terminate 基本上与 start 和terminate相同,但是这两个是放在淡出/入渐变的前(後)面。
那麽有什麽不同呢?
我们来看看,默认脚本中,哪些调用了post_start?
全局搜索一下,就发现Scene+Title、Scene_End、Scene_Battle都调用了这个函数。
先来看看Scene_End,在start里面调用了def create_command_window
- def create_command_window
- s1 = Vocab::to_title
- s2 = Vocab::shutdown
- s3 = Vocab::cancel
- @command_window = Window_Command.new(172, [s1, s2, s3])
- @command_window.x = (544 - @command_window.width) / 2
- @command_window.y = (416 - @command_window.height) / 2
- @command_window.openness = 0
- end
复制代码
而post_start里调用了一个open_command_window
- def open_command_window
- @command_window.open
- begin
- @command_window.update
- Graphics.update
- end until @command_window.openness == 255
- end
复制代码
这里用到了窗口的openess属性,下次讲到窗口的时候再来详细的讨论
这个属性是用来做成窗口打开的动画用的。
在start里面将openess设为0,然後在post_start里面打开。
所以我们进入Scene_End时会看到指令窗口是渐渐从中间向外打开的。
如果我们把open_command_window放到start里面的话,由於start後面接着就是淡入渐变
就看不到这个效果了。
pre_terminate 也是同样的效果,如果把close_command_window放在terminate里面的话
由於画面已经被Graphics.freeze冻结了,所以就看不到关闭窗口的动画了。
讲到这里,剩下还有四个没有讲,因为那四个只是关於截图做背景而已,
如果想要制作自制背景的话,可以参考来用。
稍微讲一下
- def snapshot_for_background
- $game_temp.background_bitmap.dispose
- $game_temp.background_bitmap = Graphics.snap_to_bitmap
- $game_temp.background_bitmap.blur
- end
复制代码
这段基本是在切换出地图画面时调用的
第一句将原来的释放掉,再来将当前画面截图,最後将其模糊。
- def create_menu_background
- @menuback_sprite = Sprite.new # 生成背景精灵对象
- @menuback_sprite.bitmap = $game_temp.background_bitmap # 获取地图截图
- @menuback_sprite.color.set(16, 16, 16, 128) # 设背景色调为暗
- update_menu_background # 更新背景
- end
复制代码
这段几乎每个场景都会调用,就是将刚才所截的图设为背景。
如果要自制背景,第二句是关键,如果将指定图片代入@menuback_sprite.bitmap,就成了自制背景了
- def dispose_menu_background
- @menuback_sprite.dispose
- end
复制代码
这段不用说什麽,就是在离开场景前释放背景
- def update_menu_background
- end
复制代码
这段更不用说什麽,空的,随我们扩充。 |
|