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

Project1

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

[RMVX发布] 雪流星脚本教程 Scene_Base

 关闭 [复制链接]

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

跳转到指定楼层
1
发表于 2008-5-11 13:22:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
雪流星脚本教程 Scene_Base

应禾西的要求写了 Scene_Base 的教程

首先先来看看RMXP的脚本(RGSS),RGSS中并没有Scene_Base这个脚本,所以我们先来看看 Scene_End
以下脚本是我为了缩短篇幅以及容易解释而简化的:

  1. class Scene_End
  2.   def main
  3.     @command_window = Window_Command.new(192, ["返回标题画面", "退出", "取消"])
  4.     @command_window.x = 320 - @command_window.width / 2
  5.     @command_window.y = 240 - @command_window.height / 2
  6.     Graphics.transition
  7.     loop do
  8.       Graphics.update
  9.       Input.update
  10.       update
  11.       if $scene != self
  12.         break
  13.       end
  14.     end
  15.     Graphics.freeze
  16.     @command_window.dispose
  17.     if $scene.is_a?(Scene_Title)
  18.       Graphics.transition
  19.       Graphics.freeze
  20.     end
  21.   end
  22.   def update
  23.     @command_window.update
  24.     if Input.trigger?(Input::B)
  25.       $game_system.se_play($data_system.cancel_se)
  26.       $scene = Scene_Menu.new(5)
  27.       return
  28.     end
  29.     if Input.trigger?(Input::C)
  30.       case @command_window.index
  31.       when 0
  32.         $game_system.se_play($data_system.decision_se)
  33.         Audio.bgm_fade(800)
  34.         Audio.bgs_fade(800)
  35.         Audio.me_fade(800)
  36.         $scene = Scene_Title.new
  37.       when 1
  38.         $game_system.se_play($data_system.decision_se)
  39.         Audio.bgm_fade(800)
  40.         Audio.bgs_fade(800)
  41.         Audio.me_fade(800)
  42.         $scene = nil
  43.       when 2
  44.         $game_system.se_play($data_system.decision_se)
  45.         $scene = Scene_Menu.new(5)
  46.       end
  47.       return
  48.     end
  49.   end
  50. 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

  1.   def create_command_window
  2.     s1 = Vocab::to_title
  3.     s2 = Vocab::shutdown
  4.     s3 = Vocab::cancel
  5.     @command_window = Window_Command.new(172, [s1, s2, s3])
  6.     @command_window.x = (544 - @command_window.width) / 2
  7.     @command_window.y = (416 - @command_window.height) / 2
  8.     @command_window.openness = 0
  9. end
复制代码

而post_start里调用了一个open_command_window

  1.   def open_command_window
  2.     @command_window.open
  3.     begin
  4.       @command_window.update
  5.       Graphics.update
  6.     end until @command_window.openness == 255
  7.   end
复制代码

这里用到了窗口的openess属性,下次讲到窗口的时候再来详细的讨论
这个属性是用来做成窗口打开的动画用的。
在start里面将openess设为0,然後在post_start里面打开。
所以我们进入Scene_End时会看到指令窗口是渐渐从中间向外打开的。

如果我们把open_command_window放到start里面的话,由於start後面接着就是淡入渐变
就看不到这个效果了。
pre_terminate 也是同样的效果,如果把close_command_window放在terminate里面的话
由於画面已经被Graphics.freeze冻结了,所以就看不到关闭窗口的动画了。

讲到这里,剩下还有四个没有讲,因为那四个只是关於截图做背景而已,
如果想要制作自制背景的话,可以参考来用。
稍微讲一下

  1.   def snapshot_for_background
  2.     $game_temp.background_bitmap.dispose
  3.     $game_temp.background_bitmap = Graphics.snap_to_bitmap
  4.     $game_temp.background_bitmap.blur
  5.   end
复制代码

这段基本是在切换出地图画面时调用的
第一句将原来的释放掉,再来将当前画面截图,最後将其模糊。


  1.   def create_menu_background
  2.     @menuback_sprite = Sprite.new # 生成背景精灵对象
  3.     @menuback_sprite.bitmap = $game_temp.background_bitmap # 获取地图截图
  4.     @menuback_sprite.color.set(16, 16, 16, 128) # 设背景色调为暗
  5.     update_menu_background # 更新背景
  6.   end
复制代码

这段几乎每个场景都会调用,就是将刚才所截的图设为背景。
如果要自制背景,第二句是关键,如果将指定图片代入@menuback_sprite.bitmap,就成了自制背景了


  1.   def dispose_menu_background
  2.     @menuback_sprite.dispose
  3.   end
