赞 | 4 |
VIP | 44 |
好人卡 | 11 |
积分 | 12 |
经验 | 54954 |
最后登录 | 2021-10-2 |
在线时间 | 1276 小时 |
Lv3.寻梦者 ○赛
- 梦石
- 0
- 星屑
- 1249
- 在线时间
- 1276 小时
- 注册时间
- 2013-1-22
- 帖子
- 2246
|
第十三章 解析默认菜单
其实我准备直接出修改菜单来着……但是实在想不出排版……于是先弄个这个。
希望有人能给我个菜单排版啊……………………
不知道又没用讲过new方法,它是Class类的方法,以下摘自F1帮助。
new( ... )
生成并返回类的实例。该方法的参数,包括块参数在内,都会被传给 initialize。
所以xxx = Xxx_Xxx.new是生成实例。
以下是正文部分。
首先,是用class~end定义类,随后,可以看到有一个initialize方法。
因为附带了一个参数,所以调用菜单时需要一个参数。
接下来是主要部分,main方法,场景类必须有main方法。
先看这部分。
# 生成命令窗口
s1 = $data_system.words.item
s2 = $data_system.words.skill
s3 = $data_system.words.equip
s4 = "状态"
s5 = "存档"
s6 = "结束游戏"
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])
@command_window.index = @menu_index
# 同伴人数为 0 的情况下
if $game_party.actors.size == 0
# 物品、特技、装备、状态无效化
@command_window.disable_item(0)
@command_window.disable_item(1)
@command_window.disable_item(2)
@command_window.disable_item(3)
end
# 禁止存档的情况下
if $game_system.save_disabled
# 存档无效
@command_window.disable_item(4)
end
一行一行慢慢来。
s1、2、3、4、5、6分别代入字符串,接下来用@command_window这个变量生成Window_Command的实例。
这个160是宽度,翻翻Window_Command就知道了。
然后是index,index是Window_Selectable类的属性,因为Window_Command是Window_Selectable的子类,所以有了这个属性。
再看:$game_party.actors.size这个全局变量代表着队伍人数,$game_party是Game_Party的实例,是在Scene_Title里生成的。
@command_window.disable_item是Window_Command类的方法,用来无效选项。
$game_system是Game_System的实例,找到Game_System,就能看到用attr_accessor定义了几个实例变量,至于实例变量是个什么东西,以后
讲解默认脚本时会提到。这个save_disabled也是那几个变量中的一个。
# 生成游戏时间窗口
@playtime_window = Window_PlayTime.new
@playtime_window.x = 0
@playtime_window.y = 224
# 生成步数窗口
@steps_window = Window_Steps.new
@steps_window.x = 0
@steps_window.y = 320
# 生成金钱窗口
@gold_window = Window_Gold.new
@gold_window.x = 0
@gold_window.y = 416
# 生成状态窗口
@status_window = Window_MenuStatus.new
@status_window.x = 160
@status_window.y = 0
继续讲解。
这些都是用变量生成实例。x,y是Window类的属性,可以参考F1 里的Window。
这四个窗口也是预先定义好的,从脚本编辑器往上翻翻Window_Xxx的类就能看见,其余几个都没什么可说的,关键是
这个Window_MenuStatus需要好好说说,不过,我们先暂且放一放。
剩下的main里的内容就是我们上次说过的Scene场景类的基础,一定要写。
那些dispose都是释放(消失),如果不释放,那么这些窗口将会一直存在。
然后继续看。
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
# 刷新窗口
@command_window.update
@playtime_window.update
@steps_window.update
@gold_window.update
@status_window.update
# 命令窗口被激活的情况下: 调用 update_command
if @command_window.active
update_command
return
end
# 状态窗口被激活的情况下: 调用 update_status
if @status_window.active
update_status
return
end
end
首先是调用各个窗口的update方法(大都是继承了Window_Base的)。
active也是Window类的属性,表示激活状态。为true则表示激活,为false表示不激活。
什么意思呢?比如说,@command_window的active是false,那么那个一闪一闪的表示被选择项的透明框框就会停止闪动。
然后再看。
#--------------------------------------------------------------------------
# ● 刷新画面 (命令窗口被激活的情况下)
#--------------------------------------------------------------------------
def update_command
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 切换的地图画面
$scene = Scene_Map.new
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 同伴人数为 0、存档、游戏结束以外的场合
if $game_party.actors.size == 0 and @command_window.index < 4
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
return
end
# 命令窗口的光标位置分支
case @command_window.index
when 0 # 物品
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到物品画面
$scene = Scene_Item.new
when 1 # 特技
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 激活状态窗口
@command_window.active = false
@status_window.active = true
@status_window.index = 0
when 2 # 装备
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 激活状态窗口
@command_window.active = false
@status_window.active = true
@status_window.index = 0
when 3 # 状态
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 激活状态窗口
@command_window.active = false
@status_window.active = true
@status_window.index = 0
when 4 # 存档
# 禁止存档的情况下
if $game_system.save_disabled
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
return
end
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到存档画面
$scene = Scene_Save.new
when 5 # 游戏结束
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到游戏结束画面
$scene = Scene_End.new
end
return
end
end
$game_system.se_play都是Game_System里的方法,作用是播放se,$scene = Xxx都是切换场景用的。
return是结束函数(方法?)处理的命令。
case when end是条件分歧语句,不知道的童鞋请看F1默认帮助,我就不信你看不懂条件分歧~
然后继续。
#--------------------------------------------------------------------------
# ● 刷新画面 (状态窗口被激活的情况下)
#--------------------------------------------------------------------------
def update_status
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 激活命令窗口
@command_window.active = true
@status_window.active = false
@status_window.index = -1
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 命令窗口的光标位置分支
case @command_window.index
when 1 # 特技
# 本角色的行动限制在 2 以上的情况下
if $game_party.actors[@status_window.index].restriction >= 2
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
return
end
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到特技画面
$scene = Scene_Skill.new(@status_window.index)
when 2 # 装备
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换的装备画面
$scene = Scene_Equip.new(@status_window.index)
when 3 # 状态
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到状态画面
$scene = Scene_Status.new(@status_window.index)
end
return
end
end
这是角色选择的窗口,@status_window.index就是你选择的角色在$game_party.actors[]里的编号,以此来传递各个Scene类的参数。
恩,本章结束。因为已经解析过Scene_Menu了所以以后解析默认脚本就不会再额外解析Scene_Menu了~
|
评分
-
查看全部评分
|