|  | 
 
| DIY教程:如何添加化境系统 
 将近一万行的jymain和一万多行的jywar,不论谁看了都要头晕。jywar主要问题在于,数据与实现没有分离。也就是说,在jywar中,有太多诸如
 
 复制代码 if wugong == xx and pid == xx and xxx and (xxx or xxx) then
之类的代码。所以说,如果把每种化境组合,用上述方式添加到jywar文件中,起码也要写几百行。而且,要是再添加或者剔除化境组合的话,还要再到上万行代码中找到这些地方进行修改。
 
 所以,添加化境系统,采用数据与实现分离的方式。
 
 首先,在jyconst文件中,设立一个CC.HUAJING全局变量,储存各种化境组合。
 
 复制代码        CC.HUAJING = {
                --紫霞
                {89, 30},
                {89, 31},
                {89, 32},
                {89, 34},
                --混元
                {90, 37},
                {90, 40},
                {90, 60},
                {90, 121},
                --神照
                {94, 114},
                }
如此,要调整化境组合搭配,只要在jyconst中调整这张表即可。甚至,取消化境系统,只需要
 
 设置空表即可,完全不需要调整jywar代码。实际上,这段代码也存在问题,就是太多魔数,89啊,30啊,实际上,可以在游戏里制作一个编辑器模式,用选武功名称,而不是敲数字的方式,来输出这张表。
 
 其次,在jymain文件中,设立一个函数HJ_WG,来查询内外功组合是否符合化境搭配。
 
 复制代码--化境判定
function HJ_WG(pid, WGid)
        local NGid = JY.Person[pid]["主运内功"]
        if Pair_Search(NGid, WGid, CC.HUAJING) then
                return true;
        end
        return false;
end
HJ_WG函数中,调用了一个查表函数Pair_Search。这个查表函数,可以帮助查询任何两两匹配表,在天衣无缝系统中,还会重复用到查表函数Pair_Search。
 
 复制代码--查表
function Pair_Search(item1, item2, pair)
        for _ , t in ipairs(pair) do
                if t[1] == item1 and t[2] == item2 then
                        return true
                end
        end
        return false
end
 接着。开始实现化境的几个效果:
 武功威力,低于600的,提升至800威力。
 武功威力,超过600的,提升199威力,至多为1199威力。
 增加33%连击率。
 攻击时,50%几率获得【浑然天成】效果,追加300点杀气。
 
 首先,武功威力增加,是在jymain中get_skill_power函数实现的,只需添加一两句判定即可。
 
 复制代码if HJ_WG(personid, wugongid) then
        if power <= 600 then
                power = 800
        else
                power = power + 199
        end
        if power > 1199 then
                power = 1199
        end
end
 
 余下的,都需要在上万行的jywar文件中修改。按理来说,在这里应该把逻辑与显示进一步分离,也就是说,化境系统的连击、杀气,与画面中显示"至臻化境.浑然天成"绿字,进一步分离。可是本人水平有限,对付不了上万行代码。
 总体而言,大部分对于战斗系统的修改,都集中于War_Fight_Sub与War_WugongHurtLife中,前者主要处理攻击时的各种特效,而后者则处理防御时的各种特效。
 
 War_Fight_Sub函数大致三千行,承担过多的任务,其大体执行逻辑如下:
 
 复制代码function War_Fight_Sub(id, wugongnum, x, y) 
        --判定所使用的武功
        --判定是否合击
        WAR.ZYHB = 1 --判定是否左右互博
        local LJ; --计算连击率
        fightnum = xx --连击次数
        while WAR.ACT <= fightnum do --连击循环
                --初始化一些全局变量
                --判定额外连击
                local BJ; --计算暴击率
                --计算内功加力
                --计算特定人物攻击特效
                --计算特定武功攻击特效
                --计算标主大招特效
                War_WugongHurtLife--计算伤害的敌人
                --计算吸血
                --显示动画
                --计算武功经验与升级
                --计算内力消耗
        end
        local jtl = 0; --计算体力消耗
        local dz = {}; --计算斗转星移
end
 于是乎,连击率增加,在jywar中,查找"local LJ"计算连击率那一部分的代码,在下面添加一句。
 
 复制代码if HJ_WG(pid, wugong) then
        LJ = LJ + 33
end
 再接着,浑然天成,显然是在连击循环中计算,只要放在计算伤害的敌人之前都可以,于是放在计算暴击率之前,查找"local BJ",在之前添加下面一句。
 
 复制代码--化境
WAR.HJ = 0
if HJ_WG(pid, wugong) and JLSD(20, 70, pid) then
        WAR.HJ = 1
        if WAR.Person[WAR.CurID]["特效文字4"] ~= nil then
                WAR.Person[WAR.CurID]["特效文字4"] = "至臻化境.浑然天成" .."·".. WAR.Person[WAR.CurID]["特效文字4"]
        else
                WAR.Person[WAR.CurID]["特效文字4"] = "至臻化境.浑然天成";
        end
end
这里将,全局变量初始化与实现放在一处,可能是更合适的一种选择。
 
 
 War_WugongHurtLife函数大致也有三千行,其大体执行逻辑如下:
 
 复制代码function War_WugongHurtLife(enemyid, wugong, level, ang, x, y)
        --判定攻击的武功
        --计算护体
        ----计算阴、林、山
        ----计算特定人物防御特效
        ----计算特定内功防御特效
        ----计算斗转星移
        --计算伤害
        ----计算武器、防具对伤害的影响
        ----计算暴击对伤害的影响
        ----计算特定人物对伤害的影响
        ----计算系数对伤害的影响
        ----计算连击对伤害的影响
        ----计算难度对伤害的影响
        ----计算闪避
        ----xxxx
        ----yyyy
        JY.Person[eid]["生命"] = JY.Person[eid]["生命"] - hurt --伤害结算
        --复活判定
        --计算杀气
        --计算上毒
        --计算吸血内
        --计算封穴、流血、冰封、灼烧、怒气
        --计算杀敌增加实战
        --结算
end
 
 于是乎,追加杀气可以添加计算杀气中,搜"local spdhurt",于其后添加下面一句。
 
 复制代码--化境追加杀气
if WAR.HJ == 1 then
        spdhurt = spdhurt + 300
end
 最末,特效文字的显示,在War_ShowFight函数中,添加下面一句。
 
 复制代码if HJ_WG(pid, wugong) then
        kfname = kfname .. "·化境"
end
以及其后特效文字的显示颜色,代码就不列举了。
 
 化境系统最终就完成了。除去jyconst中的表外,添加的代码大致五十行,并不是很难。问题的关键,在于搞清楚War_Fight_Sub与War_WugongHurtLife两个大头函数的运行逻辑。从上面可以看出,这两个函数,所承担的任务实在太多,必须重构,否则任何战斗系统的改变,修改起来都是十分头痛的。
 
 | 
 评分
查看全部评分
 |