Project1

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

作者: 雪流星    时间: 2008-3-2 08:54
标题: 雪流星脚本教程第一弹:Scene脚本教程一
雪流星脚本教程第一弹:Scene脚本教程一

貌似许多人想要学习RGSS2的脚本,所以就开始写了。
首先声明:本教程从脚本编译开始,所以基础语法请看说明。
RMXP的说明档:
RGPXP.rar

小幽的VX实用脚本查询手册:
VX实用脚本查询手册

开始吧!


首先新建一个工程,打开脚本编译器,新增一个新的脚本组(这个不用教了吧?)。

我们来重新写一个状态画面,也就是Scene_Status
注意下面写出来的脚本是一个教,不是和原来的Scene_Status一模一样的脚本
我把一些无用又容易把事情搞复杂的脚本删去,留在後面再说。

(所谓无用是在默认情况下无用,其实会用的话可以让你的场景华丽丽~)

首先定义一个类:
class Scene_Status < Scene_Base
end

接着我们再来定义一个Scene类所需要的三个方法
class Scene_Status < Scene_Base
        def start
        end
        def terminate
        end
        def update
        end
end

然後我们测试一下:


嗯~很好~什么都没有,没错,因为我们什么都还没写。(如果你的出现任何东西的话,表示你的类名称拼错了,没能替换掉原来的脚本)
接下来,我们再加上一段代码
  def initialize(actor_index = 0)
    @actor_index = actor_index                # 读取队员位置
  end
这是干什麽的呢?简单的说就是初始化此场景。
详细内容等一下再一起解释吧。

接下来在def start下面添加
    @actor = $game_party.members[@actor_index]                # 获取队员
    @status_window = Window_Status.new(@actor)                # 建立状态窗口

@actor = $game_party.members[@actor_index]
这行是个重点,首先@actor_index是来自於刚才initialize的参数,
在initialize中读取参数actor_index 然後将其赋值予@actor_index。
注意这两个变数的名称,前一个(参数)没有@号,是「区域变量」,只存在於initialize里
但是另一个是在所有Scene_Status里的方法都能够调用的「实变量」。


再来:$game_party.members[@actor_index]就是指排在队伍中第@actor_index位置的角色
这个值来自於Scene_Menu,就是当我们在菜单选择角色时判定的。
把这个角色存入@actor变量中。

接着:@status_window = Window_Status.new(@actor)
就是创建一个窗口(状态窗口),此窗口需要一个参数,就是@actor

现在我们进入游戏看看:



完成了?还早的很,按按ESC看看,无法离开。因为我们还没写完update。
在def update下面加上:
    @status_window.update              # 更新状态窗口
    if Input.trigger?(Input::B)      # 判断是否按下B键
      Sound.play_cancel    # 播放取消音效
      $scene = Scene_Menu.new(3)    # 回到菜单画面
        end

update中第一个要写的就是把所有本场景的窗口都update一次,由於Scene_Status只有一个窗口,所以就是:
@status_window.update 更新状态窗口

再来是按键判断,
If Input.trigger?(Input::B) 就是指当按键B按下时
同理,其他按键还有:
Input::A                按键A                Input::B                按键B
Input::C                按键C                Input::X                按键X
Input::Y                按键Y                Input::Z                按键Z
Input::L                按键L                Input::R                按键R
Input::UP                按键上               Input::DOWN             按键下
Input::LEFT             按键左               Input::RIGHT               按键右


Sound.play_cancel
这句就是调用Sound脚本的方法,可以自己找找看Sound有哪些方法可以调用。
常用的有:
Sound.play_decision                播放决定时的SE                 大多在C按键按下的判定用
Sound.play_cancel                播放取消键时的SE                大多在B按键按下的判定用
Sound.play_cursor                播放游标移动的SE                大多在方向键按下的判定用
Sound.play_buzzer                播放无效按键时的SE


