查看: 2377|回复: 5

[已经解决] 问一些关于二周目制作的问题

[复制链接]
梦石
0
星屑
55
在线时间
71 小时
注册时间
2010-9-20
回帖
78
发表于 2015-10-6 06:32:43 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Mr.Faint 于 2015-10-5 15:39 编辑

关于“创建特殊存档,然后开始游戏时判定存档存在”这个方法,如何联动之前通关存档的数据呢?比如保留某项技能或者某项物品?
所谓的特殊存档里面好像不会写什么内容,如此一来这个文件只是一个判断“是否通关过”的开关吧?
那么是不是可以用非常愚蠢的办法脚本关掉所有开关,事件关闭独立开关、重置变量、回到初始地点、删除所有道具技能,然后开启一个二周目的开关来操作新增内容,更改一个周目数变量来操纵多周目内容。
关于清空物品,可以用简便方法么?比如$game_party_item.clear.(这么写肯定不对- -可是应该怎么写?)
此外关于全局变量,不是很看得懂功能,使用全局变量能做到继承内容么?
那么对于继承通关存档开启二周目的游戏来说,创建特殊存档,使用全局变量来设置二周目的优势何在呢?

评分

参与人数 1星屑 +35 收起 理由
RyanBern + 35 手动认可奖励

查看全部评分

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
回帖
1464
发表于 2015-10-6 08:05:16 | 显示全部楼层
本帖最后由 汪汪 于 2015-10-6 08:47 编辑

存档就是一个保存有数据的文件...当然你也可以为空.
如何联动之前通关存档的数据呢?
这个存档+读档就可以了.
额,使用下面的方法的确可以实现,不过好像没什么必要.....比如 数据清空什么的,其实可以通过读取初始时的存档实现,
其实我也没做过二周目,不过应该只是一个存档读档的问题
点击展开/收起

#==============================================================================
# ■ Scene_Save
#------------------------------------------------------------------------------
#  处理存档画面的类。
#==============================================================================

class Scene_Save < Scene_File
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super("要保存到这个文件吗?")
  end
  #--------------------------------------------------------------------------
  # ● 确定时的处理
  #--------------------------------------------------------------------------
  def on_decision(filename)
    # 演奏存档 SE
    $game_system.se_play($data_system.save_se)
    # 写入存档数据
    file = File.open(filename, "wb")                       #这句是打开 一个文件(文件名为  变量filename 的值)
    write_save_data(file)                                         # 这里是使用   写入数据  的方法
    file.close                                                              #关上文件
    # 如果被事件调用
    if $game_temp.save_calling
      # 清除存档调用标志
      $game_temp.save_calling = false
      # 切换到地图画面
      $scene = Scene_Map.new
      return
    end
    # 切换到菜单画面
    $scene = Scene_Menu.new(4)
  end
  #--------------------------------------------------------------------------
  # ● 取消时的处理
  #--------------------------------------------------------------------------
  def on_cancel
    # 演奏取消 SE
    $game_system.se_play($data_system.cancel_se)
    # 如果被事件调用
    if $game_temp.save_calling
      # 清除存档调用标志
      $game_temp.save_calling = false
      # 切换到地图画面
      $scene = Scene_Map.new
      return
    end
    # 切换到菜单画面
    $scene = Scene_Menu.new(4)
  end
  #--------------------------------------------------------------------------
  # ● 写入存档数据
  #     file : 写入用文件对像 (已经打开)
  #--------------------------------------------------------------------------
  def write_save_data(file)                       #如上面说的
    # 生成描绘存档文件用的角色图形
    characters = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors
      characters.push([actor.character_name, actor.character_hue])
    end
    # 写入描绘存档文件用的角色数据
    Marshal.dump(characters, file)                                               
    # 写入测量游戏时间用画面计数
    Marshal.dump(Graphics.frame_count, file)            
    # 增加 1 次存档次数
    $game_system.save_count += 1
    # 保存魔法编号
    # (将编辑器保存的值以随机值替换)
    $game_system.magic_number = $data_system.magic_number
    # 写入各种游戏对像                  #就是如前面说的,把数据写到文档里,下面的是一些变量 ,上面还有两个
    Marshal.dump($game_system, file)
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    Marshal.dump($game_self_switches, file)
    Marshal.dump($game_screen, file)
    Marshal.dump($game_actors, file)
    Marshal.dump($game_party, file)
    Marshal.dump($game_troop, file)
    Marshal.dump($game_map, file)
    Marshal.dump($game_player, file)
  end
end

#==============================================================================
# ■ Scene_Load
#------------------------------------------------------------------------------
#  处理读档画面的类。
#==============================================================================