复制代码

这段不用说什麽,就是在离开场景前释放背景


  1.   def update_menu_background
  2.   end
复制代码

这段更不用说什麽,空的,随我们扩充。
VA脚本开工中...
偷窃脚本1.0 - 已完成
头像被屏蔽

Lv1.梦旅人 (禁止发言)

超级白痴

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-5-2
帖子
140
2
发表于 2008-5-11 16:56:00 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1020
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

3
发表于 2008-5-11 17:07:31 | 只看该作者
補上兩點:
1.Scene_Base 的存在意義
除了上面提及的「为了重复调用、以及让脚本清晰化」以外,還有一個重要的原因是减少衝突。
我們可以用 alias 或者 def 語句修改具體需要修改的地方而不會引起衝突
2.補上雪殿下忘記的 Scene_Base 腳本:

  1. #==============================================================================
  2. # ■ Scene_Base
  3. #------------------------------------------------------------------------------
  4. #  ゲーム中のすべてのシーンのスーパークラスです。
  5. #==============================================================================

  6. class Scene_Base
  7.   #--------------------------------------------------------------------------
  8.   # ● メイン処理
  9.   #--------------------------------------------------------------------------
  10.   def main
  11.     start                         # 開始処理
  12.     perform_transition            # トランジション実行
  13.     post_start                    # 開始後処理
  14.     Input.update                  # 入力情報を更新
  15.     loop do
  16.       Graphics.update             # ゲーム画面を更新
  17.       Input.update                # 入力情報を更新
  18.       update                      # フレーム更新
  19.       break if $scene != self     # 画面が切り替わったらループを中断
  20.     end
  21.     Graphics.update
  22.     pre_terminate                 # 終了前処理
  23.     Graphics.freeze               # トランジション準備
  24.     terminate                     # 終了処理
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 開始処理
  28.   #--------------------------------------------------------------------------
  29.   def start
  30.   end
  31.   #--------------------------------------------------------------------------
  32.   # ● トランジション実行
  33.   #--------------------------------------------------------------------------
  34.   def perform_transition
  35.     Graphics.transition(10)
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 開始後処理
  39.   #--------------------------------------------------------------------------
  40.   def post_start
  41.   end
  42.   #--------------------------------------------------------------------------
  43.   # ● フレーム更新
  44.   #--------------------------------------------------------------------------
  45.   def update
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 終了前処理
  49.   #--------------------------------------------------------------------------
  50.   def pre_terminate
  51.   end
  52.   #--------------------------------------------------------------------------
  53.   # ● 終了処理
  54.   #--------------------------------------------------------------------------
  55.   def terminate
  56.   end
  57.   #--------------------------------------------------------------------------
  58.   # ● 別画面の背景として使うためのスナップショット作成
  59.   #--------------------------------------------------------------------------
  60.   def snapshot_for_background
  61.     $game_temp.background_bitmap.dispose
  62.     $game_temp.background_bitmap = Graphics.snap_to_bitmap
  63.     $game_temp.background_bitmap.blur
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● メニュー画面系の背景作成
  67.   #--------------------------------------------------------------------------
  68.   def create_menu_background
  69.     @menuback_sprite = Sprite.new
  70.     @menuback_sprite.bitmap = $game_temp.background_bitmap
  71.     @menuback_sprite.color.set(16, 16, 16, 128)
  72.     update_menu_background
  73.   end
  74.   #--------------------------------------------------------------------------
  75.   # ● メニュー画面系の背景解放
  76.   #--------------------------------------------------------------------------
  77.   def dispose_menu_background
  78.     @menuback_sprite.dispose
  79.   end
  80.   #--------------------------------------------------------------------------
  81.   # ● メニュー画面系の背景更新
  82.   #--------------------------------------------------------------------------
  83.   def update_menu_background
  84.   end
  85. end
复制代码


衷心感謝雪流星..<(_ _)>
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

4
发表于 2008-5-11 17:14:05 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2010-6-20
帖子
13
5
发表于 2010-6-22 09:07:09 | 只看该作者
有啥意义……
看了下子类里出现super,结果跑到父类一看是空的……不知道有啥意义……

点评

千万年前的老帖子了。 空方法的存在是为了是脚本清晰。 有什么疑问可以PM作者或者在另开贴,对于这样的老帖来说。  发表于 2010-6-22 09:42

评分

参与人数 1星屑 -200 收起 理由
提妲 -200

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 10:43

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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