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

Project1

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

[原创发布] 黑暗圣剑教学(5) 采集+高级独立开关

 关闭 [复制链接]

Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

跳转到指定楼层
1
发表于 2006-5-11 15:51:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
黑暗圣剑传说中,会在各种地方遇到采集系统,可以采集药物和灵魄、魂魄。采集的时候可以选择“全部采集”或者“部分采集”,如果“部分采集”,则当情节发展一个阶段之后,药物会再生;全部采集则不会再生了。此外黑暗圣剑中,随着游戏进度的发展,后期采集获得的数量比前期要多得多。

这套采集系统用事件可以容易制作,从复杂到简单也有很多的制作方法。我在游戏制作过程中,随着自己的成长也使得这个方法进行了大约3次改进,算是一个RM使用者从初学到精进的成长过程。在此我把比较经典的一些知识点总结一下。如果你觉得自己RMXP的技术应该和柳柳不相上下,这一段学习过程就不用看了。




第一次制作,是让一个物品不拥有任何变量(因为考虑变量多了比较麻烦),使用独立开关。每一个事件设置很多很多页面,条件分别为:第一次的时候;第一次采集后到生长出来前(独立开关A);第二次生长出来(根据进度变量);第二次采集后(独立开关B);第三次生长出来(根据进度变量);第三次采集后(独立开关C);第四次生长出来(根据进度变量);不能再采集了(独立开关D)。

这样,当全部采集的时候,直接打开独立开关D,否则打开后面一个独立开关(第二次打开B,第三次打开C这样)。这样做的好处是非常好理解,只要采集那些事件页面这么设置:

★选项
(1)全部采集:获得一个好的物品,并打开独立开关D
(2)部分采集:获得不是很好的物品,打开下面一个独立开关

这样就可以了。制作完成一个之后,可以狂复制一些,就会出现一片采集点。这种方法很常规,缺点是如果随着进度后期采集获得比较多,则需要手动改每一个页面,而且只能采集4次,而且采集再生时间是固定的(这一点有点不符合逻辑)。


第二次制作的时候,是制作了一个公共事件,公共事件接受3个数值:下一次允许采集的时间,全部采集的物品编号,部分采集的物品编号。这样给每个采集点分配3个变量:一个用来在本次采集时候记录当前的进度变量+50,另外两个记录获得物品ID。

这种方法浪费了变量,虽然变量本身数量不可能有人用到5000之多,甚至能超过1000的也大多是逻辑算法不够优化——但每次复制需要修改变量,很麻烦。同时将变量传递给公共事件是个很麻烦的事情,需要再用变量接受变量。举个例子,公共事件中写获得物品需要这么写:
获得物品:编号$game_variables[$game_variables[10]],这样才行。也就是用10号变量来记录“本采集点所占用的变量 的编号”。逻辑上要多绕个弯,一不小心就会出错。

好处倒是很明显:
1、只有一页即可完成,而且那页只有4行。
2、可以很灵活设置获得的物品,而且有了公共事件,获得时候的效果可以比较统一(那时还没有使用获得物品提示的脚本,我个人也推荐在大型游戏使用那种效果的脚本)。这个方法也是黑暗圣剑绝大多数采集点的制作方法。


第三次制作:结合第一次和第二次,公共事件里面改用独立开关,更加灵活,就是逻辑上绕得更远了。效果非常统一,黑暗圣剑中所有柜子中获得的金钱都是这么制作。由于方法过于困难,不做叙述。




OK,看过历史,下面给一种写教程时候研究的推荐方法。经过黑暗圣剑发布后又半年,偶自己按理说也应该成长了一点,故……嗯。这种方法逻辑很清晰,但是教学起来难度偏高,看大家能不能理解了。

独立开关方法好是好(可以大量复制),但是受到独立开关个数(ABCD只有四个)的限制,而且页面太多,制作检查都比较麻烦,而且独立开关只能记录true/false。如果能用独立开关来记录一个数字的话,岂不就相当于结合了1、2种方法的优点了?

故首先修改脚本,让独立开关可以记录数据。

class Game_SelfSwitches  
  #--------------------------------------------------------------------------
  # ● 获取独立开关
  #     key : 键
  #--------------------------------------------------------------------------
  def [](key)
    if @data[key].is_a?(Numeric)
      return @data[key]
    else      
      return @data[key] == true ? true : false
    end
  end
end

这里修改了获取独立开关的定义,也就是当独立开关记录的是数据的时候,返回数据;否则按默认处理(没记录时返回false,记录了返回记录的true/false)。

