以男法师的windStrike(魔法旋风)为例
打开wind_strike.nut文件,可以看到几个以function开头的语句,下面分别介绍几个function的作用。
1.function checkExecutableSkill_WindStrike(obj)
在使用技能的瞬间,此function被执行。设置人物的状态(状态相当于nut的编号,设置状态即调用nut)
2. function checkCommandEnable_WindStrike(obj)
在图中此function一直在被执行,其作用为灰/亮技能
3. function onSetState_WindStrike(obj, state, datas, isResetTimer)
设置状态时,此function被执行
4. function onEndCurrentAni_WindStrike(obj)
人物释放主动技能时,会做出动作。当这个动作结束时,此function被执行
5. function onKeyFrameFlag_WindStrike(obj,flagIndex)
人物做出的动作是分帧数的(ani文件),某些帧数可以在ani内设置为关键帧,当人物动作进行到关键帧时,此函数被执行。
了解每个function的作用后,再来整体看一遍脚本
1.进图后,亮技能
function checkCommandEnable_WindStrike(obj)
{
if (!obj) return false;
//获取人物当前状态
local state = obj.sq_GetState();
//如果人物状态为站立
if (state == STATE_STAND)
return true;//此行代码表示亮技能
//如果人物状态为普通攻击
if(state == STATE_ATTACK)
{
return obj.sq_IsCommandEnable(SKILL_WIND_STRIKE);//此代码表示根据技能是否可强制来判断是否亮技能(可强制则亮技能,不可强制则不亮技能)
}
return true;
}
2.按下技能键使用技能
function checkExecutableSkill_WindStrike(obj)
{
if (!obj) return false;
local isUse = obj.sq_IsUseSkill(SKILL_WIND_STRIKE);//判断人物是否使用了技能
//如果使用了技能
if (isUse)
{
//设置人物状态为STATE_WIND_STRIKE
obj.sq_AddSetStatePacket(STATE_WIND_STRIKE , STATE_PRIORITY_USER, false);
return true;
}
return false;
}
3.设置状态时执行此function
function onSetState_WindStrike(obj, state, datas, isResetTimer)
{
if(!obj) return;
//停止人物的运动(方向键不能再控制移动)
obj.sq_StopMove();
//设置人物动作(ani)
obj.sq_SetCurrentAnimation(CUSTOM_ANI_WIND_STRIKE);
//技能动作吃攻速
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
}
4.动作进行到关键帧时,创建特效
function onKeyFrameFlag_WindStrike(obj,flagIndex)
{
if(!obj)
return false;
local isMyControlObject = obj.sq_IsMyControlObject();
// flagIndex为关键帧编号,在此动作中关键帧编号被设置为1
if (isMyControlObject && flagIndex == 1)
{
local xPosMin = obj.sq_GetIntData(SKILL_WIND_STRIKE, 0);//获取第一个静态数据
local xPosMax = obj.sq_GetIntData(SKILL_WIND_STRIKE, 1);//获取第二个静态数据
local attackBonusRate = obj.sq_GetBonusRateWithPassive(SKILL_WIND_STRIKE, STATE_WIND_STRIKE, SKL_LVL_COLUMN_IDX_0, 1.0);//获取百分比伤害
local power = obj.sq_GetPowerWithPassive(SKILL_WIND_STRIKE, STATE_WIND_STRIKE, SKL_LVL_COLUMN_IDX_1, SKL_LVL_COLUMN_IDX_0, 1.0);//获取固伤
local upForce = obj.sq_GetLevelData(2);//获取浮空力
//这几行代码的意义将在后面讲解
obj.sq_StartWrite();
obj.sq_WriteDword(attackBonusRate);
obj.sq_WriteDword(power);
obj.sq_WriteWord(upForce);
//创建特效。第一个24201为特效编号;后面的120,0,0为创建的特效距人物的距离(分别为x轴,y轴,z轴)
obj.sq_SendCreatePassiveObjectPacket(24201, 0, 120, 1, 0);
}
return true;
}
5.人物动作结束
function onEndCurrentAni_WindStrike(obj)
{
//设置人物状态为站立状态
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
}
暂无评论内容