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

Project1

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

[讨论] 癫狂侠客的脚本探索之旅——Scene之运行开始篇

[复制链接]

Lv2.观梦者

梦石
0
星屑
432
在线时间
4175 小时
注册时间
2010-6-26
帖子
6474
跳转到指定楼层
1
 楼主| 发表于 2013-1-21 21:46:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 eve592370698 于 2013-1-21 21:50 编辑

想必有不少新手看到了一些人做出来的动态标题以及跳过标题等,说真的,动态标题我看了就头大啊!而跳过标题呢?我也使用过,有些出现这种情况:使用RMXP做战斗测试结果失效了!
还有,当我在一些脚本里面使用$game_switches和$game_variables作为条件判定的时候,脚本也会出现各种各样的错误,为啥呢?
友情提示,探索之负责游戏运行的开始,并不涉及到游戏的重启,主要是探索从启动游戏到真正弹出标题画面菜单之前这一瞬间游戏在做什么。
当然,首先是把游戏的各个脚本预读以便,然后确定常量赋值,然后呢?废话不说,先上原版的Scene_Title查看main的前面那几行
RUBY 代码复制
  1. # 战斗测试的情况下
  2.     if $BTEST
  3.       battle_test
  4.       return
  5.     end
  6.     # 载入数据库
  7.     $data_actors        = load_data("Data/Actors.rxdata")
  8.     $data_classes       = load_data("Data/Classes.rxdata")
  9.     $data_skills        = load_data("Data/Skills.rxdata")
  10.     $data_items         = load_data("Data/Items.rxdata")
  11.     $data_weapons       = load_data("Data/Weapons.rxdata")
  12.     $data_armors        = load_data("Data/Armors.rxdata")
  13.     $data_enemies       = load_data("Data/Enemies.rxdata")
  14.     $data_troops        = load_data("Data/Troops.rxdata")
  15.     $data_states        = load_data("Data/States.rxdata")
  16.     $data_animations    = load_data("Data/Animations.rxdata")
  17.     $data_tilesets      = load_data("Data/Tilesets.rxdata")
  18.     $data_common_events = load_data("Data/CommonEvents.rxdata")
  19.     $data_system        = load_data("Data/System.rxdata")
  20.     # 生成系统对像
  21.     $game_system = Game_System.new
这是在生成标题菜单之前,游戏先判定,如果开启了战斗测试,那么就跳过这些读取数据,转而运行战斗测试,反之读取数据。这就不难看出,上面只有可怜的一个
$game_system = Game_System.new
也就是说剩下的游戏全局变量组例如$game_switches和$game_variables它们根本没有被读取识别!所以如果此时草率地在Window_Base、Window_Command等类里面使用开关或者变量作为条件,就会出错!接下来就正式进入游戏菜单了。我们探索的目的首先一个就是把它从Scene_Title里面分离出来,进而为后面的标题扩展做准备。看看这段脚本
RUBY 代码复制
  1. # 生成各种游戏对像
  2.     $game_temp          = Game_Temp.new
  3.     $game_system        = Game_System.new
  4.     $game_switches      = Game_Switches.new
  5.     $game_variables     = Game_Variables.new
  6.     $game_self_switches = Game_SelfSwitches.new
  7.     $game_screen        = Game_Screen.new
  8.     $game_actors        = Game_Actors.new
  9.     $game_party         = Game_Party.new
  10.     $game_troop         = Game_Troop.new
  11.     $game_map           = Game_Map.new
  12.     $game_player        = Game_Player.new
