Project1

标题: 个人向|怠惰なMV筆記 [打印本页]

作者: 怠惰な騎士    时间: 2017-6-11 02:46
标题: 个人向|怠惰なMV筆記
本帖最后由 怠惰な騎士 于 2017-6-26 23:49 编辑

在RMMV的摸索过程中有不少零碎的知识,然而把这类零碎的知识单独发个帖子来说会感觉怪怪的,于是搞个帖子专门记录一些零碎的东西。

零碎笔记

* 谨慎传递“引用”——在使用“数据”时,避免传递“引用”
* 储存全局数据(用于实现周目记录等)
* 额外添加data/*.json数据库并将数据注册为$data对象
* F9数据库中数据被应用到游戏中的方式
* 角色属性的储存方式 | 战斗角色的有效属性的计算方式

幽灵BUG

JavaScript单引号与双引号的歧义

JavaScript的单引号会将文本完全按照原样输出,而用双引号时,有可能会出现自动转译特殊符号(如&)的情况。
因此如果发现有奇怪的符号混入字符串时,请查看字符串内是否使用了特殊的符号。

Window(0, 0, 0, 0)使用move(0, 0, N, N)后,无法drawText的原因

Window在初始化时要求填入x, y, width, height,其中宽度和高度是用于Window.contents(Bitmap)的创建,如果填写为0,则会导致Bitmap创建无效,即便使用Window.contents.resize重新设置了contents的大小也无法修复。
因此要注意在创建窗口的时候不要将宽度和高度填写为0。

插件收集

中文输入 | 名称输入

* [搬运汉化] 【中文输入插件】Korean Name Input Processing - @trentswd
* [原创发布] 中文名字输入插件 - @水迭澜
* [已经解决] MV的名称输入处理怎么能用键盘输入中文? - @y76164876 @汪汪
作者: 怠惰な騎士    时间: 2017-6-13 02:51
标题: 怠惰なMV筆記 @ 零碎笔记
本帖最后由 怠惰な騎士 于 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]记录需要全局保存的信息。

代码示例:
JAVASCRIPT 代码复制
  1. var globalInfo = this.loadGlobalInfo() || [];
  2. globalInfo[savefileId] = this.makeSavefileInfo();
  3. globalInfo[0] = this.makeGlobalSavefileInfo(); // 假设this.makeGlobalSavefileInfo()是你所写的记录需要全局保存的信息的方法
  4. 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文件名。)

代码示例:
JAVASCRIPT 代码复制
  1. $dataExtend = null;
  2. DataManager._databaseFiles.push(
  3.   { name: '$dataExtend', src: 'Extend.json' }
  4. );

F9数据库中数据被应用到游戏中的方式

* 游戏开始时实例化data/*.json,生成$data系列对象
* 根据$data的数据生成$game系列对象
* $game中的数据会在游戏存档时被记录

角色属性的储存方式 | 战斗角色的有效属性的计算方式

RMMV的角色属性分为两块:
* 储存于$data系列对象中的固定数据(这些数据都可以在F9数据库中看到)
* 伴随游戏进程额外获得的、储存于$game系列对象中的动态属性

战斗中,一个角色的实际属性会将上述的属性相加:
* 通过Game_BattlerBase.prototype.param/xparam/sparam等方法,根据当前角色的状态,获取储存在$data中的对应固定数据。
* 通过Game_BattlerBase.prototype.paramPlus等方法,获取该角色伴随游戏进程而额外获得的动态数据。




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