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

Project1

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

[推荐问答] 【自问答】如何制作二周目(以及多周目)

[复制链接]

Lv4.逐梦者 (版主)

梦石
0
星屑
9467
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

跳转到指定楼层
1
发表于 2015-10-6 20:18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
我想给游戏制作二周目甚至多周目系统,也就是说,当主角第一次通关游戏之后,再次选择“新游戏”重新开始游戏便会进入二周目。
在二周目中,游戏中会增加一些NPC,增加一些宝箱,总之和第一次通关有些区别。该如何实现这样的效果?


所谓的二周目问题,需要解决的问题有以下几个:
  • 如何判断玩家玩通了一周目?
  • 在已经判断玩家所在周目的情况下,如何制作新周目的额外内容?


我们可能会注意到,各个存档之间是独立的。也就是说,在某个存档里面的数据不能移植到别的存档中去。而我们的二周目问题,恰恰就是“在一个存档中打通游戏而影响另一个存档”这样的系统。默认存档的功能显然是不能满足我们的要求,因此我们就引入“全局存档”。
所谓全局存档,就是这个存档被整个游戏拥有,这里面存储了同一个玩家的公共信息。和普通的游戏存档不同的是,全局存档在游戏中只有一个,而这个存档里面的东西可以随时被游戏所引用。
因此,这恰好符合我们制作二周目的要求。在玩家打通一周目时,我们自动将打通一周目的信息写入这个全局存档;而在玩家重新选择“新游戏”时,先不急着进入游戏,而是读取全局存档的内容(如果有的话),如果发现玩家已经通关一周目,便立刻使新游戏进入二周目。
为了达到以上的效果,我们需要准备一些脚本。脚本我已经给大家写好,为了便于理解我在脚本中加了详细的注释:
RUBY 代码复制
  1. #=============================================================================
  2. # Global_Save
  3. #-----------------------------------------------------------------------------
  4. # 管理全局存档的模块
  5. #=============================================================================
  6. module Global_Save
  7.   # 接受全局存档数据的变量 ID
  8.   Global_Save_Var = 2
  9.   #---------------------------------------------------------------------------
  10.   # 将一个对象写入全局存档
  11.   #     object : 要写入的对象
  12.   #---------------------------------------------------------------------------
  13.   def self.write_save_data(object)
  14.     # 全局存档的文件名
  15.     filename = "GSave.rxdata"
  16.     # 打开文件(写入模式)
  17.     file = File.open(filename, "wb")
  18.     # 将 object 写入该文件
  19.     Marshal.dump(object, file)
  20.     # 写入完成,关闭文件
  21.     file.close
  22.   end
  23.   #---------------------------------------------------------------------------
  24.   # 读取全局存档的数据
  25.   #---------------------------------------------------------------------------
  26.   def self.load_save_data
  27.     # 全局存档的文件名
  28.     filename = "GSave.rxdata"
  29.     # 如果存在全局存档,则读取,否则什么也不做
  30.     if FileTest.exist?(filename)
  31.       # 打开文件(读取模式)
  32.       file = File.open(filename, "rb")
  33.       # 读取文件中的数据,并把它放在指定 ID 的变量当中
  34.       $game_variables[Global_Save_Var] = Marshal.load(file)
  35.       # 读取完成,关闭文件
  36.       file.close
  37.     end
  38.   end
  39. end

在这里,我们利用一个变量来表示周目数,0代表一周目,1代表二周目,以此类推,你可以定义更高的周目。而全局存档是放在一个名叫"GSave.rxdata"的文件中,这个文件里面只有一个数字,用于记录周目的信息。
由于任何游戏都有通关的场景,而这些场景一般都是通过事件来控制“返回标题画面”的,因此,我们只需要在这个事件里面将通关信息保存即可,就像下图这样:
因此你要选择一个能控制游戏流程顺利结束的事件,然后把中间灰色的脚本塞进去。
Global_Save.write_save_data(1)其实就是将数字 1 写入全局存档,上面我们提到,数字 1 表示的是二周目。当然,你可以写入别的数字来表示更高的周目。
游戏执行到这里返回标题画面后,你会发现游戏根目录下多了一个全局存档!

这就是我们生成的全局存档了,二周目的信息就靠它存储。

然而,光存储信息是没有用的,我们必须让游戏识别这个信息。一般游戏在制作的时候,都会经过一个“初始化事件”,即在一个空地图(这个空地图一般也是主角初期位置所在地)中默默地做一些工作。我们的二周目信息也要在这里读取。
首先,新建一张空地图,然后把主角初期位置设置在这张地图上。同时,在此地图上新建一个自动执行的事件。

