您的位置:首页 > 其它

00003 不思议迷宫.0009.2.4:自动换装:在事件中实现自动换装

2017-03-05 15:45 344 查看


00003
不思议迷宫.0009.2.4:自动换装:在事件中实现自动换装

具体的换装动作如何实现呢?老办法:学原版。在前一章中,我们已经接触过一个叫做“UIEquipsOperation”的东西。它就是专门用来显示装备信息和操作的,包括装备、卸下、分解等等。我们就看看它的“装备”和“卸下”按钮的回调:

 
  local function onEquipSetOnClick(sender,eventType)

       
if eventType ==ccui.TouchEventType.ended 
then

           AudioM.playFx("equip_put");

           
if self.operateType ==EQUIP_OPERATE_EQUIP then

               
-- 装备

               
local type =EquipM.query(self.classId, "type");

               
local equipClassId =EquipM.getEquip(type, 1);

               
if not equipClassId then

                   DungeonActionM.go("do_equip", 0, self.classId);

 

                   
-- 关闭当前界面

    
               UIMgr.getCurrentScene():removeFormByName("UIEquipsOperation");

                   
return;

               
end

 

               
-- 获得新装备增加的血量

               
local newHp =self:getAttrib(self.classId, "max_hp");

               
local newMp =self:getAttrib(self.classId, "max_mp");

 

               
local oldHp =self:getAttrib(equipClassId, "max_hp");

               
local oldMp =self:getAttrib(equipClassId, "max_mp");

 

               
-- 考虑套装加成

               
local oldEquipList = {};

     
          local newEquipList = {};

                   
-- 遍历每个部位

                   
for _, equiped inpairs(ME.user.equipments) do

                   
-- 遍历该部位的所有已穿戴装备

                   
for _, e in pairs(equiped)do

                       
ifEquipM.isEquipment(e) then

                           table.insert(oldEquipList, e);

                           
if e ==equipClassId then

                               table.insert(newEquipList, self.classId);

              
             else

                               table.insert(newEquipList, e);

                           
end

                       
end

                   
end

               
end

 

               
local newSuitHp = 0;

               
local newSuitMp = 0;

               
local oldSuitHp = 0;

               
local oldSuitMp = 0;

 

               
ifSuitM.isSuitByEquipId(oldEquipList, equipClassId) then

                   
-- 旧装备情况下是套装

                   
oldSuitHp =SuitM.getSuitPropByEquipId(equipClassId, "max_hp")[3] or 0;

                   
oldSuitMp =SuitM.getSuitPropByEquipId(equipClassId, "max_mp")[3] or 0;

               
end

 

               
ifSuitM.isSuitByEquipId(newEquipList, self.classId) then

                   
-- 新装备情况下是套装

             
      newSuitHp =SuitM.getSuitPropByEquipId(self.classId, "max_hp")[3] or 0;

                   
newSuitMp =SuitM.getSuitPropByEquipId(self.classId, "max_mp")[3] or 0;

               
end

 

               
-- 称号百分比加成

               
local skills =ME.user:getAllSkills();

               
local maxHpUp = 0;

               
local maxMpUp = 0;

               
for _, skillId in pairs(skills)do

                   
local skillId =FormulaM.invoke("CALC_FINAL_SKILL", ME.user, skillId);

                   
local infos =SkillM.getSkillHpMpUp(skillId);

                   
for _, info in pairs(infos)do

                       
local para =info["para"];

                       
if para[2] =="max_hp" then

                        
   maxHpUp = maxHpUp + para[3];

                       
elseif para[2] =="max_mp" then

                           
maxMpUp = maxMpUp +para[3];

                       
end

                   
end

               
end

               
local extraHp = (newHp +newSuitHp - oldHp - oldSuitHp) * maxHpUp / 1000;

               
local extraMp = (newMp +newSuitMp - oldMp - oldSuitMp) * maxMpUp / 1000;

 

               
if ME.user:getHp() - oldHp -oldSuitHp + newHp + newSuitHp + extraHp <= 0 then

                  
 --
提示血量不足
不能更换装备

                   alert(getLocStr("change_equip_hp_not_enough"));

 

                   
-- 关闭当前界面

                   UIMgr.getCurrentScene():removeFormByName("UIEquipsOperation");

                   
return;

               
elseif ME.user:getMp() - oldMp- oldSuitMp + newMp + newSuitMp + extraMp < 0 then

                   
-- 魔法值不足
不能更换装备

                   alert(getLocStr("change_equip_mp_not_enough"));

 

                   
