Project1

标题: 雪流星脚本教程第二弹:Scene脚本教程二 [打印本页]

作者: 雪流星    时间: 2008-3-5 13:42
标题: 雪流星脚本教程第二弹:Scene脚本教程二
雪流星脚本教程第二弹: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

脚本当然是愈少行愈好,但是有的时候,分成多行写反而比较好,原因就是让脚本看起来更清晰。
再来就是记得在适当的时候使用缩行和换行,把脚本分成一段一段的,在适当的加上注释,会让脚本更清晰。
(截图中的脚本来自上一个教程)


哪一个看起来更舒服呢?
第一个脚本挤成一堆,第二个稍好,但是没有注释,简单的脚本还好,一旦把脚本写复杂了,久了自己都会忘记写的是什麽东西。

作者: 英俊de狗    时间: 2008-3-5 19:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: 英俊de狗    时间: 2008-3-5 21:18
提示: 作者被禁止或删除 内容自动屏蔽
作者: 风雪优游    时间: 2008-3-6 01:31
出得满快的嘛,发布去了~

发布完毕+2VIP
作者: 雪流星    时间: 2008-3-6 07:17
以下引用英俊de狗于2008-3-5 13:18:12的发言:
不过提个建议:
希望能够写出以实现效果为目标的原创教程


之后吧,现在先写给脚本新手
否则若是连一般场景画面都不熟悉怎么看的懂

作者: 英俊de狗    时间: 2008-3-6 19:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: 50568358    时间: 2008-3-6 20:03
我全会了哈哈!!!!!!真高兴
end[/code]

谢谢了,楼下的大哥。{/se}
作者: 雪流星    时间: 2008-3-6 20:30
因为你打错了
@cmmand_window.dispose

还有在update里面要在按键判断前写
@command_window.update

作者: 50568358    时间: 2008-3-19 19:50
怎么不写了啊?我还等着学习呢?
{/se}{/se}{/se}{/se}{/se}{/se}{/se}{/se}{/se}{/se}{/se}{/se}{/se}{/qiang}{/qiang}{/qiang}{/qiang}{/qiang}{/qiang}{/qiang}{/qiang}{/qiang}{/qiang}
作者: 雪流星    时间: 2008-3-20 05:52
因为在翻译VX1.02

其实3已经快写好了说

作者: 九节菖蒲    时间: 2008-3-21 04:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: hexawing    时间: 2008-3-31 08:34
以下引用snstar2006于2008-3-5 23:17:15的发言:


以下引用英俊de狗于2008-3-5 13:18:12的发言:
不过提个建议:
希望能够写出以实现效果为目标的原创教程


之后吧,现在先写给脚本新手
否则若是连一般场景画面都不熟悉怎么看的懂

嗯,强烈支持
←脚本超级无敌新手敬上




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1