事件的内容如下图所示:

需要特别注意一下这个事件的开启条件以及所有绿色的注释部分,设置对了才能正确读取二周目信息。

至于和二周目有关的情节设计,有了变量可就方便多了。如下图就是一个简单的例子:


通过这种办法,我们就可以制作我们的二周目(甚至多周目)游戏了!赶快打开RMXP试一试吧!!

评分

参与人数 2星屑 +330 梦石 +1 收起 理由
怪蜀黍 + 300 + 1 发布奖励
龙和许也 + 30 自问答鼓励

查看全部评分

Lv4.逐梦者

梦石
4
星屑
4454
在线时间
6784 小时
注册时间
2014-1-6
帖子
5052

开拓者

2
发表于 2015-10-6 22:53:05 | 只看该作者
交功课~测试效果良好~
  1. Global_Save.write_save_data(1)
复制代码
  1. Global_Save.load_save_data
复制代码

评分

参与人数 1星屑 +50 收起 理由
RyanBern + 50 感谢支持

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1024
在线时间
1389 小时
注册时间
2010-8-9
帖子
3471
3
发表于 2015-10-7 11:13:53 | 只看该作者
本帖最后由 寒冷魔王 于 2015-10-7 11:56 编辑

可以考虑专门设定一个继承变量。
举个例子
  1. # 初始化   # 将数据统一起来,保证接口一致
  2. $game_variables[Global_Save_Var] = [1,[],[],[],[]] if ($game_variables[Global_Save_Var] == 0)
  3. $game_variables[Week_Var] = $game_variables[Global_Save_Var][0]  # 专门保存周目的变量,用于判断周目数目,如果只是区分一周目和多周目,改成开关也可


  4. # 通关存档   # 可以考虑使用Struct
  5. week = $game_variables[Week_Var]
  6. equip = getEquipData
  7. item = getItemData
  8. actor = getActorData
  9. event = getEventData   # 因为除了继承装备物品角色信息外,可能还会继承事件的进度
  10. initData = [week, equip, item, actor, event]
  11. $game_variables[Global_Save_Var] = initData
复制代码
在新游戏的时候判断一下,将需要继承的数据继承下来。
然后传给二周目以及后续周目。

只有在通关存档时才会改变$game_variables[Global_Save_Var]

另外也需要进行加密处理。

# 如果只是区分一周目和多周目,那么改成开关


# 因为经常判断的是一周目和非一周目,所以单独出来,比直接 $game_variables[Week_Var] == 1方便一些

评分

参与人数 2星屑 +230 收起 理由
冰水金刚 + 30 你啥时来XP了
RyanBern + 200 感谢补充

查看全部评分

SRPG on RM 项目研发组 正式成立。目前SRPG·RMVA系统进度88.8%。SMRC Kernel 进度90%
↖(^ω^)↗热烈庆祝~SMRC Ver5.1 SRPG战棋地图移动范围生成脚本正式发布~~
-----------------------------------------------------------------------------------------
SMRC具有高性能、高兼容、定制自由、使用方便的特点。
1.性能,100移动力轻松算出,无压力;
2.兼容,RGSS1-3通吃,效率保证;
3.支持移动形状定制,支持4方位、6方位、正方形或其他任意有移动规律的形状;
4.可以充当高性能寻路来使用。
【链接点此】
-----------------------------------------------------------------------------------------
【2016/01/06更新 | 改版】RM脚本编辑器Gemini
-----------------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
186 小时
注册时间
2014-6-14
帖子
213
4
发表于 2015-10-7 13:28:28 | 只看该作者
然而不能记录物品啊武器啊那些数据,残念

点评

继承的问题可以参考楼上,稍后我会在主楼补充。  发表于 2015-10-7 13:38
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
71 小时
注册时间
2010-9-20
帖子
104
5
发表于 2015-10-7 16:32:06 | 只看该作者
本帖最后由 Mr.Faint 于 2015-10-7 00:33 编辑
寒冷魔王 发表于 2015-10-6 19:13
可以考虑专门设定一个继承变量。
举个例子在新游戏的时候判断一下,将需要继承的数据继承下来。
然后传给二 ...


啊哈!这个方法好!
做点手脚的话重设经验曲线也可以做到了,感觉变成了可以转生的设定23333

点评

_(:зゝ∠)_这个想法太丧心病狂了!  发表于 2015-10-7 19:00
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
帖子
1516
6
发表于 2015-10-9 16:11:55 手机端发表。 | 只看该作者
储存和读取数据的实际运用。

