00003 不思议迷宫.0009.2.4:自动换装:在事件中实现自动换装
2017-03-05 15:45
344 查看
00003
具体的换装动作如何实现呢?老办法:学原版。在前一章中,我们已经接触过一个叫做“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中,欢迎大家测试。如有可能,以后会增加更多的事件支持。
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中,欢迎大家测试。如有可能,以后会增加更多的事件支持。
相关文章推荐
- 00003 不思议迷宫.0009.2.1:自动换装:简单规划
- 00003 不思议迷宫.0009.2.2:自动换装:界面模拟
- 00003 不思议迷宫.0009.2.3:自动换装:回改到真实环境
- 00003 不思议迷宫.0009.5:炼金坊自动捡钱
- 00003 不思议迷宫.0010.2:project.manifest自动生成器
- 多线程火车票售票系统——自动重置事件对象实现线程同步
- 通过全局鼠标键盘事件实现应用程序的自动锁定
- 微信公众平台开发入门--PHP,实现自动回复文本,图文,点击事件
- jQuery移除元素自动解绑事件实现思路及代码
- jQuery移除元素自动解绑事件实现
- Jquery的 scroll事件,实现当滚动条到达最底部时,自动加载新项[转]
- javascript模拟点击事件--实现视频自动播放
- 微信公众平台开发入门--PHP,实现自动回复文本,图文,点击事件
- 微信公众平台开发模式,成为开发者,实现自动回复和用户的关注事件的监听
- Android 滑动侧边栏(Sliding Menu)第一种实现 - 2 手动滚动+自动滚动 + 事件处理
- 利用RSVIEW32的事件机制实现软冗余自动切换
- C# 中TreeView 控件实现点击CheckBoX自动打钩的事件
- 仅在第一次载入某界面时,自动触发某事件之实现思路一。
- Android自定义ViewGroup自动换行实现滑动任意布局及事件处理效果
- Jquery的 scroll事件,实现当滚动条到达最底部时,自动加载新项