然后事件中设置:

☆条件分歧:
($game_self_switches[[$game_map.map_id, @event_id, "E"]] <= $game_variables[1]
|  选项:
|  (1)全部采集:
|       ——获得物品
|       ——脚本:
|           key = [$game_map.map_id, @event_id, "E"]
|           $game_self_switches[key]=
|           $game_variables[1] + 2000
|  (2)部分采集:
|       ——获得好物品
|       ——脚本:
|           key = [$game_map.map_id, @event_id, "E"]
|           $game_self_switches[key]=
|           $game_variables[1] + 20
|
|-除此以外的情况:显示文章:没有东西可以采集

这里解释一下:条件分歧:如果独立开关“E”的数值(生长出来时间)小于等于变量1的数值(变量1是游戏进度),则说明可以采集。这时就让玩家采集好了。
接着里面的脚本:
key = [$game_map.map_id, @event_id, "E"]  <--这个是给定独立开关E
$game_self_switches[key]=
$game_variables[1] + 20                   <--这个是给独立开关E赋值
这个意思是,采集之后,给独立开关E的数值设置为当前进度+20。这样一来,当游戏进度继续进行20以上,独立开关E的数值就会小于游戏进度,就又可以采集了。全部采集+2000那个,由于游戏进度一般不会有2000之高,这样就永远无法采集了。

光这么设置还不行,必须在第一次碰到这个事件的时候,给定一个独立开关E并且设置为数字。否则独立开关本来应该是true/false的类型的,不能参与数值操作。所以在上面设置的前面添加:

条件分歧:$game_self_switches[[$game_map.map_id, @event_id, "E"]] == false
key = [$game_map.map_id, @event_id, "E"]
$game_self_switches[key]=
$game_variables[1]

条件分歧里面脚本的意思是:如果“本事件独立开关E还没有建立”(没有建立的时候就是默认的算法,就是false),下面脚本自然就是把独立开关E的数值设置为当前游戏进度(变量1号)。

好啦,搞定了。这样建立好的事件,只要建立好1个,四处复制即可。既没有占用变量,也没有公共事件,也不用分页。如果想修改获得的物品,只要在“获得物品”那个地方稍加修改即可。获得其他东西(如金钱等)也可以。

如果也想制作后期获得比较丰厚的话,只要获得物品数量做点手脚(比如,获得物品的数量是变量2号,变量2号是通货膨胀率,初期=1,后期=3,则初期采集到1个物品,后期采集到3个)。如果获得金钱就更简单了:

变量3(这是个临时变量)= 随机数(50-150)
变量3 *= 变量2
获得金钱数量:变量3

这样就可以四处复制,就可以获得(随机50到150)×通货膨胀率 的金钱了,而且金钱采集还可以再生,非常简单。金钱再生的现实意义是说那家主人没头脑,柜子里钱被偷了之后,又在柜子里放了更多的钱——但是现实中,我们可能确实这样的:钱包被偷了再买个钱包,里面放更多的钱,很有可能。

这次的教学比较综合,用到了独立开关记录数据的高级技术,而且逻辑上可能有点绕——但我想这个教学应该对大家很有帮助的。

Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

2
 楼主| 发表于 2006-5-11 15:51:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
黑暗圣剑传说中,会在各种地方遇到采集系统,可以采集药物和灵魄、魂魄。采集的时候可以选择“全部采集”或者“部分采集”,如果“部分采集”,则当情节发展一个阶段之后,药物会再生;全部采集则不会再生了。此外黑暗圣剑中,随着游戏进度的发展,后期采集获得的数量比前期要多得多。

这套采集系统用事件可以容易制作,从复杂到简单也有很多的制作方法。我在游戏制作过程中,随着自己的成长也使得这个方法进行了大约3次改进,算是一个RM使用者从初学到精进的成长过程。在此我把比较经典的一些知识点总结一下。如果你觉得自己RMXP的技术应该和柳柳不相上下,这一段学习过程就不用看了。




第一次制作,是让一个物品不拥有任何变量(因为考虑变量多了比较麻烦),使用独立开关。每一个事件设置很多很多页面,条件分别为:第一次的时候;第一次采集后到生长出来前(独立开关A);第二次生长出来(根据进度变量);第二次采集后(独立开关B);第三次生长出来(根据进度变量);第三次采集后(独立开关C);第四次生长出来(根据进度变量);不能再采集了(独立开关D)。

这样,当全部采集的时候,直接打开独立开关D,否则打开后面一个独立开关(第二次打开B,第三次打开C这样)。这样做的好处是非常好理解,只要采集那些事件页面这么设置:

★选项
(1)全部采集:获得一个好的物品,并打开独立开关D
(2)部分采集:获得不是很好的物品,打开下面一个独立开关

这样就可以了。制作完成一个之后,可以狂复制一些,就会出现一片采集点。这种方法很常规,缺点是如果随着进度后期采集获得比较多,则需要手动改每一个页面,而且只能采集4次,而且采集再生时间是固定的(这一点有点不符合逻辑)。


第二次制作的时候,是制作了一个公共事件,公共事件接受3个数值:下一次允许采集的时间,全部采集的物品编号,部分采集的物品编号。这样给每个采集点分配3个变量:一个用来在本次采集时候记录当前的进度变量+50,另外两个记录获得物品ID。

这种方法浪费了变量,虽然变量本身数量不可能有人用到5000之多,甚至能超过1000的也大多是逻辑算法不够优化——但每次复制需要修改变量,很麻烦。同时将变量传递给公共事件是个很麻烦的事情,需要再用变量接受变量。举个例子,公共事件中写获得物品需要这么写:
获得物品:编号$game_variables[$game_variables[10]],这样才行。也就是用10号变量来记录“本采集点所占用的变量 的编号”。逻辑上要多绕个弯,一不小心就会出错。

好处倒是很明显:1、只有一页即可完成,而且那页只有4行。2、可以很灵活设置获得的物品,而且有了公共事件,获得时候的效果可以比较统一(那时还没有使用获得物品提示的脚本,我个人也推荐在大型游戏使用那种效果的脚本)。这个方法也是黑暗圣剑绝大多数采集点的制作方法。


第三次制作:结合第一次和第二次,公共事件里面改用独立开关,更加灵活,就是逻辑上绕得更远了。效果非常统一,黑暗圣剑中所有柜子中获得的金钱都是这么制作。由于方法过于困难,不做叙述。




OK,看过历史,下面给一种写教程时候研究的推荐方法。经过黑暗圣剑发布后又半年,偶自己按理说也应该成长了一点,故……嗯。这种方法逻辑很清晰,但是教学起来难度偏高,看大家能不能理解了。

独立开关方法好是好(可以大量复制),但是受到独立开关个数(ABCD只有四个)的限制,而且页面太多,制作检查都比较麻烦,而且独立开关只能记录true/false。如果能用独立开关来记录一个数字的话,岂不就相当于结合了1、2种方法的优点了?

故首先修改脚本,让独立开关可以记录数据。

class Game_SelfSwitches  
  #--------------------------------------------------------------------------
  # ● 获取独立开关
  #     key : 键
  #--------------------------------------------------------------------------
  def [](key)
    if @data[key].is_a?(Numeric)
      return @data[key]
    else      
      return @data[key] == true ? true : false
    end
  end
end

这里修改了获取独立开关的定义,也就是当独立开关记录的是数据的时候,返回数据;否则按默认处理(没记录时返回false,记录了返回记录的true/false)。

然后事件中设置:

☆条件分歧:($game_self_switches[[$game_map.map_id, @event_id, "E"]] <= $game_variables[1]
|  选项:
|  (1)全部采集:
|       ——获得物品
|       ——脚本:
|           key = [$game_map.map_id, @event_id, "E"]
|           $game_self_switches[key]=
|           $game_variables[1] + 2000
|  (2)部分采集:
|       ——获得好物品
|       ——脚本:
|           key = [$game_map.map_id, @event_id, "E"]
|           $game_self_switches[key]=
|           $game_variables[1] + 20
|
|-除此以外的情况:显示文章:没有东西可以采集

这里解释一下:条件分歧:如果独立开关“E”的数值(生长出来时间)小于等于变量1的数值(变量1是游戏进度),则说明可以采集。这时就让玩家采集好了。
接着里面的脚本:
key = [$game_map.map_id, @event_id, "E"]  <--这个是给定独立开关E
$game_self_switches[key]=
$game_variables[1] + 20                   <--这个是给独立开关E赋值
这个意思是,采集之后,给独立开关E的数值设置为当前进度+20。这样一来,当游戏进度继续进行20以上,独立开关E的数值就会小于游戏进度,就又可以采集了。全部采集+2000那个,由于游戏进度一般不会有2000之高,这样就永远无法采集了。

光这么设置还不行,必须在第一次碰到这个事件的时候,给定一个独立开关E并且设置为数字。否则独立开关本来应该是true/false的类型的,不能参与数值操作。所以在上面设置的前面添加:

条件分歧:$game_self_switches[[$game_map.map_id, @event_id, "E"]] == false
key = [$game_map.map_id, @event_id, "E"]
$game_self_switches[key]=
$game_variables[1]

条件分歧里面脚本的意思是:如果“本事件独立开关E还没有建立”(没有建立的时候就是默认的算法,就是false),下面脚本自然就是把独立开关E的数值设置为当前游戏进度(变量1号)。

好啦,搞定了。这样建立好的事件,只要建立好1个,四处复制即可。既没有占用变量,也没有公共事件,也不用分页。如果想修改获得的物品,只要在“获得物品”那个地方稍加修改即可。获得其他东西(如金钱等)也可以。

如果也想制作后期获得比较丰厚的话,只要获得物品数量做点手脚(比如,获得物品的数量是变量2号,变量2号是通货膨胀率,初期=1,后期=3,则初期采集到1个物品,后期采集到3个)。如果获得金钱就更简单了:

变量3(这是个临时变量)= 随机数(50-150)
变量3 *= 变量2
获得金钱数量:变量3

这样就可以四处复制,就可以获得(随机50到150)×通货膨胀率 的金钱了,而且金钱采集还可以再生,非常简单。金钱再生的现实意义是说那家主人没头脑,柜子里钱被偷了之后,又在柜子里放了更多的钱——但是现实中,我们可能确实这样的:钱包被偷了再买个钱包,里面放更多的钱,很有可能。

这次的教学比较综合,用到了独立开关记录数据的高级技术,而且逻辑上可能有点绕——但我想这个教学应该对大家很有帮助的。

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

3
发表于 2006-5-11 16:08:04 | 只看该作者
…………
竟然也有这个“Numeric”……

我判断是否为数字都是用ASCII的……
纵然千里外,我等雁归来。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

NewS-

梦石
0
星屑
50
在线时间
5 小时
注册时间
2005-10-23
帖子
3651

贵宾

4
发表于 2006-5-11 16:09:16 | 只看该作者
恩,开始早上出没了{/hx}
66RPG,这几个简单字符,之于我代表了什么?泪泪博客:http://hi.baidu.com/rpgmakerxp
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

5
发表于 2006-6-13 21:09:31 | 只看该作者
以下引用美兽于2006-5-11 8:08:04的发言:

…………
竟然也有这个“Numeric”……

我判断是否为数字都是用ASCII的……


唉...想通过美兽的话找出些什么...但还是...
购买....
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

指舞飞扬

梦石
0
星屑
50
在线时间
0 小时
注册时间
2006-3-5
帖子
508
6
发表于 2006-6-14 03:12:03 | 只看该作者
购买成功列表


link006007
世界真奇妙~啥鸟人都有/:|~
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
301
在线时间
573 小时
注册时间
2005-10-27
帖子
1164
7
发表于 2006-6-24 07:04:06 | 只看该作者
提个建议:这个能不能用类似银行计利息事件那个“步数”作为判断条件呢?就是走出一定步数后才会再生长出来...
认真地猥琐,猥琐地认真
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2006-9-29
帖子
22
8
发表于 2006-10-30 18:34:21 | 只看该作者
以下引用姬文翔于2006-6-23 23:04:06的发言:

提个建议:这个能不能用类似银行计利息事件那个“步数”作为判断条件呢?就是走出一定步数后才会再生长出来...

没什么不可以的吧,不就是看那个变量记录什么数据吗……
增加变量记录步数差值
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1 小时
注册时间
2006-9-29
帖子
22
9
发表于 2006-10-30 19:53:01 | 只看该作者
能问一下:
def定义后边三个end是必须的吗?按理不是两个就够了吗?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

10
 楼主| 发表于 2006-12-25 09:29:10 | 只看该作者
以下引用冒险王于2006-10-30 11:53:01的发言:

能问一下:
def定义后边三个end是必须的吗?按理不是两个就够了吗?

class Game_SelfSwitches  
#--------------------------------------------------------------------------
# ● 获取独立开关
#     key : 键
#--------------------------------------------------------------------------
def [](key)
   if @data[key].is_a?(Numeric)
     return @data[key]
   else      
     return @data[key] == true ? true : false
   end
end
end

你是说这段么?我用颜色标出来,你看明白不?如果是自己修改,两个就行。

注意这个教学还是学会再用比较好,不要生套用
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-29 22:00

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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