Appendix
曲线编辑器
使用曲线编辑器可以编辑一组关系数据,如用于等级-经验需求的关系或等级-属性成长的关系。
使用曲线编辑器可以编辑一组关系数据,如用于等级-经验需求的关系或等级-属性成长的关系。
以数据最大值为参考的上限,曲线从左到右根据两个节点之间的曲线计算获得当前值。
操作
操作 | 说明 |
---|---|
数据最大值 | 该数据的最大值,表示阶段为100%时的值,具体意义由制作者决定 如力量随等级成长的最大值为500,表示最后一级可提升500点力量,也可以表示提升至500力量,或者表示敏捷随等级成长提升的值 |
曲线编辑:选中节点 | 鼠标左键单击节点 |
曲线编辑:创建节点 | 双击鼠标左键创建一个节点 |
曲线编辑:设置节点过渡方式 | 鼠标右键选择线性节点或二次贝塞尔曲线节点 线性节点:根据两个节点的位置均匀过渡,调整两个节点位置即可 二次贝塞尔曲线节点:根据两个节点位置以及红色控制点调整曲线,根据曲线的方式过渡 |
曲线编辑:删除节点 | 使用DELETE键或鼠标右键菜单删除当前选中的节点 最低会存在两个节点,即起点和终点,起点一定是在0%的位置,终点则是在100%的位置 |
分段预览 | 仅用于模拟分段的数据值显示,以便帮助计算 |
预设配置 | 可保存当前的曲线设置作为预设配置,或者切换至预设的配置 新增预设:鼠标左键点击+号新增一个当前的曲线数据作为预设 应用预设:鼠标左键点击已存在的预设即可切换至该预设配置 编辑预设:鼠标右键点击已存在的预设可对其重命名、删除、替换为当前设置、修改提示文本 |
脚本获取数据
- 使用GameUtils.getCurveData格式化曲线编辑器生成的字符串数据。
- 使用使用GameUtils.getBezierPoint2ByGroupValue根据格式化后的数据以及比例0~1获取实际的值。
Script.ts
/**
* 获取曲线数据,根据字符串格式的数据
* 返回格式:[[0,0,startY,maxLength,maxHeight],[type,startX,startY,endX,endY,ctrlX,ctrlY],[type,startX,startY,endX,endY,ctrlX,ctrlY],...]
* maxLength=最大长度(仅供参考) maxHeight=最大高度 起点x始终位于0,终点x始终位于100 type=0-线性线段 1-二次贝塞尔曲线片段(拥有ctrlX,ctrlY)
* @param curveStrData 曲线数据
* @return groupValue
*/
static getCurveData(curveStrData: string): any[] {
return null;
}
/**
* 根据曲线数据获取其中某个点的值
* 曲线数据的格式:[[0,0,startY,maxLength,maxHeight],[type,startX,startY,endX,endY,ctrlX,ctrlY],[type,startX,startY,endX,endY,ctrlX,ctrlY],...]
* maxLength=最大长度(仅供参考) maxHeight=最大高度 起点x始终位于0,终点x始终位于100 type=0-线性线段 1-二次贝塞尔曲线片段(拥有ctrlX,ctrlY)
* @param groupValue 曲线数据
* @param x 0~1 0表示曲线头,1表示曲线尾 假设该曲线是只有一段线性曲线,值范围是0-5000,则0.5的值是2500
* @return value 值
*/
static getBezierPoint2ByGroupValue(groupValue: any[], x: number): number {
return null;
}
例如《TBRPG-梦之剑》模板中的用到的根据等级获取成长值函数中实现了角色的等级-成长值关系数据。
Script.ts
/**
* 获取成长数据根据等级
* @param actor 角色数据
* @param growAttrName 属性名称
* @param lv 等级
* @return [number]
*/
private getGrowValueByLv(actor: Module_Actor, growAttrName: string, lv: number): number {
// -- 获取职业
let actorClass: Module_Class = GameData.getModuleData(7, actor.class);
if (!actorClass) return 0;
// -- 获取属性
let cacheGrowName = growAttrName + "_cache";
let growData = actor[cacheGrowName];
if (!actor[cacheGrowName]) growData = actor[cacheGrowName] = GameUtils.getCurveData(actorClass[growAttrName]);
let per = lv == 0 ? 0 : (lv - 1) / (actor.MaxLv - 1); // 转为0-1的空间
return GameUtils.getBezierPoint2ByGroupValue(growData, per);
}