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

Project1

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

[RMVX发布] 雪流星脚本教程第一弹:Scene脚本教程一

 关闭 [复制链接]

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

跳转到指定楼层
1
发表于 2008-3-2 08:54:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
雪流星脚本教程第一弹: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

点评

雪sama,冒昧说一句,其实@actor_index -= 1;@actor_index %= $game_party.members.size;也是可以的。p (-1 % 5) #结果就是4  发表于 2010-7-25 02:55

评分

参与人数 1星屑 +2 收起 理由
574656549 + 2 请你编辑帖子!点击禁用XXX,表情好讨厌.

查看全部评分

VA脚本开工中...
偷窃脚本1.0 - 已完成

Lv1.梦旅人

万物创造者

梦石
0
星屑
54
在线时间
352 小时
注册时间
2008-2-15
帖子
2432
2
发表于 2008-3-2 17:02:42 | 只看该作者
很不错的样子,支持个,希望能继续写下去
很多教程是写了几章就放弃了= =
From mortal hope immortal power springs.
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-2-2
帖子
39
3
发表于 2008-3-4 01:10:09 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风雪夜不归人

梦石
0
星屑
50
在线时间
276 小时
注册时间
2006-3-7
帖子
6721

贵宾

4
发表于 2008-3-4 23:43:10 | 只看该作者
发布完毕,+4VIP(因为是教程第一期)
有些人,到了七八月份就会诈尸。
宫斗,是女生永远的爱。
冷门,是本人不变的欲。
作弊,是玩家自由的痛。
练级,是橙光割舍的情。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
12 小时
注册时间
2006-5-21
帖子
773
5
发表于 2008-3-5 05:50:10 | 只看该作者
虽然讲我会这些可是我也是研究了很久才明白的啊 教程很强大 让新学脚本的人少走很多弯路
MadniMStudio|Beside
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-28
帖子
232
6
发表于 2008-3-6 16:46:11 | 只看该作者
懂了,谢谢哈哈,我最喜欢你的教程了,有点研究,其实我把按LR键查看其它队员改了,改成按C看,而且按B到第1个人时自动返回,是用
if Input.trigger(Input::B) and actor_index ==0时,发现退回到第二个人再按B就会直接返回菜单,不知道有什么好办法。我知道他的道理,因为第二个人等于1,当退到0时就会自动返回了,用<0又不好使,没办法啊。不过不用管我,快出3吧
站内搜索 http://rpg.blue/forumSearch.asp
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-3-2
帖子
12
7
发表于 2008-3-13 08:15:25 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-2-28
帖子
16
8
发表于 2008-3-21 04:33:39 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

9
 楼主| 发表于 2008-3-21 07:16:45 | 只看该作者
以下引用九节菖蒲于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就不存在了。
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2008-3-26
帖子
5
10
发表于 2008-3-29 09:02:01 | 只看该作者
那个,问个新人问题,不要BS我哈
----------------
首先新建一个工程,打开脚本编译器,新增一个新的脚本组(这个不用教了吧?)。

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

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

请LZ帮忙解答一下,谢谢了啊!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-21 18:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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