class Scene_Load < Scene_File
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    # 再生成临时对像
    $game_temp = Game_Temp.new
    # 选择存档时间最新的文件
    $game_temp.last_file_index = 0
    latest_time = Time.at(0)
    for i in 0..3
      filename = make_filename(i)
      if FileTest.exist?(filename)
        file = File.open(filename, "r")
        if file.mtime > latest_time
          latest_time = file.mtime
          $game_temp.last_file_index = i
        end
        file.close
      end
    end
    super("要载入哪个文件?")
  end
  #--------------------------------------------------------------------------
  # ● 确定时的处理
  #--------------------------------------------------------------------------
  def on_decision(filename)
    # 文件不存在的情况下
    unless FileTest.exist?(filename)
      # 演奏冻结 SE
      $game_system.se_play($data_system.buzzer_se)
      return
    end
    # 演奏读档 SE
    $game_system.se_play($data_system.load_se)
    # 写入存档数据
    file = File.open(filename, "rb")                        #打开 要读取的文件
    read_save_data(file)                                         #使用读取文件的方法
    file.close                                                                #关上打开的文件
    # 还原 BGM、BGS
    $game_system.bgm_play($game_system.playing_bgm)
    $game_system.bgs_play($game_system.playing_bgs)
    # 刷新地图 (执行并行事件)
    $game_map.update
    # 切换到地图画面
    $scene = Scene_Map.new
  end
  #--------------------------------------------------------------------------
  # ● 取消时的处理
  #--------------------------------------------------------------------------
  def on_cancel
    # 演奏取消 SE
    $game_system.se_play($data_system.cancel_se)
    # 切换到标题画面
    $scene = Scene_Title.new
  end

  #--------------------------------------------------------------------------
  # ● 读取存档数据
  #     file : 读取用文件对像 (已经打开)
  #--------------------------------------------------------------------------
  def read_save_data(file)
    # 读取描绘存档文件用的角色数据
    characters = Marshal.load(file)                                               #  可以对比存档的脚本, Marshal.dump(characters, file)     
    # 读取测量游戏时间用画面计数
    Graphics.frame_count = Marshal.load(file)                                          #  可以对比存档的脚本,     Marshal.dump(Graphics.frame_count, file)            
    # 读取各种游戏对像
    $game_system        = Marshal.load(file)                                       #  可以对比存档的脚本,    Marshal.dump($game_system, file)
    $game_switches      = Marshal.load(file)                                       #  可以对比存档的脚本, Marshal.dump($game_switches, file)
    $game_variables     = Marshal.load(file)                                       #  可以对比存档的脚本,   Marshal.dump($game_variables, file)
    $game_self_switches = Marshal.load(file)                                       #  可以对比存档的脚本,  Marshal.dump($game_self_switches, file)
    $game_screen        = Marshal.load(file)                                       #  可以对比存档的脚本,     Marshal.dump($game_screen, file)
    $game_actors        = Marshal.load(file)                                       #  可以对比存档的脚本,     Marshal.dump($game_actors, file)
    $game_party         = Marshal.load(file)                                       #  可以对比存档的脚本,     Marshal.dump($game_party, file)
    $game_troop         = Marshal.load(file)                                       #  可以对比存档的脚本,     Marshal.dump($game_troop, file)
    $game_map           = Marshal.load(file)                                       #  可以对比存档的脚本,     Marshal.dump($game_map, file)
    $game_player        = Marshal.load(file)                                       #  可以对比存档的脚本,     Marshal.dump($game_player, file)
    # 魔法编号与保存时有差异的情况下                                       #可以看出,读取存档就是把 相应的数据  设置为 存档中记录的数据,所有数据都变了,所以变成存档时的游戏
    # (加入编辑器的编辑过的数据)
    if $game_system.magic_number != $data_system.magic_number
      # 重新装载地图
      $game_map.setup($game_map.map_id)                                 
      $game_player.center($game_player.x, $game_player.y)
    end
    # 刷新同伴成员
    $game_party.refresh
  end
end


如果只保存一部分的数据,再只读取一部分的数据,此时不会完全变成存档时的样子,只有保存和读取部分的数据是存档时的..
在存档读档时也可以弄一个临时的变量,自己弄一些判断,处理一下临时的变量再处理事关游戏全局的变量  (那些$开头的),
当然也可以存一些私货,
比如存档时
    characters = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors
      characters.push([actor.character_name, actor.character_hue])
    end
    # 写入描绘存档文件用的角色数据
    Marshal.dump(characters, file)              

就是把    描绘存档文件用的角色数据    写了进去
在
#==============================================================================
# ■ Window_SaveFile
#------------------------------------------------------------------------------
#  显示存档以及读档画面、保存文件的窗口。
#==============================================================================
里

