Project1

标题: 10V求保存“创造的装备”进存档的方法 [打印本页]

作者: fux2    时间: 2011-6-4 20:51
标题: 10V求保存“创造的装备”进存档的方法
本帖最后由 fux2 于 2011-6-4 22:24 编辑

如何将游戏中打造的装备存起来而不与原始的装备数据库冲突……
在下苦思这个问题很久,
目前是把创造的装备存入$data_weapons,但是发现如果在RM编辑界面加入新装备会ID冲突
保存入一个新的数组会让装备的读取变得困难(game_party只储存装备ID,读取不知道该怎么办)
另外楼下说的将ID和索引设置大一点也考虑过,会让$data_weapons遍历速度变慢
于是求一个比较完善的方法,悬赏金额可以增加.
作者: 后知后觉    时间: 2011-6-4 20:51
运行时创造装备的存储.rar (190.46 KB, 下载次数: 133)

原理:
只做了武器和防具.
在 Game_Party 新建了2个数组和2个哈希表来存储运行是创造的装备和数量.
还用了2个实例变量来记录数据库 $data_xxx 的 size
给 RPG::Weapon 和 RPG::Armor 新增加了一个 real_id
用于记录其在数据库的原型id.保留id和索引一致.
开放 Game_Actor 的 weapon_id armor1_id armor2_id....的直接外部 = 号写入
修改了角色对装备是否可以装备的判断 equippable?
因为RM默认系统对于角色能装备某装备是通过职业里打钩来决定的.
所以再用id来判定的话.新创造的装备id肯定不在其中.所以改用real_id 进行判定.
然后就是最蛋疼的在读档时候的id修正.
因为游戏更新可能改变数据库装备的总个数.所以旧版本玩家存档里的装备id.
就会有可能指向新增的数据库装备.
这时就要对其进行修正.
在 Scene_Shop 减少装备时.装备数量为 0的话.就会把 该装备id位置处设置为 nil
然后在下次读档的时候清空 nil.当然 nil 的位置被清空.也会造成后面装备的id出现偏差.
所以也进行了修正.
这样做不知道会不会有后遗症.角色装备的id 会在读档后发生变化.虽然指向的还是原来的那个装备.
代码应该还有很大的缩水空间.目前就先这样了......
作者: Wind2010    时间: 2011-6-4 20:54
直接在Scene_Save和Scene_Load里的存读档中把$data_weapons也写入不行么
作者: fux2    时间: 2011-6-4 21:04
Wind2010 发表于 2011-6-4 20:54
直接在Scene_Save和Scene_Load里的存读档中把$data_weapons也写入不行么

如何写?例如我新建的装备ID为32,然后存档之后回到RMXP编辑界面增加一个新武器,ID也是32,读取存档的时候这个新武器就被忽略了。
作者: 菜鸟飞呀飞    时间: 2011-6-4 21:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: enghao_lim    时间: 2011-6-4 22:57
为装备添加一个新的ID吧,判断数量的时候取新ID,辨认是否和元数据冲突使用新ID和旧ID做比较。
这个是参考仙剑四的。
作者: 匿名    时间: 2011-6-4 23:11
本帖最后由 匿名 于 2011-6-4 23:36 编辑


黑幕邪术之石器随机装备系统之存取部分
  1.     $data_weapons[to] = Marshal.load(Marshal.dump($data_weapons[from]))
  2.     $data_weapons[to].id = to
复制代码
制造时关键代码就两行- -

