Project1

标题: 扩展游戏设计思路:超级变量 [打印本页]

作者: 九夜神尊    时间: 2010-10-6 06:56
标题: 扩展游戏设计思路:超级变量
本帖最后由 九夜神尊 于 2010-10-6 06:58 编辑

这也是我在做游戏的时候的一个灵感。
超级变量

超级变量:这些变量表面上和一般变量完全相同,但是不同的是
               这些变量一旦改变,立马保存。但是不会影响到游戏的正常存档



来看看我用超级变量实现的一个简单的效果。


实现这样的效果只需要简简单单的。


我说过了,超级变量都是在更改的瞬间保存。
超级变量是用来对存档做一个辅助作用。作用有很多很多。
我在口述一个作用吧。
给每一个存档设定一个存档次数。一个保存在游戏内,一个保存在超级变量
每存档一次,两个数均+1

如果玩家有通过复制存档来SL游戏,会出现存档次数不符合。完全可以在游戏内部发现。
  1. #==================================================================
  2. # ■SUPER_VARISBLES
  3. #------------------------------------------------------------------
  4. #  超级变量
  5. #===================================================================


  6. =begin


  7. 版本1.0

  8. 脚本作用:独立一些变量为特殊变量,这些变量在改变的同时就会保存。

  9. 使用方法:设置变量首尾ID,此外需设定特殊变量保存位置(可以让玩家找不到的位置)

  10. 注意事项:特殊变量最好不要做其他用途。
  11.           使用特殊变量后存档由两部分组成
  12.           请确保变量总数超过尾ID
  13.           超级变量首变量和尾变量被系统保利,请勿使用
  14.          

  15. 可能冲突:暂无,若冲突请查看○标志的地方。


  16. =end

  17. class Super_Varisbles
  18.   VAR_HEAD = 81  #设定超级变量首ID
  19.   VAR_LAST = 100 #设定超级变量尾ID
  20.   SEAT = ""#这里设定保存的位置,默认为游戏目录,例"save/"即为保存在save文件夹中。
  21.   #原设定表示81-100号变量为超级变量。
  22.   #--------------------------------------------------------------------------
  23.   # ● 初始化
  24.   #--------------------------------------------------------------------------
  25.   def index
  26.     $game_variables[VAR_HEAD]+1
  27.   end
  28.   
  29.   #--------------------------------------------------------------------------
  30.   # ● 执行存档
  31.   # id :存档编号,若存档编号为空则自动寻找存档编号
  32.   #--------------------------------------------------------------------------
  33.   def save(id = 0)
  34.     id = id == 0? index : id
  35.     var = []
  36.     for i in VAR_HEAD...VAR_LAST
  37.       var.push($game_variables[i])
  38.     end
  39.     file = File.open(file_name(id), "wb")
  40.     Marshal.dump(var,file)  #写入数据
  41.     file.close
  42.    
  43.   end#save(id = 0)
  44.   #--------------------------------------------------------------------------
  45.   # ● 执行读档
  46.   # id :存档编号
  47.   #--------------------------------------------------------------------------
  48.   def load(id=0)
  49.     id = id == 0? index : id
  50.     return if !FileTest.exist?(file_name(id))
  51.     file = File.open(file_name(id), "rb")
  52.     var = Marshal.load(file) #读取数据
  53.     file.close
  54.     for i in VAR_HEAD...VAR_LAST
  55.       $game_variables[i] = var[i-VAR_HEAD]
  56.     end
  57.   end #load(id=0)
  58.   #--------------------------------------------------------------------------
  59.   # ● 获取文件名
  60.   # id :存档编号
  61.   #--------------------------------------------------------------------------
  62.   def file_name(id=0)
  63.     SEAT+"super_var"+ (id).to_s + ".rvdata"
  64.   end

  65.   
  66.   
  67.   
  68.   
  69. end#SUPER_VARISBLES

  70. #==============================================================================
  71. # ■ Scene_File
  72. #------------------------------------------------------------------------------
  73. #  存档画面及读档画面的类。
  74. #==============================================================================

  75. class Scene_File < Scene_Base
  76.   

  77.   #--------------------------------------------------------------------------
  78.   # ● 执行存档
  79.   #--------------------------------------------------------------------------
  80.   alias super_varisbles_do_save do_save
  81.   def do_save
  82.     super_varisbles_do_save
  83.     $game_variables[Super_Varisbles::VAR_HEAD] = @index
  84.     Super_Varisbles.new.save
  85.     $game_variables[Super_Varisbles::VAR_LAST] = 1
  86.   end
  87.   #--------------------------------------------------------------------------
  88.   # ● 执行读档
  89.   #--------------------------------------------------------------------------
  90.   alias super_varisbles_do_load do_load
  91.   def do_load
  92.     $game_variables[Super_Varisbles::VAR_LAST] = 0
  93.     super_varisbles_do_load
  94.    
  95.     $game_variables[Super_Varisbles::VAR_HEAD] = @index
  96.     Super_Varisbles.new.load
  97.     $game_variables[Super_Varisbles::VAR_LAST] = 1
  98.   end
  99.   
  100. end
  101. #==============================================================================
  102. # ■ Game_Variables
  103. #------------------------------------------------------------------------------
  104. #  处理变量的类。编入的是类 Array 的外壳。本类的实例请参考 $game_variables。
  105. #==============================================================================

  106. class Game_Variables
  107.   #--------------------------------------------------------------------------
  108.   # ● 设置变量
  109.   #     variable_id : 变量 ID
  110.   #     value       : 变量的值
  111.   #--------------------------------------------------------------------------
  112.   def []=(variable_id, value)
  113.     if variable_id <= 5000
  114.       @data[variable_id] = value
  115.     end
  116.     if variable_id >= Super_Varisbles::VAR_HEAD and variable_id < Super_Varisbles::VAR_LAST
  117.       if $game_variables[Super_Varisbles::VAR_LAST] != 0
  118.         Super_Varisbles.new.save #保存变量
  119.       end
  120.       
  121.     end
  122.    
  123.   end
  124. end
  125. #======================================================================
  126. # 作者:九夜神尊
  127. #======================================================================
