赞 | 5 |
VIP | 71 |
好人卡 | 22 |
积分 | 6 |
经验 | 32145 |
最后登录 | 2013-8-9 |
在线时间 | 184 小时 |
Lv2.观梦者 天仙
- 梦石
- 0
- 星屑
- 620
- 在线时间
- 184 小时
- 注册时间
- 2008-4-15
- 帖子
- 5023
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
雪流星脚本教程第二弹:Scene脚本教程二
RMXP的说明档:
RGPXP.rar
小幽的VX实用脚本查询手册:
VX实用脚本查询手册
雪流星脚本教程第一弹:Scene脚本教程一
继续使用上一个工程,打开脚本编译器,再新增一个新的脚本组。
这里假设你已经看过上一个教程,所以上次说过的不再赘叙。
这次我们来重新写一个另一个画面:Scene_End,也就是结束画面
在开始之前,我们先来谈一谈Vocab这个脚本
Vocab就是Vocabulary的缩写,意思就是「字汇」。我们在数据库最後一页「用语」所定义的字都可以用Vocab.XXX来调用。
详细请看该脚本的注释。
我们现在这个脚本会用到一些用语的字,所以介绍一下
现在进入正题:
定义一个类、把一个场景最基础的方法定义好(就是start、terminate、update三个):
class Scene_End < Scene_Base
def start
end
def terminate
end
def update
end
end
再来在start里面创建一个窗口,上次Status里面是创建@status_window
那麽End 是不是创建@end_window呢?
错!!!
这次我们要用的是Window_Command(命令窗口)这个窗口类。
Window_Command这个窗口类是继承Window_Selectable的一个类,
Window_Selectable这个窗口类我们下一堂会讲到,先在先知道有这个类就好了。
在start下添加下面脚本:
@command_window = Window_Command.new(127, [Vocab.to_title, Vocab.shutdown, Vocab.cancel])
= = 这是什麽东东阿?
是不是很复杂,为了让脚本更清晰、更漂亮(eye-appealling),我们把它分四行来写
s1 = Vocab.to_title
s2 = Vocab.shutdown
s3 = Vocab.cancel
@command_window = Window_Command.new(127, [s1, s2, s3])
记不记得在上一个教程里,我们把三行脚本简化成一行?
这里刚好相反,把一行分成四行来写。为什麽这麽写,呵呵,请看本教程的附录。
脚本当然是愈少行愈好,但是有的时候,分成多行写,效果反而比较好,原因就是让脚本看起来更清晰。
s1 = Vocab.to_title 中的Vocab.to_title就是调用了本教程最前面谈到的Vocab脚本
另外两行也是一样。
注:如果你去看默认脚本,会发现这行是Vocab::to_title
双冒号 :: 的用法以後有必要在解释,现在先用句号 . 就好了。
@command_window = Window_Command.new(127, [s1, s2, s3])
创建Window_Command时需要两个参数,一是窗口的宽度,二是命令。
这里的127就是窗口的宽度
[s1, s2, s3]就是命令。
什麽是s1, s2, s3呢?就是我们在前面定义的三个字符串变数,分别被赋值「回到标题」、「离开游戏」、「取消」(看你在数据库里是怎麽设置的)
注意命令必须是一个字符串数组。
现在我们创建好@command_window就顺便把它的dispose和update一起写了
(写在哪里想必不用多说了吧?不知道?去看第一个教程吧。)
测试一下:
嗯,很好,按上下键看看,也可以移动浮标。
奇怪,我们并没有在update里面写任何关於按键判断的,为什麽按按钮会有反应呢?
那是因为判断的部分已经写在Window_Selectable里面了,记得吗?前面说过
Window_Command是继承Window_Selectable的,所以也有同样的功能。
接下来我们要调整它的座标,让它居中显示。
要怎麽做呢?首先我们需要这些资料:
1. 画面宽度 ─ 这个一定不变:544(除非你是用高分辨率版本)
2. 画面宽度的一半 ─ 这个也一定不变:272
3. 窗口的宽度 ─ 这个我们知道,是127,但是为求保险,我们用@command_window.width来获取
4. 窗口宽度的一半 ─ @command_window.width / 2
如图:
红色的272 - @command_window.width/2 就是我们需要的X座标。
接下来用同样的方式,计算Y座标:
1. 画面高度 ─ 这个一定不变:416(除非你是用高分辨率版本)
2. 画面高度的一半 ─ 这个也一定不变:208
3. 窗口的高度 ─ @command_window.height
4. 窗口高度的一半 ─ @command_window.height / 2
从上面的资料我们可以获得命令窗口的X和Y座标
@command_window.x = 272 - @command_window.width / 2
@command_window.y = 208 - @command_window.height / 2
然後再用数学公式美化:
272 = 544 / 2
∴ @command_window.x = 544 / 2 - @command_window.width / 2
→ @command_window.x = (544 - @command_window.width) / 2
最後获得:@command_window.x = (544 - @command_window.width) / 2
Y座标同理:@command_window.y = (416 - @command_window.height) / 2
记住了以上公式,以後就不用计算544和416的一半时什麽了,只要记住544和416两个数字就好了。
效果:
不过现在我们的命令窗口只是一个空壳,什麽作用也没有
现在我们来做按键判断:
在update里面加上:
if Input.trigger?(Input::B) # <= 按下B键时
Sound.play_cancel # <= 播放取消音效
return_scene # <= 回到菜单画面
end
等等!!!这句return_scene是怎麽回事???
这里就是另外调用一个方法,我们来定义一个简单的方法
放在本脚本最後一个end前面,记得定义方法时都这样,只要写在最後一个end前面任何地方,
只要不是在def … end中间,就是有效的方法定义。
def return_scene
$scene = Scene_Menu.new(5)
end
就这样!?就一句而已,那何必另外写呢?等等就知道了。
再来写另外一个按键的分歧:
# 按下C键的场合
if Input.trigger?(Input::C)
# 播放确认音效
Sound.play_decision
# 以命令窗口游标分歧
case @command_window.index
when 0 # 标题画面
# 切换至标题画面
$scene = Scene_Title.new
# 淡出画面
Graphics.fadeout(60)
when 1 # 离开游戏
$scene = nil
when 2 # 取消
return_scene
end
end
有没有注意到,取消的时候,也是调用return_scene这个方法。
那又如何?还不是只有一句脚本而已?有什麽差别?
差别就是:现在我们的脚本虽然只有调用了这句脚本两次,但是假如有一天,
我们的脚本变成了「裹脚布」(又臭又长)的时候
每次要回去菜单画面就要打一次$scene = Scene_Menu.new(5)
然後我们在菜单的命令窗口又增加了新的选项,於是「离开游戏」就往下掉,我们就要把所有的
$scene = Scene_Menu.new(5)改成$scene = Scene_Menu.new(6)
然後我们在菜单的命令窗口又增加了新的选项,於是「离开游戏」就又往下掉,我们又要把所有的
$scene = Scene_Menu.new(6)改成$scene = Scene_Menu.new(7)
…………………..重复n次
结果可以想像了吧….
但是如果我们使用return_scene的话,我们就只要修改一句脚本就好了。
写脚本技巧:有可能会不断重复用到,或是很长的脚本,这种情况就定义一个新的方法。
切换标题画面的脚本简单明了:$scene = Scene_Title.new 没什麽特别的。
结束游戏就是让场景$scene为nil就行了。
至於这句:Graphics.fadeout(60)就是让画面淡出。
测试一下就知道了,就是让画面不是一下子就忽然切换成标题画面而已。
另外在讲一段关於命令窗口的特殊功能:
VX的命令窗口可以多栏显示,例如前面的@command_window可以改成:
@command_window = Window_Command.new(127, [s1, s2, s3], 3, 1)
後面那3, 1究竟是什麽意思呢?
3 代表3栏
1 代表1排
效果:
囧rz这是什麽东西呢?
这是因为我们窗口的宽度太小了。
把127改成544看看
也可以这样:
@command_window = Window_Command.new(254, [s1, s2, s3], 2, 2)
好了,本教程第二弹至此结束,下一次讲关於有 Window_Selectable 的场景。
附录:写脚本技巧之Eye-appealling
脚本当然是愈少行愈好,但是有的时候,分成多行写反而比较好,原因就是让脚本看起来更清晰。
再来就是记得在适当的时候使用缩行和换行,把脚本分成一段一段的,在适当的加上注释,会让脚本更清晰。
(截图中的脚本来自上一个教程)
哪一个看起来更舒服呢?
第一个脚本挤成一堆,第二个稍好,但是没有注释,简单的脚本还好,一旦把脚本写复杂了,久了自己都会忘记写的是什麽东西。 |
|