$scene = Scene_Menu.new(3)
返回至菜单
3指的是在菜单命令窗口的位置。如果改成4的话,游标就会停在「存档」的选项上面。
奇怪,状态不是第4个选项吗?为什麽会是3呢?
因为那是因为选项是从0开始算的,所以算到第4个就是3。
这个要记得,因为后面的场景会教到关于命令窗口和选项窗口。


测试一下效果:
进入状态画面,嗯,很好,再按ESC离开:


囧rz,为什么窗口没消失呢?
原因:没有释放掉窗口。

离开场景一定要把你在这个场景内所创建的窗口一一释放掉,才不会残留在画面上。
方法就是在terminate里面释放。
在def terminate下面加入:
    @status_window.dispose        # 释放状态窗口
我们的场景只有一个窗口,所以只要释放一个就好了,
记得如果创建了3个窗口,3个窗口都要dispose,就像update一样,n个窗口就要有n个update和dispose。

在测试,很好,残留的窗口消失了。

现在只是一个最最简单的场景,但是每次要进入状态都要先离开再选择角色太麻烦了,我们来丰富一下功能。
先把原脚本的这段复制过来(41~53行):
  def next_actor
    @actor_index += 1
    @actor_index %= $game_party.members.size
    $scene = Scene_Status.new(@actor_index)
  end

  def prev_actor
    @actor_index += $game_party.members.size - 1
    @actor_index %= $game_party.members.size
    $scene = Scene_Status.new(@actor_index)
  end

插在最後一个end前面

先来解释一下
next_actor 意思就是「下一个角色」
这个方法的功能就是跳到下一个角色的状态画面
prev_actor 同理

@actor_index += 1
将当前的角色队列指标加1,很简单,就是读取下一个角色在队伍中的位置
如果当前角色已经是最後一个队员了呢?这时下一句脚本就发挥作用了:
@actor_index %= $game_party.members.size
就是把增加了的指标除以队列大小取其馀数。头昏脑胀吗?
其实这短短一句就相当於:

if @actor_index >= $game_party.member.size
        @actor = 0
end

prev_actor 也是一样
只是这句:
@actor_index += $game_party.members.size - 1
为什麽不是 @actor_index -= 1 呢?
其实这里是用了数学中补数的算法,算是缩短代码的方法
如果用@actor_index -= 1
就无法用@actor_index %= $game_party.members.size 这句脚本
那麽脚本就变的很难看了。

最後
$scene = Scene_Status.new(@actor_index)
就是重新呼唤本场景,不同的是,角色已经不一样了。

但是现在测试的话还没用,因为我们没有在update中调用这两个方法。
在update里加上按键判定
    if Input.trigger?(Input::R)        # 判断是否按下R键
      Sound.play_cursor                # 播放游标音效
      next_actor                # 下一个角色
        end
    if Input.trigger?(Input::L)         # 判断是否按下L键
      Sound.play_cursor                # 播放游标音效
      prev_actor                # 上一个角色
    end

在测试,完美的状态场景。
第一弹先到此,下次来讲解有选项窗口的场景


附带:补数的算法解释
以下是数学原理,看不懂请54

1234.5 – 678.6 =?
这题当然可以直接算出来,但是因为现在要解释补数的应用,所以:
把1234.5 分割成 1000 + 234.5
找出678.6 对1000的补数
1000-678.6 =321.4
234.5 + 321.4 = 555.9

整个算式展开就是
(1234.5-1000)+(1234.5-234.5-678.6)=555.9
1234.5-1000+1000-678.6=555.9
1234.5-678.6=555.9

@actor_index += $game_party.members.size – 1 同理
假设当前角色为1,队列大小为4,
那麽上一个角色为4
那麽原本是
@actor_index = 1 +(4-1)
以上面补数的方式还原
@actor_index = (5-4) + (5-1-1)
@actor_index = 5-4 + 5-1-1
@actor_index = 5+1-1-1
@actor_index = 5-1 = 4