就只读取了存档的一部分 ,


  def initialize(file_index, filename)
    super(0, 64 + file_index % 4 * 104, 640, 104)
    self.contents = Bitmap.new(width - 32, height - 32)
    @file_index = file_index
    @filename = "Save#{@file_index + 1}.rxdata"
    @time_stamp = Time.at(0)
    @file_exist = FileTest.exist?(@filename)
    if @file_exist
      file = File.open(@filename, "r")
      @time_stamp = file.mtime                       
      @characters = Marshal.load(file)          #这个就是   读取了        描绘存档文件用的角色数据,所以读档画面里才有了当时的角色的 图像,
      @frame_count = Marshal.load(file)
      @game_system = Marshal.load(file)
      @game_switches = Marshal.load(file)
      @game_variables = Marshal.load(file)
      @total_sec = @frame_count / Graphics.frame_rate
      file.close
    end
    refresh
    @selected = false
  end





评分

参与人数 1星屑 +90 收起 理由
RyanBern + 90 塞糖

查看全部评分

回复

使用道具 举报

梦石
0
星屑
55
在线时间
71 小时
注册时间
2010-9-20
回帖
78
 楼主| 发表于 2015-10-6 09:42:11 | 显示全部楼层
汪汪 发表于 2015-10-5 16:05
存档就是一个保存有数据的文件...当然你也可以为空.
如何联动之前通关存档的数据呢?
这个存档+读档就可以 ...

唔,怎么说呢制作二周目的方法我已经会了,我只是在思考存档法和全局变量法的优势,还有它们的其他用法。
或许可以出现类似续作继承前作存档的设定{:2_270:}

点评

在我看来,全局变量就是游戏运行中实时调用的存档,存档就是暂时保存的变量  发表于 2015-10-6 14:22
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2015-10-6 10:01:12 | 显示全部楼层
清空道具的问题在图书馆2楼已经给出,请查询一下。当然,如果将队伍中所有内容都清空,最简单粗暴的就是写下面这句:
[pre lang="Ruby"]$game_party = Game_Party.new[/pre]
当然这么做有一定的问题。就是它只清空了道具金钱,但是队员的状态没有清除。这个没有关系,因为这至少清除了队伍中的队员名单。在下次添加队员时,记得勾选【初始化】,这样加入的队员等级和技能都是初期状态。
总之,你想清空什么,就模仿着Scene_Title里面的command_new_game里面的语句来,一般不会出错。
有关特殊存档和全局变量,在我看来这就是一个东西。因为全局变量和存档无关,它作用在整个游戏上的。而特殊存档,你可以认为是存储在外面的一个开关,游戏通过检查这个文件来判断是否通关过。因此,无论是哪种方式,你只需要在通关游戏时改变一下全局变量,或者生成一个特殊存档,这样就可以新开一个档位来达到二周目的效果,而不必费事地在原始存档中打开普通开关,然后将各种游戏对象复位了。

至于继承前作存档的设定,我曾经制作过这样的游戏。当时我的游戏是分章发布的,所以第二章可以继承第一章的存档(当然没有第一章的存档直接玩第二章也行)。制作这个效果也比较简单,大前提就是你在续作中不能动前作已经动过的开关或者是变量,也不能改变道具和武器的位置(当然有特殊需求的除外)。由于RMXP存档格式是通用的,所以续作是认得前作存档的,但是你在读档的时候要做一个存档有效性检查,防止意外情况发生(例如有些人拿着前作未通关的存档放到续作中)。总之,细节部分比较多,我也不知道该具体说些什么,请楼主再说一下自己想知道的问题。
回复

使用道具 举报

梦石
0
星屑
9687
在线时间
3224 小时
注册时间
2011-3-24
回帖
616

开拓者

发表于 2015-10-6 11:14:38 | 显示全部楼层
完全是可以的,存档里存的不过是各类游戏对象而已,就算你要读取前作的存档,那也可以,只要你处理好前作游戏对象和现有游戏对象的差异就可以了,
因为ruby的marshal可以说是直接把对象给压进文件里了,所以只要把它从文件里还原出来,再提取需要的数据(比如要继承的物品)载入到当前的游戏即可。

评分

参与人数 1星屑 +90 收起 理由
RyanBern + 90 塞糖

查看全部评分

>>→Lanza Games 2020←<<
Lanza Schneider
浪子心,孤星梦永远流浪……
~不会放弃,我的精力永远充沛~
>>>>>Lanza Adventure<<<<<
>>>>>Lanza的新年派对!<<<<<
>>>>>Lanza的口袋心脏病!<<<<<
回复

使用道具 举报

梦石
0
星屑
55
在线时间
71 小时
注册时间
2010-9-20
回帖
78
 楼主| 发表于 2015-10-7 05:51:41 | 显示全部楼层
RyanBern 发表于 2015-10-5 18:01
清空道具的问题在图书馆2楼已经给出,请查询一下。当然,如果将队伍中所有内容都清空,最简单粗暴的就是写 ...

原来如此!所以哪怕粗暴地清空也没有关系,需要保留的数据可以在清空的同时直接进行调整,然后在下一周目遇到队友的时候进行周目开关的判定就行了!
还是打算选择简单一点的方法,存档数据的更改感觉很麻烦,包括以前看到的生成文件进行判定- -。
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部