本帖最后由 怠惰な騎士 于 2017-6-17 19:47 编辑
谨慎传递“引用”——在使用“数据”时,避免传递“引用”
BattleManager中使用this._actionBattlers来生成接下来将要行动的角色并对他们进行排序,但JavaScript中,数组是“引用”类型,如果直接将$gameTroop.members()赋值给this._actionBattlers,实质是让this._actionBattler和$gameTroop.members()对象本身等同了。
在这种情况下,任何针对this._actionBattlers的操作,将会直接影响$gameTroop.members()的原始数据。
因此请避免在使用$game系列对象的“数据”时,直接将“引用”传递给其他对象,否则极有可能诞生意想不到的奇怪BUG。
储存全局数据(用于实现周目记录等)
RMMV使用“头信息”+“实际数据”的方式保存游戏数据。
通过DataManager.makeSavefileInfo生成头数据
通过DataManager.makeSaveContents生成实际数据
并且在DataManager.saveGameWithoutRescue中将上述两个数据分别保存到global.rpgsave和file{N}.rpgsave中。
DataManager.saveGameWithoutRescue通过“savefileId”来为globalInfo建立索引,而其中“0”这个索引是没有被用过的。
所以可以通过修改DataManager.saveGameWithoutRescue,在保存的时候,额外使用globalInfo[0]记录需要全局保存的信息。
代码示例:
var globalInfo = this .loadGlobalInfo ( ) || [ ] ;
globalInfo[ savefileId] = this .makeSavefileInfo ( ) ;
globalInfo[ 0 ] = this .makeGlobalSavefileInfo ( ) ; // 假设this.makeGlobalSavefileInfo()是你所写的记录需要全局保存的信息的方法
this .saveGlobalInfo ( globalInfo) ;
var globalInfo = this .loadGlobalInfo ( ) || [ ] ;
globalInfo[ savefileId] = this .makeSavefileInfo ( ) ;
globalInfo[ 0 ] = this .makeGlobalSavefileInfo ( ) ; // 假设this.makeGlobalSavefileInfo()是你所写的记录需要全局保存的信息的方法
this .saveGlobalInfo ( globalInfo) ;
如果要使用全局保存的信息,则调用DataManager.loadGlobalInfo()取[0]索引即可。
相关帖子
* 有没有将变量写入到global.rpgsave文件的方法 - @sonicdonggua
额外添加data/*.json数据库并将数据注册为$data对象
自行添加data/*.json可以让数据的管理更为自由。
比如使用Excel管理数据并转换为json,而非使用RMMV的自带编辑器去编辑数据。
而由于javascript并不限制数据条目为2000,因此也可以编辑超过2000条数据,即无视RMMV对数据条目的限制。
这能使基于RMMV的项目更适合团队协作开发。
(当然也需要额外处理RMMV在保存时会对现成的json进行重写的问题,比如将自己的json命名为一个RMMV不使用的json文件名。)
代码示例:
$dataExtend = null ;
DataManager._databaseFiles.push (
{ name : '$dataExtend' , src: 'Extend.json' }
) ;
$dataExtend = null ;
DataManager._databaseFiles.push (
{ name : '$dataExtend' , src: 'Extend.json' }
) ;
F9数据库中数据被应用到游戏中的方式
* 游戏开始时实例化data/*.json,生成$data系列对象
* 根据$data的数据生成$game系列对象
* $game中的数据会在游戏存档时被记录
角色属性的储存方式 | 战斗角色的有效属性的计算方式
RMMV的角色属性分为两块:
* 储存于$data系列对象中的固定数据(这些数据都可以在F9数据库中看到)
* 伴随游戏进程额外获得的、储存于$game系列对象中的动态属性
战斗中,一个角色的实际属性会将上述的属性相加:
* 通过Game_BattlerBase.prototype.param/xparam/sparam等方法,根据当前角色的状态,获取储存在$data中的对应固定数据。
* 通过Game_BattlerBase.prototype.paramPlus等方法,获取该角色伴随游戏进程而额外获得的动态数据。