| 
 
| 赞 | 4 |  
| VIP | 71 |  
| 好人卡 | 22 |  
| 积分 | 7 |  
| 经验 | 32145 |  
| 最后登录 | 2013-8-9 |  
| 在线时间 | 184 小时 |  
 Lv2.观梦者 天仙 
	梦石0 星屑680 在线时间184 小时注册时间2008-4-15帖子5023 
 | 
| 
雪流星脚本教程 Scene_Base
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 应禾西的要求写了 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 
这段更不用说什麽,空的,随我们扩充。
 | 
 |