-- 关闭当前界面

                   UIMgr.getCurrentScene():removeFormByName("UIEquipsOperation");

                   
return;

               
end

 

               
-- 强制替换

               
local pos = 1; 
--- forceEquip * 2 + forceChange;

               
DungeonActionM.go("do_equip",pos, self.classId)

               
……

           
else

               
-- 卸下

               
-- 判断能否卸下

               
local ifCanUnload =self:canUnequip();

               
if ifCanUnload then

                   
local type =EquipM.query(self.classId,"type");

                   AudioM.playFx("equip_unload");

                   DungeonActionM.go("do_unequip", 1, type);

               
end

           
end

 

           
-- 关闭当前界面

           UIMgr.getCurrentScene():removeFormByName("UIEquipsOperation");

       
end

   
end

穿戴本身并不难,DungeonActionM.go("do_equip", pos, self.classId)即可。问题是它还包含了一些游戏逻辑。为了保持一致,我们应当直接调用UIEquipsOperation。显示UIEquipsOperation也不难,我们在UIAutoEquipingConfig中,玩家点击装备图标时就会显示UIEquipsOperation,包含“装备”或者“卸下”按钮。下面的问题是如何自动执行“装备”回调。这有两个办法,一个是模拟“装备”按钮的点击事件,另一个是直接调用回调。这里我选择后者。

在function UIEquipsOperation:registerTouchEvent()中保存“装备”回调:

   
self.onEquipSetOnClick = onEquipSetOnClick;

在构造中执行:

   
if extraPara~=nil andextraPara.autoEpuiping then

       
self.onEquipSetOnClick(nil,ccui.TouchEventType.ended);

   
end

在调用处传入合适的参数:

local uiForm =UIEquipsOperation.create(classId, eot, equiped, {["autoEpuiping"]=true,});

UIMgr.getCurrentScene():addForm(uiForm);

当然,在此之前还要首先判断是否拥有对应的装备:

if not EquipM.hasEquipment(classId) then return; end

整理成函数:

functionAutoEquiping(equipType, event)

        
if event == "current" then return; end

 

        
local classId =UIAutoEquipingConfig.getEventConfig(equipType, event);

        
if not classId then return; end

 

        
if not EquipM.hasEquipment(classId) then return; end

 

        
if classId == UIAutoEquipingConfig.getEventConfig(equipType,"current") then return; end

        

        
ifUIMgr.getCurrentScene():isOpen("UIEquipsOperation") then

                  
UIMgr.getCurrentScene():removeFormByName("UIEquipsOperation");

        
end

        
local uiForm = UIEquipsOperation.create(classId,EQUIP_OPERATE_EQUIP, false, {["autoEpuiping"]=true,});

        
UIMgr.getCurrentScene():addForm(uiForm);

end

对于某个事件,可能需要自动更换整套装备,我们加个便捷函数:

function AutoEquipingAll(event)

      
for i=1,12do

             
AutoEquiping(i,event);

      
end

end

这个函数,需要在事件回调中使用。而在function UIDungeonMain:registerEventCallback()中,已经有不少现成的事件了:

   
-- 关注玩家进入下一层的消息

   EventMgr.register("UIDungeonMain", event.TRY_ENTER_NEXT_FLOOR,function()

   
-- 开始下一层消息

   EventMgr.register("UIDungeonMain", event.START_NEXT_FLOOR,function()

但还有一些事件需要我们自己想办法,比如点击“胜利者石柱”。

代码中,用UIGrid来表示地牢中的格子,格子可以包含很多内容和类型,具体的可以通过function
UIGrid:initByType()查看,这儿就不列了。我们关心的是其中的“胜利者石柱”:

--
胜利者石柱

function UIGrid:initWinnerStone()

   
……

   
localfunction onClicked(sender, eventType)

       
……

   
end

 

   
……

   self.icon:addTouchEventListener(onClicked);

   
……

end

接下来还用说吗,在onClicked中调用AutoEquipingAll("clickingColumn")。
安装后一试,发现UIDungeonMain中的AutoEquiping不会被执行,检查后发现/Documents/update_res/src/game/ui/form/dungeon中存在同名的UIDungeonMain.luac和UIGrid.luac文件,把它们删除就好了。

目前已实现进入下一层之前和之后的自动换装,mod在QQ群161355323中,欢迎大家测试。如有可能,以后会增加更多的事件支持。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息