作者: 小幽的马甲    时间: 2008-3-2 17:02
很不错的样子,支持个,希望能继续写下去
很多教程是写了几章就放弃了= =
作者: csh2    时间: 2008-3-4 01:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: 风雪优游    时间: 2008-3-4 23:43
发布完毕,+4VIP(因为是教程第一期)
作者: Beside    时间: 2008-3-5 05:50
虽然讲我会这些可是我也是研究了很久才明白的啊 教程很强大 让新学脚本的人少走很多弯路
作者: 50568358    时间: 2008-3-6 16:46
懂了,谢谢哈哈,我最喜欢你的教程了,有点研究,其实我把按LR键查看其它队员改了,改成按C看,而且按B到第1个人时自动返回,是用
if Input.trigger(Input::B) and actor_index ==0时,发现退回到第二个人再按B就会直接返回菜单,不知道有什么好办法。我知道他的道理,因为第二个人等于1,当退到0时就会自动返回了,用<0又不好使,没办法啊。不过不用管我,快出3吧
作者: qwe18185    时间: 2008-3-13 08:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: 九节菖蒲    时间: 2008-3-21 04:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-3-21 07:16
以下引用九节菖蒲于2008-3-20 20:33:39的发言:

大爱...
小问一句:
@actor_index = actor_index既然已有全局变量,还定义局部变量做什么?


你是说在initialize里面那句吗?
1. @actor_index不是全局变量,是「实变量」
2. @actor_index = actor_index 不是在定义局部变量,而是将局部变量actor_index的值代入@actor_index。因为actor_index只存在於initialize里,离开initialize就不存在了。

作者: hexawing    时间: 2008-3-29 09:02
那个,问个新人问题,不要BS我哈
----------------
首先新建一个工程,打开脚本编译器,新增一个新的脚本组(这个不用教了吧?)。

我们来重新写一个状态画面,也就是Scene_Status
----------------
这段的意思是:按F11,然后在Main之前随便插入一段脚本么?

然后就是那一片黑,看Scene_Status的意思,应该是在按ESC显示人物状态的时候出现一片黑?可是我的一切照旧的说……如果说是因为名字没有拼写正确的话,我可是复制的“场景”脚本组中的那个“Scene_Status”,不应该有错的吧?

请LZ帮忙解答一下,谢谢了啊!
作者: 雪流星    时间: 2008-3-29 09:22
你说那个按了esc的画面是菜单画面

Scene_Status 是人物状态画面
是在菜单画面下选择「状态」之後再按下确定键的那个画面

不过如果连哪些场景是哪些scene都还不清楚的话
建议LS先不要那麽快学习脚本

作者: hexawing    时间: 2008-3-30 20:37
谢谢解答,也谢谢建议:)
作者: new1984    时间: 2008-5-13 17:31
1234.5-678.6=555.9   不是546.9 {/gg} [LINE]1,#dddddd[/LINE]版主对此帖的认可:『感謝指出錯誤』,积分『+10』。
作者: 雪流星    时间: 2008-5-14 14:42
以下引用new1984于2008-5-13 9:31:43的发言:

1234.5-678.6=555.9   不是546.9  


前面的打字錯誤導致後面算式錯誤
多謝指出
作者: 淼淼0220    时间: 2008-8-17 23:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: 雪流星    时间: 2008-8-18 20:50
以下引用淼淼0220于2008-8-17 15:12:58的发言:
我晕哦 为什么我开头第一行总显示出现错误啊?

请不要挖坟
对於有问题可以来rpgg2.5d6d.com提问

顺便回答一下:
截张图来看看究竟是哪里出错
错误讯息也麻烦贴出来看看

作者: shaoleibo    时间: 2009-3-12 08:08
多写点教材啊,我每天都在研究呢。争取早日成为一只老鸟。哦耶。
作者: wbc2205    时间: 2010-9-13 14:02
支持下




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