汝把造的东西全部存一个GAME_PARTY下开的数组里就行了(不是ID,而是彻底的把这东西丢里面- - 偶是万恶的深度拷贝
读的时候把数组抓来往$data_weapons里面丢

所有ID必须不同是废话- - 故而新建物品必须有新ID

读取时的黑幕代码就三行- -
  1.     for i in $game_party.get_un_w.keys
  2.       $data_weapons[i] =   Marshal.load(Marshal.dump($game_party.get_un_w[i]))
  3.     end  
复制代码
有啥问题直接拆开石器看就行了- -
石器是无敌的!


啥?读取和遍历的效率问题?
在石器中所有随机生成物品的ID皆在2000以后或0以前(别问偶怎么重定义数组的负数规则的- -)
数据库到随机物品中间的地方全是NIL
遍历怎么玩捏?
FOR循环- - 爱查数据库查数据库 爱查随机物查随机物
别告诉偶乃们不打算在有了随机物品后做垃圾回收了。
队伍中已经不持有的并且短期内容不到的随机生成物就该果断被轰成NIL(当然石器里没有干掉$DATA_WEAPONS里那坨,回收的全是$GAME_PARTY的那坨,原因是寻找新随机物ID时按照的是$GAME_PARTY的那坨然后会顺势轰杀掉$DATA_WEAPONS里那坨)
于是,GC做得好的话效率没问题- -

接下来汝等要考虑的问题是当用户拥有几万种物品后的窗口绘制崩溃问题
这个问题在石器的随机系统我弄成后的一星期内被用户反馈。

偶的用户是如此的狂热地刷装备- -
于是导致了另外一个效率问题值得改善的地方就是刷新窗口那坨。
于是一星期后的石器版本在这方面也被彻底搞干净了。
于是,重点其实很简单。
那就是,石器是无敌的!

呃……接下来还有啥捏?
貌似啥都搞定了……
既然如此,剩下就随便继续喊喊吧……

石器是无敌的!

哦耶 ~\(≧▽≦)/~


作者: 忧雪の伤    时间: 2011-6-5 10:56
  1. class Scene_Title
  2.   alias random_main main unless $@
  3.   def main
  4.     random_main
  5.     $data_weapons.push(RPG::Weapon.new)
  6.     $data_weapons[-1].name = 'New Weapon'
  7.     $data_weapons[-1].id = $data_weapons.size - 1
  8.     $game_party.gain_weapon($data_weapons[-1].id, 1)
  9.   end
  10. end
复制代码
存档后并没有什么问题的样子。
作者: 心雪    时间: 2011-6-5 11:18
本帖最后由 心雪 于 2011-6-5 14:08 编辑

定义一个新数组,保存自定义装备数据,然后写入存档,读档的时候直接
$data_weapons = $data_weapons + 自定义数组

好吧……还挺麻烦的……
范例提供:
Project52.rar (191.68 KB, 下载次数: 56)

[line]1[/line]

貌似没想到装备的ID改变的问题……恩……这些小问题就不用修复了吧~

作者: fux2    时间: 2011-6-5 12:04
后知后觉 发表于 2011-6-5 11:51
原理:
只做了武器和防具.
在 Game_Party 新建了2个数组和2个哈希表来存储运行是创造的装备和数量.

一旦原有数据库装备ID改变后所有新装备的ID都需要改变吗?
作者: 匿名    时间: 2011-6-5 12:16
本帖最后由 匿名 于 2011-6-5 12:20 编辑
  1. $data_weapons[to] = Marshal.load(Marshal.dump($data_weapons[from]))
  2. #↑偶能直接这样克隆一个装备的所有数据生成副本有木有~\(≧▽≦)/~
  3.     $data_weapons[to].id = to
  4. #↑数据库编号就是ID有木有~\(≧▽≦)/~
复制代码
故而这段秒杀上面所有人~\(≧▽≦)/~
其实SIZE这东西本身就是浮云……
忽然发现石器里的判断是否可以装装备已经被改得相当神奇了
作者: 后知后觉    时间: 2011-6-5 12:25
fux2 发表于 2011-6-5 12:04
一旦原有数据库装备ID改变后所有新装备的ID都需要改变吗?

我写那个不是需要改变是一定会改变.
不只是数据库的数量变了会影响到这个.
在游戏运行时.玩家在商店出售了新创造的装备后.
在下次读档的时候.在该出售装备id之后的装备id也会发生改变.
id变了.不过 real_id 没变
作者: fux2    时间: 2011-6-5 14:34
心雪 发表于 2011-6-5 11:18
定义一个新数组,保存自定义装备数据,然后写入存档,读档的时候直接
$data_weapons = $data_weapons + 自 ...

表示存档之后装备就消失了,连基本要求都未达成= =
作者: 心雪    时间: 2011-6-5 15:03
fux2 发表于  
表示存档之后装备就消失了,连基本要求都未达成= =

[img]http://panduk.zoomshare.com/files/Wea.jpg[\img]
这是读档后的状态……我真的没发现问题在哪……
顺便提供新的工程……原工程在添加第二次武器的时候会出现二次添加的情况
http://panduk.zoomshare.com/files/Project52.rar
6R大姨妈不能上附件了么……
作者: fux2    时间: 2011-6-5 15:11
心雪 发表于  
http://panduk.zoomshare.com/files/Wea.jpg[\img]
这是读档后的状态……我真的没发现问题在哪……
顺便 ...

存档之后退出修改武器数据库最大值,新建道具ID就改变了,原本穿在身上的装备就不见了
作者: fux4    时间: 2011-6-5 15:19
后知后觉 发表于  
我写那个不是需要改变是一定会改变.
不只是数据库的数量变了会影响到这个.
在游戏运行时.玩家在商店出售 ...

后知后觉大人的工程没问题,但是重定义部分太多,与咱的工程冲突太大
咱还是需要尽量减少手术复杂程度……
作者: fux2    时间: 2011-6-8 18:53
啊,自顶一下,楼上个各位真对不起,这三天咱高考,怠慢之处请见谅……
作者: 精灵使者    时间: 2011-6-8 19:09
本帖最后由 精灵使者 于 2011-6-8 19:11 编辑

保存进存档?
我记得没错的话应该是
存档:
一般来说,数据库的运行时修改随存档文件保存比较好,这样剧情中的更改不会影响新建游戏。
以下是相关的保存用代码:
  1. class Scene_Save
  2. alias sailcat_write_save_data write_save_data
  3. def write_save_data(file)
  4.    sailcat_write_save_data(file)
  5.    # 写入数据库
  6.    Marshal.dump($data_actors, file)
  7.    Marshal.dump($data_classes, file)
  8.    Marshal.dump($data_skills, file)
  9.    Marshal.dump($data_items, file)
  10.    Marshal.dump($data_weapons, file)
  11.    Marshal.dump($data_armors, file)
  12.    Marshal.dump($data_enemies, file)
  13.    Marshal.dump($data_troops, file)
  14.    Marshal.dump($data_states, file)
  15.    Marshal.dump($data_animations, file)
  16.    Marshal.dump($data_tilesets, file)
  17.    Marshal.dump($data_common_events, file)
  18.    Marshal.dump($data_system, file)
  19. end
  20. end
  21. class Scene_Load
  22. alias sailcat_read_save_data read_save_data
  23. def read_save_data(file)
  24.    sailcat_read_save_data(file)
  25.    $data_actors = Marshal.load(file)
  26.    $data_classes = Marshal.load(file)
  27.    $data_skills = Marshal.load(file)
  28.    $data_items = Marshal.load(file)
  29.    $data_weapons = Marshal.load(file)
  30.    $data_armors = Marshal.load(file)
  31.    $data_enemies = Marshal.load(file)
  32.    $data_troops = Marshal.load(file)
  33.    $data_states = Marshal.load(file)
  34.    $data_animations = Marshal.load(file)
  35.    $data_tilesets = Marshal.load(file)
  36.    $data_common_events = Marshal.load(file)
  37.    $data_system = Marshal.load(file)
  38. end
  39. end
复制代码
这个脚本使用时可以灵活处理,你改了哪些对象,就保存哪些,没改的,就不存,删掉其中的对应行,但是一定要注意,save和load里面的存取对象列表,必须完全相同,不但完全相同,连顺序也要一一对应才可以。
精灵至关重要的话:
可以保存进去任何变量,数组(照猫画老虎),但是一定要顺序完全相同。






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