点评

可以参考置顶的发帖指南啊,里面都有详细的说明。  发表于 2015-10-9 16:44
问一下……自问答有什么要求吗?  发表于 2015-10-9 16:16
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
130 小时
注册时间
2008-8-12
帖子
183
7
发表于 2015-10-9 20:44:13 | 只看该作者
我不做二周目,想用六个全局变量专门记录武器和防具的信息,用作不同存档间的装备互换,应该怎么做?

点评

多设几个变量........直接用数组啊.$bl=[] ,$bl[1] =154646 ,$bl[0]=484  发表于 2015-10-10 09:10
我就想知道怎么多设几个变量  发表于 2015-10-10 08:49
都是数据的储存与读取,本质相同  发表于 2015-10-10 00:22
也需要一个中间的存档来继承。这个帖子也可以适用于此。  发表于 2015-10-9 22:17
Tomorrow
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
帖子
1516
8
发表于 2015-10-10 09:27:06 | 只看该作者
本帖最后由 汪汪 于 2015-10-10 09:41 编辑
兔毛鹿 发表于 2015-10-9 20:44
我不做二周目,想用六个全局变量专门记录武器和防具的信息,用作不同存档间的装备互换,应该怎么做? ...


假设我们要保存一个全局变量 $bl 到数据,
又要把数据读取,  读取出来的东西放到全局变量 $l 里

保存数据用
save_data($bl, "Data/bl.rxdata")
读取数据用
$l = load_data( "Data/bl.rxdata")

然后按自己要的效果慢慢把数据处理掉就好.
至于什么时候用储存,什么时候用读取,看个人需要了..
比如我储存一个武器,  把这个武器定为编号 15

那么就
$bl = 15
save_data($bl, "Data/bl.rxdata")
这样15就储存在了  "Data/bl.rxdata"这个文件里
如果我要读取他就可以用
$l = load_data( "Data/bl.rxdata")
这样$l =15
接着  我就知道了这是一个编号15的武器

当然因为可能是武器,可能是防具,我们可以用数组表示  
[0,15] 表示武器的15号,[1,15]表示防具的15号
$bl = [0,15]
save_data($bl, "Data/bl.rxdata")
这样  [0,15]  这个数据 就储存在了  "Data/bl.rxdata"这个文件里
如果我要读取他就可以用
$l = load_data( "Data/bl.rxdata")
这样  $l =[0,15]
然后我就可以进行判断,因为 $l[0]= 0 所以是武器,$l[1]=15 所以是15号

如果要储存多个数据,其实可以把他放在同一个变量里,
$bl = []
$bl[0] = [1, 5]
$bl[1]  =[0 ,15]
这样其实就是一个[[1,5],[0,15]]的数据

save_data($bl, "Data/bl.rxdata")
这样[[1,5],[0,15]] 这个数据 就储存在了  "Data/bl.rxdata"这个文件里
如果我要读取他就可以用
$l = load_data( "Data/bl.rxdata")
$l = [[1,5],[0,15]]
那么
$l[0] = [1,5]
$l[1]=[0,15]
然后我们对$l[0],$l[1]分别处理就可以了.


其实...$bl 和$l都是全局变量,全局变量 的意思差不多可以理解成这个变量在被建立后在游戏的各个部分都可以调用.(大概应该可能是建立在电脑内存里?)
但是关上游戏这些变量就没了,可能是因为不这样的话,用的内存会越来越多......
所以要想关上游戏变量还有,就应该把他储存成文件

然后打开游戏后的某个时候读取他们


回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
98 小时
注册时间
2011-1-14
帖子
46
9
发表于 2015-10-14 07:45:26 | 只看该作者
说起来癫狂侠客的“脚本不是高手的专利”第14期中提到了可以根据是否是二周目显示不同的标题界面,菜单等等。
不过,如果真要制作二周目的话,还要配合lz所说的建立全局存档的方法,或是配合某位大神的运行中修改数据库的方法。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
311
在线时间
21 小时
注册时间
2017-5-3
帖子
46
10
发表于 2017-5-5 09:11:28 | 只看该作者
有点看不懂......
请问到了如果用这个脚本到了二周目能不能继承上一周目的人物信息,装备,物品什么的?
如果可以的话,那要怎么加强地图的怪物啊?(什么都看不懂......请不要打我

点评

暂时做不到。目前的介绍的办法只是在达到二周目的时候做一个标记,表明现在是二周目。可根据这个标记来方便地判断各种机制等。  发表于 2017-5-9 09:39
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-19 16:43

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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