这里$game_system = Game_System.new又出现了一次。再对比一下RMVA,它的数据读取相关的脚本全集中到了模块DataManager相对比较集中而且都作了方法归类,更重要的是和VX一样$game_system = Game_System.new它只做了一次赋值,和别的变量一起在运行开始的时候就赋值完毕。
如果考虑到RMXP的帧数低,可能读取标题需要的时间比较长,经过充分考虑,将这段脚本分裂成两个方法:
RUBY 代码复制
  1. def create_basic_objects
  2.     $game_system        = Game_System.new
  3.     $game_temp          = Game_Temp.new
  4.     $game_message       = Game_Message.new
  5.     $game_switches      = Game_Switches.new
  6.     $game_variables     = Game_Variables.new
  7.   end
  8.   #在玩家现身时,生成
  9.   def create_game_objects
  10.     $game_self_switches = Game_SelfSwitches.new
  11.     $game_screen        = Game_Screen.new
  12.     $game_actors        = Game_Actors.new
  13.     $game_party         = Game_Party.new
  14.     $game_troop         = Game_Troop.new
  15.     $game_map           = Game_Map.new
  16.     $game_player        = Game_Player.new
  17.   end
这样一来就正是开始游戏之前先赋值一部分,然后开始游戏的时候赋值另一部分,这样岂不是很好?
为了让标题更为灵活,同时避免不必要的重复赋值,我们引入了一个特殊的Scene:Scene_Start上一讲大家看到了,在mian里面,我将原来的$scene = Scene_Title.new换成了$scene = Scene_Start.new!看看我的这个脚本
RUBY 代码复制
  1. class Scene_Start < Scene
  2. =begin
  3. =end  
  4.   # 载入数据库
  5.   def initialize
  6.  
  7.   end
  8.   def main
  9.     # 生成游戏系统
  10.     create_basic_objects if $game_temp == nil   
  11.     start   
  12.   end
  13.   def start
  14.     load_game_data
  15.     if $BTEST
  16.       battle_test
  17.       return
  18.     elsif DKRM::No_Title > 1 or ( DKRM::No_Title == 1 and $DEBUG)
  19.       #↓跳过标题菜单
  20.       command_new_game      
  21.     else  
  22.       #↓进入标题菜单
  23.       $scene = Scene_Title.new
  24.     end   
  25.   end
  26.  
  27.   #--------------------------------------------------------------------------
  28.   # ● 战斗测试
  29.   #--------------------------------------------------------------------------
  30.   def battle_test
  31.  
  32.     # 重置测量游戏时间用的画面计数器
  33.     Graphics.frame_count = 0
  34.     # 生成各种游戏对像
  35.     create_game_objects
  36.     # 设置战斗测试用同伴
  37.     $game_party.setup_battle_test_members
  38.     # 设置队伍 ID、可以逃走标志、战斗背景
  39.     $game_temp.battle_troop_id = $data_system.test_troop_id
  40.     $game_temp.battle_can_escape = true
  41.     $game_map.battleback_name = $data_system.battleback_name
  42.     # 演奏战斗开始 BGM
  43.     $game_system.se_play($data_system.battle_start_se)
  44.     # 演奏战斗 BGM
  45.     $game_system.bgm_play($game_system.battle_bgm)
  46.     # 切换到战斗画面
  47.     $scene = Scene_Battle.new
  48.   end      
  49. end
