Project1
标题:
雪流星脚本教程 Scene_Base
[打印本页]
作者:
雪流星
时间:
2008-5-11 13:22
标题:
雪流星脚本教程 Scene_Base
雪流星脚本教程 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
复制代码
这段更不用说什麽,空的,随我们扩充。
作者:
Fight。
时间:
2008-5-11 16:56
提示:
作者被禁止或删除 内容自动屏蔽
作者:
禾西
时间:
2008-5-11 17:07
補上兩點:
1.Scene_Base 的存在意義
除了上面提及的「为了重复调用、以及让脚本清晰化」以外,還有一個重要的原因是减少衝突。
我們可以用 alias 或者 def 語句修改具體需要修改的地方而不會引起衝突
2.補上雪殿下忘記的 Scene_Base 腳本:
#==============================================================================
# ■ Scene_Base
#------------------------------------------------------------------------------
# ゲーム中のすべてのシーンのスーパークラスです。
#==============================================================================
class Scene_Base
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
def main
start # 開始処理
perform_transition # トランジション実行
post_start # 開始後処理
Input.update # 入力情報を更新
loop do
Graphics.update # ゲーム画面を更新
Input.update # 入力情報を更新
update # フレーム更新
break if $scene != self # 画面が切り替わったらループを中断
end
Graphics.update
pre_terminate # 終了前処理
Graphics.freeze # トランジション準備
terminate # 終了処理
end
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
end
#--------------------------------------------------------------------------
# ● トランジション実行
#--------------------------------------------------------------------------
def perform_transition
Graphics.transition(10)
end
#--------------------------------------------------------------------------
# ● 開始後処理
#--------------------------------------------------------------------------
def post_start
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
end
#--------------------------------------------------------------------------
# ● 終了前処理
#--------------------------------------------------------------------------
def pre_terminate
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
def terminate
end
#--------------------------------------------------------------------------
# ● 別画面の背景として使うためのスナップショット作成
#--------------------------------------------------------------------------
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
#--------------------------------------------------------------------------
# ● メニュー画面系の背景解放
#--------------------------------------------------------------------------
def dispose_menu_background
@menuback_sprite.dispose
end
#--------------------------------------------------------------------------
# ● メニュー画面系の背景更新
#--------------------------------------------------------------------------
def update_menu_background
end
end
复制代码
衷心感謝雪流星..<(_ _)>
作者:
沉影不器
时间:
2008-5-11 17:14
提示:
作者被禁止或删除 内容自动屏蔽
作者:
霈岚
时间:
2010-6-22 09:07
有啥意义……
看了下子类里出现super,结果跑到父类一看是空的……不知道有啥意义……
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1