Appendix

曲线编辑器

使用曲线编辑器可以编辑一组关系数据,如用于等级-经验需求的关系或等级-属性成长的关系。

使用曲线编辑器可以编辑一组关系数据,如用于等级-经验需求的关系或等级-属性成长的关系。

以数据最大值为参考的上限,曲线从左到右根据两个节点之间的曲线计算获得当前值。

alt text

操作

操作说明
数据最大值该数据的最大值,表示阶段为100%时的值,具体意义由制作者决定
如力量随等级成长的最大值为500,表示最后一级可提升500点力量,也可以表示提升至500力量,或者表示敏捷随等级成长提升的值
曲线编辑:选中节点鼠标左键单击节点
曲线编辑:创建节点双击鼠标左键创建一个节点
曲线编辑:设置节点过渡方式鼠标右键选择线性节点或二次贝塞尔曲线节点
线性节点:根据两个节点的位置均匀过渡,调整两个节点位置即可
二次贝塞尔曲线节点:根据两个节点位置以及红色控制点调整曲线,根据曲线的方式过渡
曲线编辑:删除节点使用DELETE键或鼠标右键菜单删除当前选中的节点
最低会存在两个节点,即起点和终点,起点一定是在0%的位置,终点则是在100%的位置
分段预览仅用于模拟分段的数据值显示,以便帮助计算
预设配置可保存当前的曲线设置作为预设配置,或者切换至预设的配置
新增预设:鼠标左键点击+号新增一个当前的曲线数据作为预设
应用预设:鼠标左键点击已存在的预设即可切换至该预设配置
编辑预设:鼠标右键点击已存在的预设可对其重命名、删除、替换为当前设置、修改提示文本

脚本获取数据

  1. 使用GameUtils.getCurveData格式化曲线编辑器生成的字符串数据。
  2. 使用使用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);
    }

Copyright © 2021 - 2025