复制代码
好了这是范例。
你可以F9然后改变超级变量然后不保存关闭游戏,下次打开在查看这些变量。

超级变量.rar

247.48 KB, 下载次数: 660


作者: EngShun    时间: 2010-10-6 08:04
本帖最后由 EngShun 于 2010-10-6 08:13 编辑

沙发没人坐,我坐了哈哈,我比较希望是XP的,但VX的脚本我也拿了。
作者: 九夜神尊    时间: 2010-10-6 08:26
回复 EngShun 的帖子

真的有人想要的话,我再写个XP的。
   
作者: 38571240    时间: 2010-10-6 08:44
终于出现了!!感动啊!!这样成就啦二周目啦CG收集啦之类的都可以便利地做出来了
作者: 葬侍    时间: 2010-10-6 08:46
好绝情的变量啊
作者: 菜鸟飞呀飞    时间: 2010-10-6 09:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: EngShun    时间: 2010-10-6 09:19
回复 九夜神尊 的帖子
虽然VX我有研究,但我比较专注于XP,所以想要XP的

   
作者: 九夜神尊    时间: 2010-10-6 09:25
回复 菜鸟飞呀飞 的帖子
只是你没有遇到相关的问题。
就首先,战斗失败你怎么统计?

   
作者: 459645195    时间: 2010-10-6 09:49
给个rmxp的脚本吧
作者: 小鱼子    时间: 2010-10-6 10:19
支持,正愁没得用这样的脚本。
感动啊……
作者: 懒De说    时间: 2010-10-6 11:41
我很早前在游戏中就用过这个功能了
这功能适合用在仿网游的游戏中
作者: 红灯    时间: 2010-10-6 21:46
这个脚本作用还真挺大的。
作者: 沉影不器    时间: 2010-10-7 21:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: 九夜神尊    时间: 2010-10-7 22:13
回复 沉影不器 的帖子

谈不上优化
理由:每次更改超级变量,都会导致生成一次文件。
要是设置了1000个超级变量。那改动其中一个,那么着1000个都会保存一次。
虽然用时可以忽略的说。但是用来优化其他东西就……
作者: 沉影不器    时间: 2010-10-8 21:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: 九夜神尊    时间: 2010-10-8 22:55
本帖最后由 九夜神尊 于 2010-10-8 22:56 编辑

回复 沉影不器 的帖子
我的初衷实际上就是为了实现这些效果。

绝对存档:一台电脑的某一个存档是确定的,外来存档不能使用

防复制存档SL:防SL除了要自动存档之外,还要防止复制存档。

游戏监视器:玩家在如果受不了了直接关游戏了。系统可以保留当时可以保存的一些情况。以自调,比如在一个看不到墙壁的迷宫里,如果玩家关闭游戏。下次打开的时候这些墙壁就会显示出来。、

自动备份:一些关键的地方,游戏自动备份一个存档,如果玩家战败。玩家会很懊恼,也许玩了很久的又要重来。但是真正打开游戏以后,提示不要放弃,是否打开自动备份的存档,这会让玩家觉得很贴心,更喜欢这个游戏。

游戏自调难度。比如在某一场BOSS战中战败了,下次打开系统会鼓励你。如果再战败,系统会提示你和BOSS战斗的技巧。如果再战败,系统会降低BOSS的能力。如果再战败,系统直接放行。

姬文翔的那游戏里面很多这样的人性化的系统。


作者: 沉影不器    时间: 2010-10-9 23:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: 九夜神尊    时间: 2010-10-9 23:32
回复 沉影不器 的帖子

防复制也简单,每次存档都会导致存档次数+1

存档次数分成两份保存,一份在存档,另一份在云端(也许可以放在C盘某文件夹)

如果玩家复制了存档去做某件事情,然后失败了,存档次数会+1的。

如果玩家删掉存档把备份的放进来,备份的存档的次数是对不上的。
作者: 越前リョーマ    时间: 2010-10-10 15:28
有些玩家要重前面一个档案重玩但并不是为了SL刷什么……这样不是很矛盾么 = =

超级变量……可以说是保存在游戏本身的一个变量吧?
作者: 九夜神尊    时间: 2010-10-10 16:59
回复 越前リョーマ 的帖子

所以超级变量的使用是需要注意的!

普通变量如果放到超级变量的位置,必然产生BUG,比如某宝箱导致某变量+10,如果这个变量用到了超级变量。
那么可以无限刷了。

超级变量是用来保存一些意外(game over,受不了关闭游戏,意外强制关闭)产生时,来不及存档的重要变量。
比如火焰之纹章里虽然战败重新游戏,但是也会对 最后评价有影响。

但是非要把某物的收集数量用成超级变量的话,只能说那作者BUG了!
作者: 沉影不器    时间: 2010-10-21 19:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: 574656549    时间: 2011-2-15 17:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: 星辰天羽    时间: 2011-4-21 06:27
偶尔撞见,发现这绝对是好东西……我还在想要不要定制- -
作者: 3202972    时间: 2011-4-21 10:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: 精灵使者    时间: 2011-4-26 09:18
本帖最后由 精灵使者 于 2011-4-26 09:19 编辑

其实完全可以用全局变量来做……稍微修改一下储存和读取的数据结构就可以防止不同电脑的存档引用啦。




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