没有太多东西,因为这里不需要释放什么通过条件分歧来判定是进入战斗测试、进入游戏标题还是跳过游戏标题直接开始新游戏。当然了,这里我得先补充点东西:
首先,在这之前必须要进行的是
RUBY 代码复制
  1. def load_game_data
  2.     if $BTEST
  3.       # 载入数据库 (战斗测试用)
  4.       $data_actors        = load_data("Data/BT_Actors.rxdata")
  5.       $data_classes       = load_data("Data/BT_Classes.rxdata")
  6.       $data_skills        = load_data("Data/BT_Skills.rxdata")
  7.       $data_items         = load_data("Data/BT_Items.rxdata")
  8.       $data_weapons       = load_data("Data/BT_Weapons.rxdata")
  9.       $data_armors        = load_data("Data/BT_Armors.rxdata")
  10.       $data_enemies       = load_data("Data/BT_Enemies.rxdata")
  11.       $data_troops        = load_data("Data/BT_Troops.rxdata")
  12.       $data_states        = load_data("Data/BT_States.rxdata")
  13.       $data_animations    = load_data("Data/BT_Animations.rxdata")
  14.       $data_tilesets      = load_data("Data/BT_Tilesets.rxdata")
  15.       $data_common_events = load_data("Data/BT_CommonEvents.rxdata")
  16.       $data_system        = load_data("Data/BT_System.rxdata")
  17.  
  18.  
  19.     else
  20.       $data_actors        = load_data("Data/Actors.rxdata")
  21.       $data_classes       = load_data("Data/Classes.rxdata")
  22.       $data_skills        = load_data("Data/Skills.rxdata")
  23.       $data_items         = load_data("Data/Items.rxdata")
  24.       $data_weapons       = load_data("Data/Weapons.rxdata")
  25.       $data_armors        = load_data("Data/Armors.rxdata")
  26.       $data_enemies       = load_data("Data/Enemies.rxdata")
  27.       $data_troops        = load_data("Data/Troops.rxdata")
  28.       $data_states        = load_data("Data/States.rxdata")
  29.       $data_animations    = load_data("Data/Animations.rxdata")
  30.       $data_tilesets      = load_data("Data/Tilesets.rxdata")
  31.       $data_common_events = load_data("Data/CommonEvents.rxdata")
  32.       $data_system        = load_data("Data/System.rxdata")
  33.       #GTBS特别添加了这个功能
  34.       $data_map_info      = load_data("Data/MapInfos.rxdata")
  35.     end
  36.   end
这个正好根据是否开启战斗测试提前读取需要的脚本,避免了数据的第二次读取,很是方便。然后呢?
RUBY 代码复制
  1. def command_new_game
  2.     # 演奏确定 SE
  3.     $game_system.se_play($data_system.decision_se)
  4.     # 停止 BGM
  5.     Audio.bgm_stop
  6.     # 重置测量游戏时间用的画面计数器
  7.     Graphics.frame_count = 0
  8.     #生成游戏对象
  9.     create_game_objects
  10.     # 设置初期同伴位置
  11.     $game_party.setup_starting_members
  12.     # 设置初期位置的地图
  13.     $game_map.setup($data_system.start_map_id)
  14.     # 主角向初期位置移动
  15.     $game_player.moveto($data_system.start_x, $data_system.start_y)
  16.     # 刷新主角
  17.     $game_player.refresh
  18.     # 执行地图设置的 BGM 与 BGS 的自动切换
  19.     $game_map.autoplay
  20.     # 刷新地图 (执行并行事件)
  21.     $game_map.update
  22.     # 切换地图画面   
  23.     $game_temp.to_title = false
  24.     $scene = Scene_Map.new
  25.   end
以及上面两个变量组定义赋值的脚本为了便于调用,我挪动到了它的父类Scene这个类里面,也就类似于VX ACE的模块那样,
@DeathKing 曾经说过,他可以像变魔术那样修改Scene_Title使用不到4行代码即可跳过标题,我在这里就揭开这精简代码背后庞大复杂的具体内容,依靠的说白了无外乎这种继承关系


通过这种修改,我们将Scene_Title从加载游戏的沉重任务中解救出来,进而让它可以轻装上阵。下一个探索之旅,我们将给大家揭示如何和Scene_Title绕圈圈,为事件标题、二周目游戏提供快捷省脑筋的方法。 透漏一下,我下一探索就是告诉大家怎么让Scene_Title的这个执行新游戏变成假的!

Scripts.rxdata

320.13 KB, 下载次数: 46

潜水,专心忙活三次元工作了……

Lv1.梦旅人

66RPG我的

梦石
0
星屑
163
在线时间
491 小时
注册时间
2012-1-16
帖子
1993
2
发表于 2013-1-22 08:12:49 手机端发表。 | 只看该作者
这样弄的结果恐怕是以往各种标题脚本不再兼容了吧?
来自: Android客户端
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-28 11:01

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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