-------------------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- local SUILoader = class("SUILoader") local Element = require("sui/Element") local SWidget = require("sui/SWidget") local SUIHelper = require("sui/SUIHelper") local LexicalHelper = require("sui/LexicalHelper") local RichTextHelp = require("util/RichTextHelp") local QuickCell = requireUtil("QuickCell") local cjson = require("cjson") local tinsert = table.insert local tremove = table.remove local ssplit = string.split local sfind = string.find local mfloor = math.floor local DEBUG_MODE = false ------------------------------------------ util SUILoader.convertToDesignPos = function(swidget, input_pos) local parent = swidget.render:getParent() local visibleSize = global.Director:getVisibleSize() local parentSize = parent and parent:getContentSize() or visibleSize local x = tonumber(input_pos.x) or 0 local y = tonumber(input_pos.y) or 0 local fixX = x local fixY = parentSize.height-y return cc.p(fixX, fixY) end SUILoader.convertToOpenGLPos = function(swidget, input_pos) local parent = swidget.render:getParent() local visibleSize = global.Director:getVisibleSize() local parentSize = parent and parent:getContentSize() or visibleSize local x = tonumber(input_pos.x) or 0 local y = tonumber(input_pos.y) or 0 local fixX = x local fixY = parentSize.height-y return cc.p(fixX, fixY) end SUILoader.compareSWidget = function(a, b) if not a or not b then return 0 end if #a.branches ~= #b.branches then return -5 end local eleA = a.element local eleB = b.element if not eleA or not eleB then return -1 end -- 类型不同 if eleA.type ~= eleB.type then return -2 end -- 重新加载 local reloadA = tonumber(eleA.attr.reload) or 0 local reloadB = tonumber(eleB.attr.reload) or 0 if reloadB == 1 then return -6 end if eleA.type == "Frames" then return -6 end if eleA.type == "Effect" and (eleA.attr.count == 1 or eleB.attr.count == 1) then return -6 end if eleA.type == "CheckBox" then return -6 end if eleA.type == "COUNTDOWN" then return -6 end if eleA.type == "BAGITEMS" or eleA.type == "HEROBAGITEMS" or eleA.type == "DLINKITEMS" then return -6 end if eleA.type == "EQUIPITEMS" or eleA.type == "HEROEQUIPITEMS" then return -6 end if eleA.type == "DBItemShow" or eleA.type == "HERODBItemShow" or eleA.type == "MKItemShow" then return -6 end if eleA.type == "Input" then return -6 end if eleA.type == "TIMETIPS" then return -6 end if eleA.type == "LoadingBar" then return -6 end if eleA.type == "Slider" then return -6 end if eleA.type == "MenuItem" then return -6 end if eleA.type == "ScrapePic" then return -6 end local ignored = {[1]="id", [2]="default", [3]="reload", [4]="loadCount", [5]="loadDelay", [6]="loadStep", [7]="tax", [8]="tay", [9]="tpercentx", [10]="tpercenty"} local attrA = clone(eleA.attr) local attrB = clone(eleB.attr) for _, v in ipairs(ignored) do attrA[v] = nil attrB[v] = nil end for key, value in pairs(attrA) do if not attrB[key] then -- 属性数量不同 return -3 end if value ~= attrB[key] then -- 属性值不同 return -4 end attrB[key] = nil end if next(attrB) then -- 属性数量不同 return -3 end -- 属性相同 return 1 end SUILoader.isBackground = function(swidget) if not swidget then return false end return tonumber(swidget.element.attr.bg) == 1 end ------------------------------------------ ------------------------------------------ -- local defaultOutline = 1 local defaultOutlineC = 0 local defaultColorID = 255 local defaultFontSize = global.isWinPlayMode and 12 or 18 local anchorPoints = {[0]={x=0,y=1}, [1]={x=1,y=1}, [2]={x=0,y=0}, [3]={x=1,y=0}, [4]={x=0.5,y=0.5}} local defaultTextX = 25 local defaultTextY = 20 local interval = 0.167 local defaultFontPath = SL:GetMetaValue("GAME_DATA", "SUI_FONT_PATH") or global.MMO.PATH_FONT2 SUILoader.getAnchorByIndex = function(index) return anchorPoints[index or 0] end SUILoader.modifySizeAble = function(swidget) local element = swidget.element if element.type == "Effect" then return false end if element.type == "Text" then return false end if element.type == "ItemShow" then return false end if element.type == "CostItem" then return false end if element.type == "COUNTDOWN" then return false end if element.type == "EquipShow" or element.type == "HEROEquipShow" or element.type == "PETEQUIPSHOW" then return false end if element.type == "TIMETIPS" then return false end if element.type == "TextAtlas" then return false end if element.type == "UIModel" then return false end if element.type == "ScrapePic" then return false end if element.type == "BmpText" then return false end return true end SUILoader.modifyAnchorAble = function(swidget) local element = swidget.element if element.type == "Effect" then return false end if element.type == "UIModel" then return false end return true end SUILoader.modifyRotateAble = function(swidget) return true end SUILoader.modifyVisible = function(swidget) return true end SUILoader.modifyOpacity = function(swidget) local element = swidget.element if element.type == "CostItem" then return false end if element.type == "QuickTextView" then return false end if element.type == "ItemShow" or element.type == "DBItemShow" or element.type == "HERODBItemShow" or element.type == "MKItemShow" then return false end if element.type == "EquipShow" or element.type == "HEROEquipShow" or element.type == "PETEQUIPSHOW" then return false end return true end SUILoader.fixAnchor = function(swidget) if tonumber(swidget.element.attr.bg) == 1 and (tonumber(swidget.element.attr.show) == 5 or tonumber(swidget.element.attr.show) == 6) then local ax = tonumber(swidget.element.attr.tax) local ay = tonumber(swidget.element.attr.tay) ax = ax or 0 ay = ay or 1 return cc.p(ax, ay) end if swidget.element.attr.ax or swidget.element.attr.ay then local ax = tonumber(swidget.element.attr.ax) local ay = tonumber(swidget.element.attr.ay) ax = ax or 0 ay = ay or 1 return cc.p(ax, ay) end local a = tonumber(swidget.element.attr.a) or 0 return SUILoader.getAnchorByIndex(a) end SUILoader.fixPosition = function(swidget) local parent = swidget.render:getParent() local parentSize = parent:getContentSize() local defaultX = (swidget.element.type == "Text" or swidget.element.type == "RText" or swidget.element.type == "RTextX" or swidget.element.type == "BmpText") and defaultTextX or 0 local defaultY = (swidget.element.type == "Text" or swidget.element.type == "RText" or swidget.element.type == "RTextX" or swidget.element.type == "BmpText") and defaultTextY or 0 local x = tonumber(swidget.element.attr.x) or defaultX local y = parentSize.height - (tonumber(swidget.element.attr.y) or defaultY) local percentx = nil local percenty = nil if tonumber(swidget.element.attr.bg) == 1 and (tonumber(swidget.element.attr.show) == 5 or tonumber(swidget.element.attr.show) == 6) then percentx = tonumber(swidget.element.attr.tpercentx) percenty = tonumber(swidget.element.attr.tpercenty) else percentx = tonumber(swidget.element.attr.percentx) percenty = tonumber(swidget.element.attr.percenty) end if percentx then x = parentSize.width * (percentx/100) end if percenty then y = parentSize.height - parentSize.height * (percenty/100) end return cc.p(x, y) end SUILoader.fixSize = function(swidget) local parent = swidget.render:getParent() local parentSize = parent:getContentSize() local contentSize = swidget.render:getContentSize() local defaultWidth = contentSize.width local defaultHeight = contentSize.height local width = tonumber(swidget.element.attr.width) or defaultWidth local height = tonumber(swidget.element.attr.height) or defaultHeight local percentwidth = tonumber(swidget.element.attr.percentwidth) local percentheight = tonumber(swidget.element.attr.percentheight) if percentwidth then width = parentSize.width * (percentwidth/100) end if percentheight then height = parentSize.height * (percentheight/100) end return cc.size(width, height) end SUILoader.fixRotate = function(swidget) local rotate = tonumber(swidget.element.attr.rotate) or 0 return rotate end SUILoader.fixVisible = function(swidget) -- 默认0可见 1不可见 local visible = tonumber(swidget.element.attr.visible) or 0 return visible == 0 end SUILoader.fixOpacity = function(swidget) -- 默认不透明度 255 local opacity = tonumber(swidget.element.attr.opacity) or 255 return opacity end -- load attr SUILoader.loadSWidgetAttr = function(swidget) local render = swidget.render local element = swidget.element -- size if SUILoader.modifySizeAble(swidget) then local size = SUILoader.fixSize(swidget) render:ignoreContentAdaptWithSize(false) render:setContentSize(size) end -- anchor if SUILoader.modifyAnchorAble(swidget) then local anchor = SUILoader.fixAnchor(swidget) render:setAnchorPoint(anchor) end -- rotate if SUILoader.modifyRotateAble(swidget) then local rotate = SUILoader.fixRotate(swidget) render:setRotation(rotate) end -- x y local position = SUILoader.fixPosition(swidget) render:setPosition(position) local worldPos = render:convertToWorldSpace(cc.p(0, 0)) local tranPos = cc.p(mfloor(worldPos.x), mfloor(worldPos.y)) render:setPosition(cc.pAdd(position, cc.pSub(tranPos, worldPos))) if SUILoader.modifyVisible(swidget) then local visible = SUILoader.fixVisible(swidget) render:setVisible(visible) end if SUILoader.modifyOpacity(swidget) then local opacity = SUILoader.fixOpacity(swidget) if render.setOpacity then render:setOpacity(opacity) end end end ------------------------------------------ --- SUILoad Core function SUILoader:ctor() defaultOutline = SL:GetMetaValue("GAME_DATA","defaultOutlineSize") or 0 defaultOutlineC = SL:GetMetaValue("GAME_DATA","defaultOutlineColor") or 0 end function SUILoader:getInputTable(fliter) local submitTable = {} if fliter == nil or fliter == "" or fliter == "0" then elseif fliter == "*" then for k, v in pairs(self._inputWidgets) do local input = v local inputID = k local inputValue = input.widget and input.widget:getString() or "" table.insert(submitTable, {id = inputID, value = inputValue, type = input.inputFlag, isChatInput = input.isChatInput, isNameInput = input.isNameInput}) end else local slices = ssplit(fliter, ",") for i, v in ipairs(slices) do local inputID = v local input = self._inputWidgets[inputID] local inputValue = input.widget and input.widget:getString() or "" table.insert(submitTable, {id = inputID, value = inputValue, type = input.inputFlag, isChatInput = input.isChatInput, isNameInput = input.isNameInput}) end end return submitTable end function SUILoader:getCheckBoxTable(fliter) local submitTable = {} if fliter == nil or fliter == "" or fliter == "0" then submitTable = {} else for k, v in pairs(self._checkboxWidgets) do local widget = v local widgetID = k local value = (widget:isSelected() and 1 or 0) table.insert(submitTable, {id = widgetID, value = value}) end end return submitTable end function SUILoader:getCheckBoxTableByID(widgetID) local submitTable = {} local widget = self._checkboxWidgets[widgetID] if not widget then submitTable = {} else local value = (widget:isSelected() and 1 or 0) table.insert(submitTable, {id = widgetID, value = value}) end return submitTable end function SUILoader:getSliderTableByID(widgetID) local submitTable = {} local param = self._sliderWidgets[widgetID] if not param or not param.widget then submitTable = {} else local value = param and param.value or 0 table.insert(submitTable, {id = widgetID, value = value}) end return submitTable end function SUILoader:getMenuItemTableByID(widgetID) local submitTable = {} local param = self._menuItemWidgets[widgetID] if not param or not param.widget then submitTable = {} else local value = param and param.value or "" value = param.widget:getString() or "" table.insert(submitTable, {id = widgetID, value = value}) end return submitTable end function SUILoader:addMouseOverTips(widget, element) widget:setSwallowMouse(false) widget:setMouseEnabled(false) local tips = element.attr.tips local tipsx = tonumber(element.attr.tipsx) or 0 local tipsy = tonumber(element.attr.tipsy) or 0 if tips and string.len(tips) > 0 then -- 监听事件; tips = string.gsub(tips, "%^", "\\") widget:addMouseOverTips(tips, cc.p(tipsx, -tipsy), cc.p(0.5, 1)) end end ------------------------------------------------------------------ -- load function SUILoader:load(source, callback, closeCB, ext) local clock = os.clock() -- parse local elements = LexicalHelper:Parse(source) -- fix background self:fixBackground(elements, ext) -- content local visibleSize = global.Director:getVisibleSize() local _, rootRect = checkNotchPhone() rootRect.width = visibleSize.width rootRect.height = visibleSize.height local trunk, background = self:loadContent(elements, callback, closeCB, rootRect, ext) print("load cost", os.clock() - clock) return trunk, background end function SUILoader:fixBackground(elements, ext) -- 优先级 脚本中设置过bg字段 -> GM指定大背景框 -> 默认背景框 -- dump(elements) -- find background local background = nil for k, v in ipairs(elements) do if v.attr["bg"] == "1" then if not background then background = v else v.attr["bg"] = nil end end end if nil == background then if ext and ext.background then -- GM指定大背景框 -- OPENMERCHANTBIGDLG 路径 显示位置 X坐标 Y坐标 高度 宽度 是否显示关闭按钮 关闭按钮X坐标 关闭按钮Y坐标 固定NPC对话框 if ext.background.Param7 and tonumber(ext.background.Param7) == 1 then local element = {} element.type = "Button" element.attr = {} element.attr.nimg = "public/1900000510.png" element.attr.pimg = "public/1900000511.png" element.attr.link = "@exit" element.attr.x = tonumber(ext.background.Param8) element.attr.y = tonumber(ext.background.Param9) table.insert(elements, 1, element) end local element = {} element.type = "Img" element.attr = {} element.attr.img = ext.background.Param1 element.attr.bg = 1 element.attr.move = tonumber(ext.background.Param10) and 1 or 0 element.attr.reset = 1 element.attr.show = tonumber(ext.background.Param2) element.attr.x = tonumber(ext.background.Param3) element.attr.y = tonumber(ext.background.Param4) element.attr.height = tonumber(ext.background.Param5) ~= 0 and tonumber(ext.background.Param5) or nil element.attr.width = tonumber(ext.background.Param6) ~= 0 and tonumber(ext.background.Param6) or nil element.attr.loadDelay = 1 table.insert(elements, 1, element) else -- 默认背景框 local element = {} element.type = "Button" element.attr = {} element.attr.nimg = "public/1900000510.png" element.attr.pimg = "public/1900000511.png" element.attr.link = "@exit" element.attr.x = 546 element.attr.y = 0 table.insert(elements, 1, element) local element = {} element.type = "Layout" element.attr = {} element.attr.width = 80 element.attr.height = 80 element.attr.x = 545 element.attr.y = 0 element.attr.link = "@exit" table.insert(elements, 1, element) local element = {} element.type = "Img" element.attr = {} element.attr.img = SL:GetMetaValue("WINPLAYMODE") and "public_win32/bg_npc_01.png" or "public/bg_npc_01.png" element.attr.bg = 1 element.attr.move = 0 element.attr.reset = 1 element.attr.show = 0 element.attr.loadDelay = 1 table.insert(elements, 1, element) end end return background end function SUILoader:loadContent(elements, callback, closeCB, rootRect, ext) self._loaders = { ["Img"] = handler(self, self.load_render_Img), ["Text"] = handler(self, self.load_render_Text), ["RText"] = handler(self, self.load_render_RText), ["Input"] = handler(self, self.load_render_Input), ["Button"] = handler(self, self.load_render_Button), ["Effect"] = handler(self, self.load_render_Effect), ["Frames"] = handler(self, self.load_render_Frames), ["Layout"] = handler(self, self.load_render_Layout), ["CheckBox"] = handler(self, self.load_render_CheckBox), ["ListView"] = handler(self, self.load_render_ListView), ["ItemShow"] = handler(self, self.load_render_ItemShow), ["CostItem"] = handler(self, self.load_render_CostItem), ["COUNTDOWN"] = handler(self, self.load_render_COUNTDOWN), ["ITEMBOX"] = handler(self, self.load_render_ITEMBOX), ["EquipShow"] = handler(self, self.load_render_EquipShow), ["BAGITEMS"] = handler(self, self.load_render_BAGITEMS), ["EQUIPITEMS"] = handler(self, self.load_render_EQUIPITEMS), ["DBItemShow"] = handler(self, self.load_render_DBItemShow), ["TIMETIPS"] = handler(self, self.load_render_TIMETIPS), ["TextAtlas"] = handler(self, self.load_render_TextAtlas), ["LoadingBar"] = handler(self, self.load_render_LoadingBar), ["CircleBar"] = handler(self, self.load_render_CircleBar), ["PercentImg"] = handler(self, self.load_render_PercentImg), ["UIModel"] = handler(self, self.load_render_UIModel), ["HEROEquipShow"] = handler(self, self.load_render_HEROEquipShow), ["HEROEQUIPITEMS"] = handler(self, self.load_render_HEROEQUIPITEMS), ["HERODBItemShow"] = handler(self, self.load_render_HERODBItemShow), ["HEROBAGITEMS"] = handler(self, self.load_render_HEROBAGITEMS), ["QuickTextView"] = handler(self, self.load_render_QuickTextView), ["RTextX"] = handler(self, self.load_render_RTextX), ["DLINKITEMS"] = handler(self, self.load_render_DLINKITEMS), ["MKItemShow"] = handler(self, self.load_render_MKItemShow), ["PETEQUIPSHOW"] = handler(self, self.load_render_PETEQUIPSHOW), ["PageView"] = handler(self, self.load_render_PageView), ["Slider"] = handler(self, self.load_render_Slider), ["MenuItem"] = handler(self, self.load_render_MenuItem), ["ScrapePic"] = handler(self, self.load_render_ScrapePic), ["BmpText"] = handler(self, self.load_render_BmpText), ["ButtonKeFu"] = handler(self, self.load_render_ButtonKeFu), } -- self._inputWidgets = {} self._checkboxWidgets = {} self._sliderWidgets = {} self._menuItemWidgets = {} local SUIComponentProxy = global.Facade:retrieveProxy(global.ProxyTable.SUIComponentProxy) -- 对比上次,差异化更改 local lastTrunk = ext and ext.lastTrunk or nil local lastBackground = ext and ext.lastBackground or nil local loadCompleteCB = ext and ext.loadCompleteCB or nil local isImmediate = ext and ext.isImmediate or false local parentNode = ext and ext.parentNode or nil local npcLayer = ext and ext.npcLayer or nil --刷新npcLayer的background if npcLayer then SUIComponentProxy:ClearSUISlider() end -- load swidgets local background = nil local swidgets = {} for i, element in ipairs(elements) do -- exist loader if self._loaders[element.type] then element.attr.id = element.attr.id or string.format("default_%s", i) element.attr.x = (element.type == "Text" or element.type == "RText" or element.type == "RTextX" or element.type == "BmpText") and (element.attr.x or defaultTextX) or element.attr.x element.attr.y = (element.type == "Text" or element.type == "RText" or element.type == "RTextX" or element.type == "BmpText") and (element.attr.y or defaultTextY) or element.attr.y element.attr._mainIndex= ext and ext.mainIndex -- 主界面的按钮/图片点击需上报, 加的标识 -- swidget local swidget = global.SWidgetCache:generateSWidget() swidget.element = element swidget.render = nil swidgets[element.attr.id] = swidget -- 记录背景图 local isBG = tonumber(element.attr.bg) == 1 if isBG and not background then background = swidget end end end -- tree mode for _, element in ipairs(elements) do if swidgets[element.attr.id] and swidgets[element.attr.id].element.attr.children then local swidget = swidgets[element.attr.id] local branches = swidget.element.attr.children local find_info = {sfind(branches, "{(.-)}")} local slices = ssplit(find_info[3] or branches, ",") if #slices > 0 then for _, branchID in ipairs(slices) do local branch = swidgets[branchID] if branch and not branch.render and branch.element.attr.id ~= swidget.element.attr.id then if branch.trunk then print("ERROR SUILoader: swidget can't be add aegin. swidgetID=" .. element.attr.id .. " branchID=" .. branchID) else swidget:addBranch(branch) end end end end end end -- trunk local trunk = global.SWidgetCache:generateSWidget() trunk.element = Element.new("Layout") trunk.depth = 0 for _, element in ipairs(elements) do local swidget = swidgets[element.attr.id] if swidget and swidget.trunk == nil then trunk:addBranch(swidget) end end -- compare if lastTrunk then local backgroundR = SUILoader.compareSWidget(lastBackground, background) -- local function fixBranches(trunkL, trunkC) if #trunkL.branches <= 0 then if #trunkC.branches > 0 then for index, branch in ipairs(trunkC.branches) do trunkL:addBranch(branch) end end return nil end -- 数量不同 local additions = {} if #trunkL.branches < #trunkC.branches then for i = #trunkL.branches+1, #trunkC.branches do tinsert(additions, trunkC.branches[i]) end end local rmvitemsL = {} local insertitemsL = {} for index, branch in ipairs(trunkL.branches) do local branchL = branch local branchC = trunkC.branches[index] local compareR = SUILoader.compareSWidget(branchL, branchC) if compareR == 0 then tinsert(rmvitemsL, branchL) elseif compareR == 1 and backgroundR == 1 then if SUILoader.isBackground(branchL) and SUILoader.isBackground(branchC) then background = branchL end local element = branchC.element if element.type == "ListView" and tonumber(element.attr.reload) == 2 then local default = tonumber(element.attr.default) if branchL.element then branchL.element.attr.default = default end end self:reload_render(branchL) fixBranches(branchL, branchC) elseif backgroundR ~= 1 or compareR == -1 or compareR == -2 or compareR == -3 or compareR == -4 or compareR == -5 or compareR == -6 then tinsert(rmvitemsL, branchL) tinsert(insertitemsL, {branch=branchC, index=index}) end end for index, branch in ipairs(rmvitemsL) do trunkL:removeBranch(branch) end for index, item in ipairs(insertitemsL) do trunkL:insertBranch(item.branch, item.index) end for index, branch in ipairs(additions) do trunkL:addBranch(branch) end end fixBranches(lastTrunk, trunk) -- trunk = lastTrunk end -- load trunk render if trunk and not trunk.render then trunk.render = self:load_render(trunk, callback, closeCB) end --- if parentNode and not trunk.render:getParent() then trunk.render:addTo(parentNode) end -- load background render if background and not background.render then background.render = self:load_render(background, callback, closeCB) trunk:addBranchRender(background) end -- size if background and background.render and SUILoader.modifySizeAble(background) then local size = SUILoader.fixSize(background) background.render:ignoreContentAdaptWithSize(false) background.render:setContentSize(size) end local root_anchor = cc.p(0, 0) local root_position = cc.p(mfloor(rootRect.x), 0) local root_size = cc.size(rootRect.width, rootRect.height) if background then local root_show = tonumber(background.element.attr.show) or 0 if root_show == 0 then -- 左上 root_anchor = cc.p(0, 1) root_position = cc.p(mfloor(rootRect.x), rootRect.height) root_size = background.render:getContentSize() elseif root_show == 1 then -- 右上 root_anchor = cc.p(1, 1) root_position = cc.p(rootRect.width, rootRect.height) root_size = background.render:getContentSize() elseif root_show == 2 then -- 左下 root_anchor = cc.p(0, 0) root_position = cc.p(mfloor(rootRect.x), 0) root_size = background.render:getContentSize() elseif root_show == 3 then -- 右下 root_anchor = cc.p(1, 0) root_position = cc.p(rootRect.width, 0) root_size = background.render:getContentSize() elseif root_show == 4 then -- 中间 root_anchor = cc.p(0.5, 0.5) root_position = cc.p(mfloor((rootRect.width)/2), mfloor(rootRect.height/2)) root_size = background.render:getContentSize() -- 尺寸处理成偶数,防止特效抖动 root_size = {width = ConvertToEven(root_size.width), height = ConvertToEven(root_size.height)} elseif root_show == 5 or root_show == 6 then -- 中间铺满 local attr = background.element.attr root_size = (attr.width or attr.height) and background.render:getContentSize() or root_size root_anchor = cc.p(0.5, 0.5) root_position = cc.p(mfloor((rootRect.width)/2), mfloor(rootRect.height/2)) background.element.attr.tax = 0.5 background.element.attr.tay = 0.5 background.element.attr.tpercentx = 50 background.element.attr.tpercenty = 50 -- 尺寸处理成偶数,防止特效抖动 root_size = {width = ConvertToEven(root_size.width), height = ConvertToEven(root_size.height)} elseif root_show == 7 then -- 上下居中 root_anchor.y = 0.5 root_position.y = mfloor(rootRect.height / 2) root_size = background.render:getContentSize() -- 尺寸处理成偶数,防止特效抖动 root_size.height = ConvertToEven(root_size.height) elseif root_show == 8 then -- 左右居中 root_anchor.x = 0.5 root_position.x = mfloor(rootRect.width / 2) root_size = background.render:getContentSize() -- 尺寸处理成偶数,防止特效抖动 root_size.width = ConvertToEven(root_size.width) end end trunk.render:setContentSize(root_size) trunk.render:setAnchorPoint(root_anchor) trunk.render:setPosition(root_position) trunk.render:stopAllActions() -- load background attr if background and background.render then SUILoader.loadSWidgetAttr(background) end -- DEBUG if DEBUG_MODE then trunk.render:setBackGroundColor(cc.Color3B.RED) trunk.render:setBackGroundColorType(1) trunk.render:setBackGroundColorOpacity(80) end --------------------------------------- -- load renders local function loadBranchRenders(loadTrunk) if #loadTrunk.branches == 0 then return nil end for _, branch in ipairs(loadTrunk.branches) do if not branch.render then local render = self:load_render(branch, callback, closeCB) if render then branch.render = render -- add to trunk loadTrunk:addBranchRender(branch) -- load show attr SUILoader.loadSWidgetAttr(branch) if loadTrunk.element.type == "ListView" then if loadTrunk.element.attr.default and tonumber(loadTrunk.element.attr.default) then local default = tonumber(loadTrunk.element.attr.default) - 1 local index = math.max(default, 0) loadTrunk.render:jumpToItem(index, cc.p(0, 0), cc.p(0, 0)) end loadTrunk.render:doLayout() end if loadTrunk.element.type == "PageView" then if loadTrunk.element.attr.default and tonumber(loadTrunk.element.attr.default) then local default = tonumber(loadTrunk.element.attr.default) - 1 local index = math.max(default, 0) loadTrunk.render:setCurrentPageIndex(index) end loadTrunk.render:doLayout() end end end end end -- load immediate flag, edit form background local loadCount = 1 local loadStep = 50 if background then if isImmediate == false then isImmediate = true -- if tonumber(background.element.attr.loadDelay) == 1 then isImmediate = false end end loadCount = tonumber(background.element.attr.loadCount) or loadCount loadStep = tonumber(background.element.attr.loadStep) or loadStep if npcLayer then npcLayer.background = background end end if isImmediate then local function loadBranch(loadTrunk) if #loadTrunk.branches > 0 then loadBranchRenders(loadTrunk) for _, branch in ipairs(loadTrunk.branches) do loadBranch(branch) end end end loadBranch(trunk) -- 装载完成 if loadCompleteCB then loadCompleteCB() end else local loadQueue = {} local loadTrunk = nil tinsert(loadQueue, trunk) local function scheduleCB(sender, loadInit) local step = loadInit and loadCount or loadStep for i=1, step do if #loadQueue == 0 then trunk.render:stopAllActions() -- 装载完成 if loadCompleteCB then loadCompleteCB() end return end -- load render loadTrunk = tremove(loadQueue, 1) loadBranchRenders(loadTrunk) if #loadTrunk.branches > 0 then for _, branch in ipairs(loadTrunk.branches) do if #branch.branches > 0 then tinsert(loadQueue, branch) end end end end end schedule(trunk.render, scheduleCB, interval) scheduleCB(trunk.render, true) end return trunk, background end function SUILoader:load_action(source) if not source then return nil end local find_info = {sfind(source, "{(.+)}")} if not (find_info[1] and find_info[2] and string.len(find_info[3]) > 0) then return nil end local actions = {} local slices = ssplit(find_info[3], ";") for _, slice in ipairs(slices) do local slice_info = {sfind(slice, "(.+):(.+)")} local action_type = tonumber(slice_info[3]) local params = ssplit(slice_info[4], "#") if action_type == 1 then table.insert(actions, cc.ScaleTo:create(tonumber(params[1]), tonumber(params[2]), tonumber(params[2]))) elseif action_type == 2 then dump(params) table.insert(actions, cc.FadeTo:create(tonumber(params[1]), tonumber(params[2]))) end end if not next(actions) then return nil end return cc.Sequence:create(actions) end function SUILoader:reload_render(swidget) local element = swidget.element if element.type == "ListView" then local default = tonumber(element.attr.default) if default and swidget.render then -- default local function callback() local index = math.max(default - 1, 0) swidget.render:jumpToItem(index, cc.p(0, 0), cc.p(0, 0)) swidget.render:doLayout() end performWithDelay(swidget.render, callback, 1/60) end end if element.type == "PageView" then local default = tonumber(element.attr.default) if default and swidget.render then -- default local function callback() local index = math.max(default - 1, 0) swidget.render:setCurrentPageIndex(index) swidget.render:doLayout() end performWithDelay(swidget.render, callback, 1/60) end end end function SUILoader:load_render(swidget, callback, closeCB) local element = swidget.element local loader = self._loaders[element.type] if nil == loader then print("load render error") return nil end local render = loader(swidget, callback, closeCB) render:setCascadeOpacityEnabled(true) render:setName(element.attr.id) return render end function SUILoader:linkFuncWithCheckWords(callback, param) if not callback or not param then return end local fixInput = param.Input local function checkFunc(i) local v = fixInput[i] if v and (v.isChatInput or v.isNameInput) then local isNameCheck = v.isNameInput local isChatCheck = v.isChatInput if isNameCheck and IsForbidName(true) then return end if isChatCheck and IsForbidSay(true) then return end local SensitiveWordProxy = global.Facade:retrieveProxy(global.ProxyTable.SensitiveWordProxy) local function handle_Func(state, str, risk_param) if not str then global.Facade:sendNotification(global.NoticeTable.SystemTips, GET_STRING(1006)) return end v.value = str if i == #fixInput then param.Input = (#fixInput > 0 and fixInput or nil) callback(param) else checkFunc(i + 1) end end if isNameCheck then SensitiveWordProxy:IsHaveSensitiveAddFilter(v.value, handle_Func) else SensitiveWordProxy:fixSensitiveTalkAddFilter(v.value, handle_Func, nil) end else if i == #fixInput then param.Input = (#fixInput > 0 and fixInput or nil) callback(param) else checkFunc(i + 1) end end end if fixInput and #fixInput > 0 then checkFunc(1) else callback(param) end end function SUILoader:load_render_Text(swidget, callback) local element = swidget.element local text = element.attr.text or "" local size = tonumber(element.attr.size) or defaultFontSize local color = element.attr.color or defaultColorID local link = element.attr.link local width = tonumber(element.attr.width) local outline = tonumber(element.attr.outline) or defaultOutline local outlinecolor = tonumber(element.attr.outlinecolor) or defaultOutlineC local scrollWidth = tonumber(element.attr.scrollWidth) local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local auto = tonumber(element.attr.auto) local platform = tonumber(element.attr.platform) local clickInterval = (tonumber(element.attr.clickInterval) or 0) * 0.001 local tips = element.attr.tips local tipsx = tonumber(element.attr.tipsx) or 0 local tipsy = tonumber(element.attr.tipsy) or 0 local tipWidth = tonumber(element.attr.tipWidth) or 1136 local simplenum = tonumber(element.attr.simplenum) or 0 local scrollWay = tonumber(element.attr.scrollWay) or 0 -- 0 从右到左 1 从下到上 local scrollTime = tonumber(element.attr.scrollTime) or 4 local scrollHeight = tonumber(element.attr.scrollHeight) local thouFormat = tonumber(element.attr.thouFormat) or 0 local hexColor = element.attr.hexcolor local bl = math.floor(tonumber(element.attr.bl) or 0) text = string.gsub(text, "\\", "\r\n") text = string.trim(text) if tonumber(text) and bl >= 1 and bl <= 3 then local unitFunc = function(num, pointBit) pointBit = pointBit or 2 if pointBit == 0 then return math.floor(num) end local iNum, fNum = math.modf(num) local fDecimal = math.pow(10, tostring(pointBit)) local newFNum = math.floor(tostring(fNum * fDecimal)) local newINum = iNum + (newFNum / fDecimal) return newINum end local blValue = 100 if bl == 2 then blValue = 10000 elseif bl == 3 then blValue = 1000 end text = string.format("%s%%", unitFunc(text/blValue)) end -- local colorTable = {} if tonumber(color) then table.insert(colorTable, tonumber(color)) else local slices = ssplit(color, ",") for _, v in ipairs(slices) do table.insert(colorTable, tonumber(v)) end end -- local useHex = false local hexColorTable = {} if hexColor then local slices = ssplit(hexColor, ",") for _, v in ipairs(slices) do if string.len(v) > 0 and string.find(v, "#") then table.insert(hexColorTable, v) end end if #hexColorTable > 0 then useHex = true end end local widget = global.SWidgetCache:generateRender("ccui.Text") widget:setScale(1) widget:setString(text) widget:setFontSize(size) widget:setFontName(defaultFontPath) widget:setTextColor(useHex and GetColorFromHexString(hexColorTable[1]) or GET_COLOR_BYID_C3B(colorTable[1])) widget:setTouchEnabled(false) widget:stopAllActions() widget:disableEffect(1) widget:disableEffect(6) widget:getVirtualRenderer():setMaxLineWidth(0) widget:enableOutline(GET_COLOR_BYID_C3B(outlinecolor), outline) -- 加入元变量组件管理 local isMateValue = false local metaValue = {} local content = text while content and string.len(content) > 0 do local find_info = {sfind(content, "$STM%((.-)%)")} local begin_pos = find_info[1] local end_pos = find_info[2] if begin_pos and end_pos then isMateValue = true -- prefix if begin_pos ~= 1 then local substr = string.sub(content, 1, begin_pos - 1) table.insert(metaValue, substr) end -- metaValue local slices = ssplit(find_info[3], "_") table.insert(metaValue, {key = slices[1], param = slices[2]}) -- suffix content = string.sub(content, end_pos+1, string.len(content)) else table.insert(metaValue, content) content = "" end end if isMateValue then widget.useMetaValue = true global.Facade:sendNotification(global.NoticeTable.SUIMetaWidgetAdd, {metaValue = metaValue, widget = widget, lifewidget = widget, simplenum = simplenum, thouFormat = thouFormat}) end -- width if width then local contentSize = widget:getContentSize() local renderer = widget:getVirtualRenderer() renderer:setMaxLineWidth(width) end -- link if link and string.len(link) > 0 or (tips and string.len(tips) > 0) then widget:setTouchEnabled(true) widget:addClickEventListener(function() DelayTouchEnabled(widget, clickInterval) widget:setScale(1 + 0.2) local function reback() widget:setScale(1) end performWithDelay(widget, reback, 0.03) if callback and link then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end if not global.isWinPlayMode then if tips and string.len(tips) > 0 then local offset = cc.p(tipsx, -tipsy) local anchorPoint = cc.p(0.5, 1) tips = string.gsub(tips, "%^", "\\") SHOW_SUI_DESCTIP( widget ,tips, tipWidth, offset, anchorPoint) end end end) -- 下划线 widget:getVirtualRenderer():enableUnderline() end -- auto color local tbl = useHex and hexColorTable or colorTable if #tbl > 1 then local index = 1 local function callback() index = index + 1 if index > #tbl then index = 1 end local color = useHex and GetColorFromHexString(tbl[index]) or GET_COLOR_BYID_C3B(tbl[index]) widget:setTextColor(color) if link and string.len(link) > 0 then -- 下划线 widget:getVirtualRenderer():disableEffect(6) widget:getVirtualRenderer():enableUnderline() end end schedule(widget, callback, 1) end self:addMouseOverTips(widget, element) -- auto scroll if scrollWidth then local widgetSize = widget:getContentSize() local scrollH = scrollHeight or widgetSize.height local scrollLayout = global.SWidgetCache:generateRender("ccui.Layout") scrollLayout:setClippingType(0) scrollLayout:setClippingEnabled(true) scrollLayout:setContentSize(cc.size(scrollWidth, scrollH)) scrollLayout:addChild(widget) widget:setAnchorPoint(cc.p(0, 0)) widget:setPosition(cc.p(0, 0)) if scrollWay == 0 then widget:runAction(cc.RepeatForever:create(cc.Sequence:create( cc.MoveBy:create(scrollTime, cc.p(-widgetSize.width, 0)), cc.MoveBy:create(0, cc.p(widgetSize.width, 0))) )) elseif scrollWay == 1 then widget:setAnchorPoint(cc.p(0,1)) widget:setPosition(cc.p(0, scrollH)) widget:runAction(cc.RepeatForever:create(cc.Sequence:create( cc.MoveBy:create(scrollTime, cc.p(0, widgetSize.height)), cc.MoveBy:create(0, cc.p(0, -widgetSize.height)) ))) end return scrollLayout end -- auto event if widget:getChildByName("textAuto") then widget:removeChildByName("textAuto") end if platform == global.OperatingMode and auto and link and string.len(link) > 0 then local textAuto = ccui.Text:create() widget:addChild(textAuto) textAuto:setName("textAuto") textAuto:setString(string.format("(%s)", auto)) textAuto:setFontSize(size) textAuto:setFontName(defaultFontPath) textAuto:setColor(cc.Color3B.WHITE) textAuto:setAnchorPoint(cc.p(0, 0.5)) textAuto:setPosition(cc.p(widget:getContentSize().width + 3, widget:getContentSize().height/2)) widget:disableEffect(6) local function autoCB() auto = auto - 1 auto = math.max(auto, 0) textAuto:setString(string.format("(%s)", auto)) if auto == 0 then textAuto:stopAllActions() textAuto:removeFromParent() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end end schedule(textAuto, autoCB, 1) end if simplenum == 1 then local text = widget:getString() if text and tonumber(text) then text = GetSimpleNumber(tonumber(text)) widget:setString(text) end end if thouFormat == 1 then local text = widget:getString() if text and tonumber(text) then text = string.formatnumberthousands(tonumber(text)) widget:setString(text) end end return widget end function SUILoader:load_render_TextAtlas(swidget, callback) local element = swidget.element local img = element.attr.img or "public/word_tywz_01.png" local iwidth = tonumber(element.attr.iwidth) or 18 local iheight = tonumber(element.attr.iheight) or 28 local schar = element.attr.schar or "0" local text = element.attr.text or "" local img = SUIHelper.fixImageFileName(img) local fullPath = (img and img ~= "") and string.format(getResFullPath("res/%s"), img) or "" if not fullPath or fullPath == "" or not global.FileUtilCtl:isFileExist(fullPath) then img = SUIHelper.fixImageFileName("public/word_tywz_01.png") fullPath = string.format(getResFullPath("res/%s"), img) end local widget = ccui.TextAtlas:create() widget:setProperty( "", fullPath, iwidth, iheight, schar ) widget:setScale(1) -- 加入元变量组件管理 local isMateValue = false local metaValue = {} local content = text while content and string.len(content) > 0 do local find_info = {sfind(content, "$STM%((.-)%)")} local begin_pos = find_info[1] local end_pos = find_info[2] if begin_pos and end_pos then isMateValue = true -- prefix if begin_pos ~= 1 then local substr = string.sub(content, 1, begin_pos - 1) table.insert(metaValue, substr) end -- metaValue local slices = ssplit(find_info[3], "_") table.insert(metaValue, {key = slices[1], param = slices[2]}) -- suffix content = string.sub(content, end_pos+1, string.len(content)) else table.insert(metaValue, content) content = "" end end if isMateValue then widget.useMetaValue = true global.Facade:sendNotification(global.NoticeTable.SUIMetaWidgetAdd, {metaValue = metaValue, widget = widget, lifewidget = widget}) else widget:setString(text) end return widget end function SUILoader:load_render_RText(swidget, callback) local element = swidget.element local text = element.attr.text or "" local size = tonumber(element.attr.size) or defaultFontSize local color = tonumber(element.attr.color) or defaultColorID local width = tonumber(element.attr.width) or 1136 local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local outline = tonumber(element.attr.outline) or defaultOutline local outlinecolor = tonumber(element.attr.outlinecolor) or defaultOutlineC local scrollWidth = tonumber(element.attr.scrollWidth) local scrollWay = tonumber(element.attr.scrollWay) or 0 -- 0 从右到左 1 从下到上 local scrollTime = tonumber(element.attr.scrollTime) or 4 local scrollHeight = tonumber(element.attr.scrollHeight) local function textCB(str) if callback then local jsonData = {} jsonData.Act = str callback(jsonData) end end local ttfConfig = { outlineSize = outline, outlineColor = GET_COLOR_BYID_C3B(outlinecolor) } local SUI_RTEXT_FONT_PATH = SL:GetMetaValue("WINPLAYMODE") and SL:GetMetaValue("GAME_DATA","SUI_RTEXT_FONT_PATH") or nil local fontPath = SUI_RTEXT_FONT_PATH or defaultFontPath local widget = RichTextHelp:CreateRichTextWithFCOLOR(text, width, size, color, ttfConfig, textCB, SL:GetMetaValue("GAME_DATA","DEFAULT_VSPACE"), fontPath) self:addMouseOverTips(widget, element) -- auto scroll if scrollWidth then local widgetSize = widget:getContentSize() local scrollH = scrollHeight or widgetSize.height local scrollLayout = global.SWidgetCache:generateRender("ccui.Layout") scrollLayout:setClippingEnabled(true) scrollLayout:setClippingType(0) scrollLayout:setContentSize(cc.size(scrollWidth, scrollH)) scrollLayout:addChild(widget) widget:setAnchorPoint(cc.p(0, 0)) widget:setPosition(cc.p(0, 0)) if scrollWay == 0 then widget:runAction(cc.RepeatForever:create(cc.Sequence:create( cc.MoveBy:create(scrollTime, cc.p(-widgetSize.width, 0)), cc.MoveBy:create(0, cc.p(widgetSize.width, 0))) )) elseif scrollWay == 1 then widget:setAnchorPoint(cc.p(0, 1)) widget:setPosition(cc.p(0, scrollH)) widget:runAction(cc.RepeatForever:create(cc.Sequence:create( cc.MoveBy:create(scrollTime, cc.p(0, widgetSize.height)), cc.MoveBy:create(0, cc.p(0, -widgetSize.height)) ))) end return scrollLayout end return widget end function SUILoader:load_render_Img(swidget, callback) local element = swidget.element local bg = tonumber(element.attr.bg) local img = element.attr.img or "" local link = element.attr.link local width = tonumber(element.attr.width) local height = tonumber(element.attr.height) local scale9l = tonumber(element.attr.scale9l) local scale9r = tonumber(element.attr.scale9r) local scale9t = tonumber(element.attr.scale9t) local scale9b = tonumber(element.attr.scale9b) local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local grey = tonumber(element.attr.grey) or 0 local flip = tonumber(element.attr.flip) or 0 local tips = element.attr.tips local tipsx = tonumber(element.attr.tipsx) or 0 local tipsy = tonumber(element.attr.tipsy) or 0 local tipWidth = tonumber(element.attr.tipWidth) or 1136 local mainIndex = element.attr._mainIndex local widget = nil local img = SUIHelper.fixImageFileName(img) local fullPath = (img and img ~= "") and string.format(getResFullPath("res/%s"), img) or "" if not fullPath or fullPath == "" or not global.FileUtilCtl:isFileExist(fullPath) then widget = global.SWidgetCache:generateEmptyImageRender("ccui.ImageView") else widget = global.SWidgetCache:generateRender("ccui.ImageView") end widget:loadTexture(fullPath) widget:ignoreContentAdaptWithSize(false) widget:setContentSize(widget:getVirtualRendererSize()) widget:setCapInsets(cc.rect(0, 0, 0, 0)) widget:setScale9Enabled(false) widget:setTouchEnabled(false) if scale9l and scale9r and scale9t and scale9b then local contentSize = widget:getContentSize() local x = scale9l local y = scale9t local width = contentSize.width-scale9l-scale9r local height = contentSize.height-scale9t-scale9b widget:setScale9Enabled(true) widget:setCapInsets({x = x, y = y, width = width, height = height}) end -- link widget._linkClick = false if link and string.len(link) > 0 then widget:setTouchEnabled(true) widget:addClickEventListener(function() if mainIndex then -- 数据上报 local NativeBridgeProxy = global.Facade:retrieveProxy(global.ProxyTable.NativeBridgeProxy) NativeBridgeProxy:GN_MainUIClickEvent({ index = mainIndex, id = element.attr.id, link = link }) end if callback and link then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end if not global.isWinPlayMode then if tips and string.len(tips) > 0 then local offset = cc.p(tipsx, -tipsy) local anchorPoint = cc.p(0.5, 1) tips = string.gsub(tips, "%^", "\\") SHOW_SUI_DESCTIP( widget ,tips, tipWidth, offset, anchorPoint) end end end) if bg == 1 then widget._linkClick = true end end if bg == 1 then widget:setTouchEnabled(true) if global.isWinPlayMode then widget:setMouseEnabled(true) global.mouseEventController:registerMouseMoveEvent(widget) end end self:addMouseOverTips(widget, element) -- grey if grey == 1 then Shader_Grey(widget) else Shader_Normal(widget) end if flip == 1 then widget:setFlippedX(true) elseif flip == 2 then widget:setFlippedY(true) end return widget end function SUILoader:load_render_Button(swidget, callback, closeCB) local element = swidget.element local nimg = element.attr.nimg local pimg = element.attr.pimg local mimg = element.attr.mimg local text = element.attr.text or "" local color = tonumber(element.attr.color) or defaultColorID local size = tonumber(element.attr.size) or defaultFontSize local width = tonumber(element.attr.width) local height = tonumber(element.attr.height) local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local tips = element.attr.tips local tipsx = tonumber(element.attr.tipsx) or 0 local tipsy = tonumber(element.attr.tipsy) or 0 local textWidth = tonumber(element.attr.textwidth) local grey = tonumber(element.attr.grey) or 0 local clickInterval = (tonumber(element.attr.clickInterval) or 0) * 0.001 local outline = tonumber(element.attr.outline) or defaultOutline local outlinecolor = tonumber(element.attr.outlinecolor) or defaultOutlineC local tipWidth = tonumber(element.attr.tipWidth) or 1136 local mainIndex = element.attr._mainIndex text = string.gsub(text, "\\", "\r\n") text = string.trim(text) local nimg = SUIHelper.fixImageFileName(nimg) local pimg = SUIHelper.fixImageFileName(pimg) local mimg = SUIHelper.fixImageFileName(mimg) local fullPathN = (nimg and string.len(nimg) > 0 and string.format(getResFullPath( "res/%s" ), nimg) or "") local fullPathP = (pimg and string.len(pimg) > 0 and string.format(getResFullPath( "res/%s" ), pimg) or "") local fullPathM = (mimg and string.len(mimg) > 0 and string.format(getResFullPath( "res/%s" ), mimg) or "") local widget = nil local isNormalExist = fullPathN ~= "" and global.FileUtilCtl:isFileExist(fullPathN) local isPressExist = fullPathP ~= "" and global.FileUtilCtl:isFileExist(fullPathP) local isMouseExist = fullPathM ~= "" and global.FileUtilCtl:isFileExist(fullPathM) local Button_Type = 1 --1-normalAndPress 2-Normal 3-Press 4-nil if isNormalExist and isPressExist then Button_Type = 1 elseif isNormalExist then Button_Type = 2 elseif isPressExist then Button_Type = 3 else Button_Type = 4 end widget = global.SWidgetCache:generateButtonRender(Button_Type) widget:resetNormalRender() widget:resetPressedRender() widget:setTitleText(text) widget:setTitleColor(GET_COLOR_BYID_C3B(color)) widget:setTitleFontName(defaultFontPath) widget:setTitleFontSize(size) widget:setTouchEnabled(false) widget:getTitleRenderer():setMaxLineWidth(0) widget:getTitleRenderer():enableOutline(GET_COLOR_BYID_C3B(outlinecolor), outline) if isNormalExist then widget:loadTextureNormal(fullPathN) end if isPressExist then widget:loadTexturePressed(fullPathP) end -- widget:ignoreContentAdaptWithSize(false) widget:setContentSize(widget:getVirtualRendererSize()) local showTips = tips and string.len(tips) > 0 if isNormalExist and (isMouseExist or showTips) then if global.isWinPlayMode then local function checkResType(path) if global.SpriteFrameCache:getSpriteFrame(path) then return 1 end if global.FileUtilCtl:isFileExist(path) then return 0 end return 0 end local function checkRes(path) local resType = checkResType(path) if isMouseExist and isNormalExist then widget:loadTextureNormal(path, resType) end end local offset = cc.p(tipsx, -tipsy) local anchor = cc.p(0.5, 1) local function enterCB(touchPos) if global.userInputController:isTouching() or not widget:isVisible() then return false end if not CheckNodeCanCallBack(widget, touchPos) then return false end checkRes(fullPathM) if showTips then tips = string.gsub(tips, "%^", "\\") showMouseOverTips(widget, tips, offset, anchor) end end local function leaveCB() checkRes(fullPathN) hideMouseOverTips() end -- widget:loadTextureMouseOver(fullPathN, fullPathM, enterCB, leaveCB) global.mouseEventController:registerMouseMoveEvent( widget, { enter = enterCB, leave = leaveCB, checkIsVisible = true } ) end end -- 加入元变量组件管理 local isMateValue = false local metaValue = {} local content = text while content and string.len(content) > 0 do local find_info = {sfind(content, "$STM%((.-)%)")} local begin_pos = find_info[1] local end_pos = find_info[2] if begin_pos and end_pos then isMateValue = true -- prefix if begin_pos ~= 1 then local substr = string.sub(content, 1, begin_pos - 1) table.insert(metaValue, substr) end -- metaValue local slices = ssplit(find_info[3], "_") table.insert(metaValue, {key = slices[1], param = slices[2]}) -- suffix content = string.sub(content, end_pos+1, string.len(content)) else table.insert(metaValue, content) content = "" end end if isMateValue then widget.useMetaValue = true global.Facade:sendNotification(global.NoticeTable.SUIMetaWidgetAdd, {metaValue = metaValue, widget = widget, lifewidget = widget}) end if textWidth then local renderer = widget:getTitleRenderer() renderer:setMaxLineWidth(textWidth) end -- link if link and string.len(link) > 0 or (tips and string.len(tips) > 0) then widget:setTouchEnabled(true) widget:addClickEventListener(function() DelayTouchEnabled(widget, clickInterval) if mainIndex then -- 数据上报 local NativeBridgeProxy = global.Facade:retrieveProxy(global.ProxyTable.NativeBridgeProxy) NativeBridgeProxy:GN_MainUIClickEvent({ index = mainIndex, id = element.attr.id, link = link }) end if link == "@DEFAULT_CLOSE" then if closeCB then closeCB() end elseif callback and link then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end if not global.isWinPlayMode then if tips and string.len(tips) > 0 then local offset = cc.p(tipsx, -tipsy) local anchorPoint = cc.p(0.5, 1) tips = string.gsub(tips, "%^", "\\") SHOW_SUI_DESCTIP( widget ,tips, tipWidth, offset, anchorPoint) end end end) end -- if nil == mimg then -- self:addMouseOverTips(widget, element) -- end -- grey if grey == 1 then Shader_Grey(widget) else Shader_Normal(widget) end return widget end function SUILoader:load_render_CheckBox(swidget, callback) local element = swidget.element local checkboxid = element.attr.checkboxid local nimg = element.attr.nimg local pimg = element.attr.pimg local default = tonumber(element.attr.default) or 0 local submit = tonumber(element.attr.submit) or 0 local delay = math.max(tonumber(element.attr.delay) or 0, 1/60) local count = tonumber(element.attr.count) or 0 local link = element.attr.link local nimg = SUIHelper.fixImageFileName(nimg) local pimg = SUIHelper.fixImageFileName(pimg) local widget = ccui.CheckBox:create() widget:loadTextureBackGround(string.format(getResFullPath("res/%s"), nimg)) widget:loadTextureFrontCross(string.format(getResFullPath("res/%s"), pimg)) widget:setSelected(default == 1) widget:setTouchEnabled(true) widget:ignoreContentAdaptWithSize(false) widget:stopAllActions() -- link if link and string.len(link) > 0 then widget:addEventListener(function() local counting = 0 local function delayCB() if callback then local checkBoxTable = self:getCheckBoxTableByID(checkboxid) local jsonData = {} jsonData.Act = link jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) callback(jsonData) end counting = counting + 1 if count ~= -1 and counting >= count then widget:stopAllActions() end end widget:stopAllActions() schedule(widget, delayCB, delay) end) end if checkboxid and self._checkboxWidgets then self._checkboxWidgets[checkboxid] = widget end return widget end function SUILoader:load_render_ListView(swidget, callback) local element = swidget.element local width = element.attr.width or 200 local height = element.attr.height or 200 local color = tonumber(element.attr.color) local direction = tonumber(element.attr.direction) or 1 local bounce = tonumber(element.attr.bounce) or 1 local margin = tonumber(element.attr.margin) or 0 local default = tonumber(element.attr.default) local cantouch = tonumber(element.attr.cantouch) or 1 local widget = global.SWidgetCache:generateRender("ccui.ListView") widget:ignoreContentAdaptWithSize(false) widget:setClippingEnabled(true) widget:setClippingType(0) widget:setTouchEnabled(true) widget:setDirection(direction) widget:setGravity(0) widget:setItemsMargin(margin) widget:setBounceEnabled(bounce == 1) widget:setBackGroundColorType(0) widget:stopAllActions() if DEBUG_MODE then widget:setBackGroundColorType(1) widget:setBackGroundColorOpacity(100) widget:setBackGroundColor(cc.Color3B.GREEN) end -- color if color then widget:setBackGroundColorType(1) widget:setBackGroundColorOpacity(255) widget:setBackGroundColor(GET_COLOR_BYID_C3B(color)) end -- default if default then -- default local function callback() default = default - 1 local index = math.max(default, 0) widget:jumpToItem(index, cc.p(0, 0), cc.p(0, 0)) widget:doLayout() end performWithDelay(widget, callback, 1/60) end if cantouch == 0 then widget:setTouchEnabled(false) else widget._unRefPos = true end return widget end function SUILoader:load_render_Effect(swidget, callback) local element = swidget.element local effecttype = tonumber(element.attr.effecttype) or 0 local effectid = tonumber(element.attr.effectid) or 9999 local sex = tonumber(element.attr.sex) or 0 local act = tonumber(element.attr.act) or 0 local dir = tonumber(element.attr.dir) or 5 local speed = tonumber(element.attr.speed) or 1 local scale = tonumber(element.attr.scale) or 1 local count = tonumber(element.attr.count) or 0 local grey = tonumber(element.attr.grey) or 0 local link = element.attr.link local scalex = tonumber(element.attr.scalex) local scaley = tonumber(element.attr.scaley) -- 0.普通特效 1.npc模型 2.怪物模型 3.技能特效 4.人物 5.武器 6.翅膀 7.发型 8.盾牌 local widget = nil if effecttype == 0 then -- 特效 widget = global.FrameAnimManager:CreateSFXAnim(effectid) widget:Play(0, 0, true, speed) elseif effecttype == 1 then -- NPC widget = global.FrameAnimManager:CreateActorNpcAnim(effectid) widget:Play(act, dir, true, speed) elseif effecttype == 2 then -- 怪物 widget = global.FrameAnimManager:CreateActorMonsterAnim(effectid, act) widget:Play(act, dir, true, speed) elseif effecttype == 3 then -- 技能 widget = global.FrameAnimManager:CreateSkillEffAnim(effectid, dir) widget:Play(act, dir, true, speed) elseif effecttype == 4 then -- 人物 widget = global.FrameAnimManager:CreateActorPlayerAnim(effectid, sex, act) widget:Play(act, dir, true, speed) elseif effecttype == 5 then -- 武器 widget = global.FrameAnimManager:CreateActorPlayerWeaponAnim(effectid, sex, act) widget:Play(act, dir, true, speed) elseif effecttype == 6 then -- 翅膀 widget = global.FrameAnimManager:CreateActorPlayerWingsAnim(effectid, sex, act) widget:Play(act, dir, true, speed) elseif effecttype == 7 then -- 发型 widget = global.FrameAnimManager:CreateActorPlayerHairAnim(effectid, sex, act) widget:Play(act, dir, true, speed) elseif effecttype == 8 then -- 盾牌 widget = global.FrameAnimManager:CreateActorPlayerShieldAnim(effectid, sex, act) widget:Play(act, dir, true, speed) else widget = global.FrameAnimManager:CreateSFXAnim(1) widget:Play(0, 0, true, speed) end if widget then widget:setScale(scale) if not tonumber(element.attr.scale) and scalex then widget:setScaleX(scalex) end if not tonumber(element.attr.scale) and scaley then widget:setScaleY(scaley) end -- 播放次数 local counting = 0 widget:SetAnimEventCallback( function(_, eventType) counting = counting + 1 if counting == count then if link then if callback then local jsonData = {} jsonData.Act = link callback(jsonData) end end widget:Stop() widget:setVisible(false) end end ) -- 灰化处理 if grey == 1 then Shader_Grey(widget) else Shader_Normal(widget) end end return widget end function SUILoader:load_render_Frames(swidget, callback) local element = swidget.element local prefix = element.attr.prefix local suffix = element.attr.suffix local speed = tonumber(element.attr.speed) or 100 local count = tonumber(element.attr.count) or 1 local loop = tonumber(element.attr.loop) or -1 local finishframe = tonumber(element.attr.finishframe) local finishhide = tonumber(element.attr.finishhide) local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local img = SUIHelper.fixImageFileName(prefix .. "1" .. suffix) local fullPath = string.format(getResFullPath("res/%s"), img) local widget = nil if global.FileUtilCtl:isFileExist(fullPath) then widget = global.SWidgetCache:generateRender("ccui.ImageView") else widget = ccui.ImageView:create() end widget:loadTexture(fullPath) widget:ignoreContentAdaptWithSize(false) widget:setContentSize(widget:getVirtualRendererSize()) widget:setTouchEnabled(false) widget:setCapInsets(cc.rect(0, 0, 0, 0)) widget:setScale9Enabled(false) widget:stopAllActions() local function finishCB() if finishframe then fullPath = string.format(getResFullPath("res/%s"), SUIHelper.fixImageFileName(prefix .. finishframe .. suffix)) widget:loadTexture(fullPath) end if finishhide == 1 then widget:setVisible(false) end end local index = 1 local counting = 0 local function delayCB() fullPath = string.format(getResFullPath("res/%s"), SUIHelper.fixImageFileName(prefix .. index .. suffix)) widget:loadTexture(fullPath) index = index + 1 if index > count then index = 1 counting = counting + 1 if loop ~= -1 and counting >= loop then widget:stopAllActions() finishCB() end end end schedule(widget, delayCB, speed*0.01) delayCB() -- link if link and string.len(link) > 0 then widget:setTouchEnabled(true) widget:addClickEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end return widget end function SUILoader:load_render_Input(swidget, callback) local element = swidget.element local inputid = element.attr.inputid local inputtype = tonumber(element.attr.type) or 0 local text = element.attr.text or "" local place = element.attr.place local placecolor = element.attr.placecolor or defaultColorID local width = element.attr.width local height = element.attr.height local color = element.attr.color or defaultColorID local size = tonumber(element.attr.size) or defaultFontSize local mincount = element.attr.mincount local maxcount = tonumber(element.attr.maxcount) or 10000 local errortips = element.attr.errortips local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local linkType = tonumber(element.attr.linkType) or 1 local link = element.attr.link local onlyCh = tonumber(element.attr.onlyCh) and tonumber(element.attr.onlyCh) == 1 local isChatInput = (tonumber(element.attr.isChatInput) or 1) == 1 local isNameInput = tonumber(element.attr.isNameInput) == 1 local fontPath = defaultFontPath local widget = ccui.EditBox:create({width=width, height=height}, global.MMO.PATH_RES_ALPHA) widget:setFontColor(GET_COLOR_BYID_C3B(tonumber(color))) widget:setColor(GET_COLOR_BYID_C3B(tonumber(color))) if global.isMobile then widget:setFontName(fontPath) end widget:setFontSize(size) widget:setString(text) widget:setPlaceHolder(place) widget:setPlaceholderFontColor(GET_COLOR_BYID_C3B(tonumber(placecolor))) widget:setPlaceholderFontSize(size) widget:setTextHorizontalAlignment(0) widget:setMaxLength(maxcount) -- native offset if global.Platform == cc.PLATFORM_OS_WINDOWS then elseif global.Platform == cc.PLATFORM_OS_ANDROID then widget:setNativeOffset( cc.p( 0, -15 ) ) else end -- 输入类型 if inputtype == 1 or inputtype == 3 then widget:setInputMode(2) elseif inputtype == 2 then widget:setInputFlag(0) end if inputid and self._inputWidgets then self._inputWidgets[inputid] = {widget = widget, inputFlag = (inputtype ~= 1 and "INPUTTEXT" or ""), isChatInput = isChatInput, isNameInput = isNameInput} end local function eventCB(sender, eventType) if eventType == 2 and onlyCh then local str = sender:getString() sender:setString(CheckInputOnlyChinese(str)) end if eventType == 2 and (inputtype == 1 or inputtype == 3) then local str = sender:getString() if string.find(str,"[^%d]+") then local s, d = string.find(str,"[^%d]+") local str1 = string.sub(str, 1, s-1) local str2 = string.sub(str, d+1) sender:setString(str1..str2) end if inputtype == 3 then local str = sender:getString() local num = tonumber(str) if num and tostring(num) ~= str then sender:setString(num) end end end end if link then widget:addEventListener(function(sender, eventType) eventCB(sender, eventType) if linkType == eventType then if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end end) else widget:addEventListener(eventCB) end return widget end function SUILoader:load_render_COUNTDOWN(swidget, callback) local element = swidget.element local time = tonumber(element.attr.time) or 10 local count = tonumber(element.attr.count) or 1 local color = tonumber(element.attr.color) or defaultColorID local size = tonumber(element.attr.size) or defaultFontSize local showWay = tonumber(element.attr.showWay) or 0 local outline = tonumber(element.attr.outline) or defaultOutline local outlinecolor = tonumber(element.attr.outlinecolor) or defaultOutlineC local link = element.attr.link local widget = global.SWidgetCache:generateRender("ccui.Text") if showWay == 1 then widget:setString(TimeFormatToString(time)) else widget:setString(string.format(GET_STRING(2006), time)) end widget:setFontSize(size) widget:setFontName(defaultFontPath) widget:setTextColor(GET_COLOR_BYID_C3B(color)) widget:enableOutline(GET_COLOR_BYID_C3B(outlinecolor), outline) widget:setTouchEnabled(false) widget:stopAllActions() local counting = 0 local remaining = time local function scheduleCallback() if showWay == 1 then widget:setString(TimeFormatToString(remaining)) else widget:setString(string.format(GET_STRING(2006), remaining)) end remaining = remaining - 1 if remaining < 0 then -- link if link and string.len(link) > 0 then if callback then local jsonData = {} jsonData.Act = link callback(jsonData) end end remaining = time counting = counting + 1 if count > 0 and counting >= count then widget:stopAllActions() end end end schedule(widget, scheduleCallback, 1) scheduleCallback() return widget end function SUILoader:load_render_ItemShow(swidget, callback) local element = swidget.element local itemid = tonumber(element.attr.itemid) or 1 local itemcount = tonumber(element.attr.itemcount) or 1 local showtips = tonumber(element.attr.showtips) or 1 local bgtype = tonumber(element.attr.bgtype) local scale = tonumber(element.attr.scale) or 1 local grey = tonumber(element.attr.grey) or 0 local lock = tonumber(element.attr.lock) or 0 local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local countColor = tonumber(element.attr.color) or defaultColorID local dblink = element.attr.dblink local effectshow = tonumber(element.attr.effectshow) or 1 local itemDataStr = element.attr.itemdata local itemName = element.attr.itemname local itemData = nil if itemDataStr and string.len(tostring(itemDataStr)) > 0 then local json = cjson.decode(itemDataStr) if json and next(json) then itemData = ChangeItemServersSendDatas(json) end end if itemName and string.len(itemName) > 0 then local ItemConfigProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemConfigProxy) local index = ItemConfigProxy:GetItemIndexByName(itemName) if index and not tonumber(element.attr.itemid) then itemid = index end end local contentSize = cc.size(66,66) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) local info = {} info.index = itemid info.look = showtips == 1 info.count = itemcount info.bgVisible = bgtype == 1 info.color = countColor info.itemData = itemData if not info.look and global.isWinPlayMode then info.noMouseTips = true end if effectshow == 2 then info.showModelEffect = true elseif effectshow == 0 then info.isShowEff = false end local goodsItem = GoodsItem:create(info) widget:addChild(goodsItem) goodsItem:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) goodsItem:setScale(scale) goodsItem:setIconGrey(grey == 1) if dblink and string.len(dblink) > 0 then if not (showtips == 1) then goodsItem:addLookItemInfoEvent(nil, 2) end goodsItem:addDoubleEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = dblink jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end if lock == 1 then local imageLock = ccui.ImageView:create() imageLock:setAnchorPoint(cc.p(0, 1)) goodsItem:addChild(imageLock) if global.isWinPlayMode then imageLock:setScale(0.7) end imageLock:loadTexture(global.MMO.PATH_RES_PUBLIC .. "lock.png") imageLock:setPosition(cc.p(0, goodsItem:getContentSize().height)) end if link and not dblink then local linkWidget = global.SWidgetCache:generateRender("ccui.Widget") widget:addChild(linkWidget) linkWidget:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) linkWidget:setContentSize(contentSize) linkWidget:setTouchEnabled(true) linkWidget:setSwallowTouches(false) linkWidget:addClickEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end return widget end function SUILoader:load_render_DBItemShow(swidget, callback) local element = swidget.element local makeindex = tonumber(element.attr.makeindex) or 1 local showtips = tonumber(element.attr.showtips) or 1 local bgtype = tonumber(element.attr.bgtype) local scale = tonumber(element.attr.scale) or 1 local grey = tonumber(element.attr.grey) or 0 local showstar = tonumber(element.attr.showstar) == 1 local count = tonumber(element.attr.count) local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local dblink = element.attr.dblink local effectshow = tonumber(element.attr.effectshow) or 1 -- 1只显示背包 2只显示内观 0不显示 local itemData = nil if not itemData then local EquipProxy = global.Facade:retrieveProxy(global.ProxyTable.Equip) itemData = EquipProxy:GetEquipDataByMakeIndex(makeindex) end if not itemData then local BagProxy = global.Facade:retrieveProxy(global.ProxyTable.Bag) itemData = BagProxy:GetItemDataByMakeIndex(makeindex) end if not itemData then local QuickUseProxy = global.Facade:retrieveProxy(global.ProxyTable.QuickUseProxy) itemData = QuickUseProxy:GetQucikUseDataByMakeIndex(makeindex) end if not itemData then local LookPlayerProxy = global.Facade:retrieveProxy(global.ProxyTable.LookPlayerProxy) itemData = LookPlayerProxy:GetLookPlayerItemDataByMakeIndex(makeindex) end local contentSize = cc.size(66,66) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) if itemData then local info = {} info.index = itemData.Index info.itemData = itemData info.look = showtips == 1 info.bgVisible = bgtype == 1 info.starLv = showstar if not info.look and global.isWinPlayMode then info.noMouseTips = true end if effectshow == 2 then info.showModelEffect = true elseif effectshow == 0 then info.isShowEff = false end local goodsItem = GoodsItem:create(info) widget:addChild(goodsItem) goodsItem:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) goodsItem:setScale(scale) goodsItem:setIconGrey(grey == 1) if count then goodsItem:setCount(count) end if dblink and string.len(dblink) then if not (showtips == 1) then goodsItem:addLookItemInfoEvent(nil, 2) end goodsItem:addDoubleEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = dblink jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end end if link and string.len(link) > 0 and not dblink then local linkWidget = global.SWidgetCache:generateRender("ccui.Widget") widget:addChild(linkWidget) linkWidget:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) linkWidget:setContentSize(contentSize) linkWidget:setTouchEnabled(true) linkWidget:setSwallowTouches(false) linkWidget:addClickEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end return widget end function SUILoader:load_render_CostItem(swidget, callback) local element = swidget.element local itemid = tonumber(element.attr.itemid) or 1 local itemcount = tonumber(element.attr.itemcount) or 1 local itemScale = tonumber(element.attr.itemscale) local fontSize = tonumber(element.attr.fontsize) local titleText = element.attr.title local simplenum = tonumber(element.attr.simplenum) or 0 local CostItemCell = requireLayerUI("extra_layer/CostItemCell") local widget = CostItemCell:create(string.format("%s#%s", itemid, itemcount), {itemScale = itemScale, titleText = titleText, fontSize = fontSize, simplenum = simplenum}) return widget end function SUILoader:load_render_Layout(swidget, callback) local element = swidget.element local width = tonumber(element.attr.width) or 1 local height = tonumber(element.attr.height) or 1 local color = tonumber(element.attr.color) local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local clipEnable = (tonumber(element.attr.clip) or 0) == 1 local widget = global.SWidgetCache:generateRender("ccui.Layout") widget:setContentSize(cc.size(width, height)) widget:setBackGroundColorType(0) widget:setTouchEnabled(false) if DEBUG_MODE then widget:setBackGroundColorType(1) widget:setBackGroundColorOpacity(100) widget:setBackGroundColor(cc.Color3B.BLUE) end -- color if color then widget:setBackGroundColorType(1) widget:setBackGroundColorOpacity(255) widget:setBackGroundColor(GET_COLOR_BYID_C3B(color)) end -- clip if clipEnable then widget:setClippingEnabled(true) widget:setClippingType(0) end -- link if link and string.len(link) > 0 then widget:setTouchEnabled(true) widget:addClickEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end return widget end function SUILoader:load_render_ITEMBOX(swidget, callback) local element = swidget.element local width = tonumber(element.attr.width) or 1 local height = tonumber(element.attr.height) or 1 local boxindex = tonumber(element.attr.boxindex) local img = element.attr.img local stdmode = element.attr.stdmode local img = SUIHelper.fixImageFileName(img) local fullPath = string.format(getResFullPath("res/%s"), img) local widget = nil if img and img ~= "" and global.FileUtilCtl:isFileExist(fullPath) then widget = global.SWidgetCache:generateRender("ccui.ImageView") else widget = ccui.ImageView:create() end widget:loadTexture(fullPath) widget:ignoreContentAdaptWithSize(false) widget:setContentSize(widget:getVirtualRendererSize()) widget:setCapInsets(cc.rect(0, 0, 0, 0)) widget:setScale9Enabled(false) widget:setTouchEnabled(true) -- local ItemMoveProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemMoveProxy) local function addItemToITEMBOX(touchPos) local state = ItemMoveProxy:GetMovingItemState() if state then local goToName = ItemMoveProxy.ItemGoTo.ITEMBOX local data = {} data.target = goToName data.stdmode = stdmode data.widget = widget data.boxindex = boxindex ItemMoveProxy:CheckAndCallBack( data ) else return -1 end end local function setNoswallowMouse() return -1 end global.mouseEventController:registerMouseButtonEvent( widget, { down_r = setNoswallowMouse, special_r = addItemToITEMBOX } ) -- self:addMouseOverTips(widget, element) -- 加入管理 global.Facade:sendNotification(global.NoticeTable.SUIITEMBOXWidgetAdd, {boxindex = boxindex, widget = widget}) return widget end function SUILoader:load_render_EquipShow(swidget, callback) local element = swidget.element local index = tonumber(element.attr.index) or 0 local showtips = tonumber(element.attr.showtips) or 1 local bgtype = tonumber(element.attr.bgtype) local scale = tonumber(element.attr.scale) or 1 local grey = tonumber(element.attr.grey) or 0 local showstar = tonumber(element.attr.showstar) == 1 local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local dblink = element.attr.dblink local effectshow = tonumber(element.attr.effectshow) or 1 -- 1只显示背包 2只显示内观 0不显示 local contentSize = cc.size(66,66) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) local EquipProxy = global.Facade:retrieveProxy(global.ProxyTable.Equip) local equipData = EquipProxy:GetEquipDataByPos(index) if equipData then local info = {} info.index = equipData.Index info.itemData = equipData info.look = showtips == 1 info.bgVisible = bgtype == 1 info.starLv = showstar if not info.look and global.isWinPlayMode then info.noMouseTips = true end if effectshow == 2 then info.showModelEffect = true elseif effectshow == 0 then info.isShowEff = false end local goodsItem = GoodsItem:create(info) widget:addChild(goodsItem) goodsItem:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) goodsItem:setScale(scale) goodsItem:setIconGrey(grey == 1) if dblink and string.len(dblink) then if not (showtips == 1) then goodsItem:addLookItemInfoEvent(nil, 2) end goodsItem:addDoubleEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = dblink jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end end if link and not dblink then local linkWidget = global.SWidgetCache:generateRender("ccui.Widget") widget:addChild(linkWidget) linkWidget:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) linkWidget:setContentSize(contentSize) linkWidget:setTouchEnabled(true) linkWidget:setSwallowTouches(false) linkWidget:addClickEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end return widget end function SUILoader:load_render_BAGITEMS(swidget, callback) local element = swidget.element local condition = element.attr.condition or "" local exclude = element.attr.exclude or "" local select = element.attr.select or "" local count = tonumber(element.attr.count) or 12 local row = tonumber(element.attr.row) or 2 local selecttype = tonumber(element.attr.selecttype) or 0 local showstar = tonumber(element.attr.showstar) == 1 local iwidth = tonumber(element.attr.iwidth) or 70 local iheight = tonumber(element.attr.iheight) or 70 local iimg = element.attr.iimg local filter1 = element.attr.fliter1 or element.attr.filter1 or "" local filter2 = element.attr.fliter2 or element.attr.filter2 or "" local filter3 = element.attr.fliter3 or element.attr.filter3 or "" local link = element.attr.link local conditionEx = element.attr.conditionEx local conditionParam = element.attr.conditionParam local conditionOnOff = tonumber(element.attr.conditionOnOff) or 0 local condition2 = element.attr.condition2 local dblink = element.attr.dblink local effectshow = tonumber(element.attr.effectshow) or 1 local exBind = tonumber(element.attr.exbind) == 1 local showtips = (tonumber(element.attr.showtips) or 0) == 1 local includeQuick = (tonumber(element.attr.includequick) or 0) == 1 local clickInterval = (tonumber(element.attr.clickInterval) or 0) * 0.001 local itemscaleX = iwidth / 70 local itemscaleY = iheight / 70 -- 是否满足显示条件 local conditionT = {} local slices1 = ssplit(condition, ",") local slices2 = {} for _, v in pairs(slices1) do slices2 = ssplit(v, "#") tinsert(conditionT, {StdMode = tonumber(slices2[1]), Shape = tonumber(slices2[2])}) end -- 唯一ID过滤 local excludeT = {} local slices = ssplit(exclude, ",") for _, v in pairs(slices) do tinsert(excludeT, tonumber(v)) end -- 道具ID过滤,存在不显示 local filter1T = {} local slices = ssplit(filter1, ",") for _, v in pairs(slices) do tinsert(filter1T, tonumber(v)) end -- 道具名过滤,存在不显示 local filter2T = {} local slices = ssplit(filter2, ",") for _, v in pairs(slices) do if v ~= "" then tinsert(filter2T, v) end end -- 道具ID过滤,存在才显示 local filter3T = {} local slices = ssplit(filter3, ",") for _, v in pairs(slices) do if v ~= "" then tinsert(filter3T, v) end end local function conditionAble(item) if conditionEx and tonumber(conditionEx) == 1 then local starLv = item.Star or 0 if conditionOnOff and conditionOnOff == 0 then if conditionParam and starLv < tonumber(conditionParam) then return false end elseif conditionOnOff == 1 then if conditionParam and starLv > tonumber(conditionParam) then return false end end end -- 被排除 for _, v in ipairs(excludeT) do if v == item.MakeIndex then return false end end -- 道具ID过滤 for _, v in ipairs(filter1T) do if v == item.Index then return false end end -- 道具名过滤 for _, v in ipairs(filter2T) do if v == item.Name then return false end end -- 绑定过滤 if exBind and CheckItemisBind(item) then return false end -- 道具ID/道具名过滤 if #filter3T > 0 then for _, v in ipairs(filter3T) do if tonumber(v) == item.Index or v == item.Name then return true end end return false end -- 筛选 if condition == "*" then return true end for _, v in pairs(conditionT) do if v.StdMode == item.StdMode and (not v.Shape or v.Shape == item.Shape) then return true end end if condition2 then if tonumber(item.sDivParam2) and tonumber(item.sDivParam2) == tonumber(condition2) then return true elseif string.find(tostring(condition2), "#") then local paramList = string.split(tostring(condition2), "#") for _, param in ipairs(paramList) do if tonumber(param) == tonumber(item.sDivParam2) then return true end end end end return false end -- 是否选中 local selects = {} local slices = ssplit(select, ",") for _, v in pairs(slices) do tinsert(selects, tonumber(v)) end local function selectAble(item) for _, v in pairs(selects) do if v == item.MakeIndex then return true end end return false end local itemWid = iwidth local itemHei = iheight local col = math.ceil(count / row) local contentSize = cc.size(col * itemWid, row * itemHei) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) -- local boxes = {} for i = 1, count do local x = ((i - 1) % col + 0.5) * itemWid local y = contentSize.height - (mfloor((i - 1) / col) + 0.5) * itemHei local iimg = (iimg and iimg ~= "") and SUIHelper.fixImageFileName(iimg) or "public/1900000664.png" local fullPath = string.format(getResFullPath("res/%s"), iimg) local imageBG = ccui.ImageView:create() widget:addChild(imageBG) imageBG:loadTexture(fullPath) GUI:Image_setScale9Slice(imageBG, 21, 22, 21, 22) GUI:setContentSize(imageBG, itemWid, itemHei) imageBG:setTouchEnabled(false) imageBG:setAnchorPoint(cc.p(0.5, 0.5)) imageBG:setPosition(cc.p(x, y)) tinsert(boxes, imageBG) end -- bag items local BagProxy = global.Facade:retrieveProxy(global.ProxyTable.Bag) local items = {} local BagMaxNum = BagProxy:GetMaxBag() for i = 1, BagMaxNum do local itemMakeIndex = BagProxy:GetMakeIndexByBagPos(i) if itemMakeIndex then local itemData = BagProxy:GetItemDataByMakeIndex(itemMakeIndex) if itemData and conditionAble(itemData) then tinsert(items, itemData) end end end if includeQuick then local QuickUseProxy = global.Facade:retrieveProxy(global.ProxyTable.QuickUseProxy) local quickUseData = QuickUseProxy:GetQuickUseData() for _, itemData in pairs(quickUseData) do if itemData and conditionAble(itemData) then tinsert(items, itemData) end end end -- -- show for index, item in ipairs(items) do local imageBG = boxes[index] if imageBG then local size = imageBG:getContentSize() -- 道具图标 local info = {index = item.Index, itemData = item, starLv = showstar} if effectshow == 2 then info.showModelEffect = true elseif effectshow == 0 then info.isShowEff = false end info.look = showtips if not info.look and global.isWinPlayMode then info.noMouseTips = true end local goodsItem = GoodsItem:create(info) imageBG:addChild(goodsItem) goodsItem:setPosition(cc.p(size.width/2, size.height/2)) goodsItem._canLooks = true goodsItem:addLookItemInfoEvent(nil, 1) goodsItem:setScaleX(itemscaleX) goodsItem:setScaleY(itemscaleY) -- link if link and string.len(link) > 0 then goodsItem:addTouchEventListener(function() if clickInterval > 0 then goodsItem:DelayTouchEnabled(clickInterval) end local selected = clone(selects) if selecttype == 0 then -- 多选 if selectAble(item) then for key, value in pairs(selected) do if item.MakeIndex == value then table.remove(selected, key) break end end else tinsert(selected, item.MakeIndex) end else -- 单选 if selectAble(item) then selected = {} else selected = {item.MakeIndex} end end local jsonData = {} jsonData.Act = link jsonData.SelectItemID = table.concat(selected, ",") callback(jsonData) end, 2) end -- 选中 if selectAble(item) then local imageS = ccui.ImageView:create() imageBG:addChild(imageS) imageS:loadTexture(global.MMO.PATH_RES_PUBLIC .. "1900000678_2.png") imageS:ignoreContentAdaptWithSize(true) imageS:setCapInsets(cc.rect(0, 0, 0, 0)) imageS:setScale9Enabled(false) imageS:setTouchEnabled(false) imageS:setAnchorPoint(cc.p(0.5,0.5)) imageS:setPosition(cc.p(size.width/2, size.height/2)) imageS:setScaleX(itemscaleX) imageS:setScaleY(itemscaleY) end if dblink and string.len(dblink) then goodsItem:addDoubleEventListener(function() local jsonData = {} jsonData.Act = dblink jsonData.SelectItemID = item.MakeIndex callback(jsonData) end) end end end return widget end function SUILoader:load_render_EQUIPITEMS(swidget, callback) local element = swidget.element local positions = element.attr.positions or "*" local select = element.attr.select or "" local count = tonumber(element.attr.count) or 12 local row = tonumber(element.attr.row) or 2 local selecttype = tonumber(element.attr.selecttype) or 0 local showstar = tonumber(element.attr.showstar) == 1 local iwidth = tonumber(element.attr.iwidth) or 70 local iheight = tonumber(element.attr.iheight) or 70 local iimg = element.attr.iimg local link = element.attr.link local effectshow = tonumber(element.attr.effectshow) or 1 -- 1只显示背包 2只显示内观 0不显示 local itemscaleX = iwidth / 70 local itemscaleY = iheight / 70 -- 装备位 local equipPositions = {} local slices = ssplit(positions, ",") for _, v in ipairs(slices) do tinsert(equipPositions, tonumber(v)) end -- 是否选中 local selects = {} local slices = ssplit(select, ",") for _, v in pairs(slices) do tinsert(selects, tonumber(v)) end local function selectAble(item) for _, v in pairs(selects) do if v == item.MakeIndex then return true end end return false end local itemWid = iwidth local itemHei = iheight local col = math.ceil(count / row) local contentSize = cc.size(col * itemWid, row * itemHei) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) -- local boxes = {} for i = 1, count do local x = ((i - 1) % col + 0.5) * itemWid local y = contentSize.height - (mfloor((i - 1) / col) + 0.5) * itemHei local iimg = (iimg and iimg ~= "") and SUIHelper.fixImageFileName(iimg) or "public/1900000664.png" local fullPath = string.format(getResFullPath("res/%s"), iimg) local imageBG = ccui.ImageView:create() widget:addChild(imageBG) imageBG:loadTexture(fullPath) GUI:Image_setScale9Slice(imageBG, 21, 22, 21, 22) GUI:setContentSize(imageBG, itemWid, itemHei) imageBG:setTouchEnabled(false) imageBG:setAnchorPoint(cc.p(0.5, 0.5)) imageBG:setPosition(cc.p(x, y)) tinsert(boxes, imageBG) end -- items local items = {} local EquipProxy = global.Facade:retrieveProxy(global.ProxyTable.Equip) if positions == "*" then local equipTypeConfig = EquipProxy:GetEquipTypeConfig() for equipPos = equipTypeConfig.Equip_Type_Dress, equipTypeConfig.Equip_Type_Shield do local equipData = EquipProxy:GetEquipDataByPos(equipPos) if equipData then tinsert(items, equipData) end end else for _, equipPos in ipairs(equipPositions) do local equipData = EquipProxy:GetEquipDataByPos(equipPos) if equipData then tinsert(items, equipData) end end end -- show for index, item in ipairs(items) do local imageBG = boxes[index] if imageBG then local size = imageBG:getContentSize() -- 道具图标 local info = {index = item.Index, itemData = item, starLv = showstar} if effectshow == 2 then info.showModelEffect = true elseif effectshow == 0 then info.isShowEff = false end local goodsItem = GoodsItem:create(info) imageBG:addChild(goodsItem) goodsItem:setPosition(cc.p(size.width/2, size.height/2)) goodsItem._canLooks = true goodsItem:addLookItemInfoEvent(nil, 1) goodsItem:setScaleX(itemscaleX) goodsItem:setScaleY(itemscaleY) -- link if link and string.len(link) > 0 then goodsItem:addTouchEventListener(function() local selected = clone(selects) if selecttype == 0 then -- 多选 if selectAble(item) then for key, value in pairs(selected) do if item.MakeIndex == value then table.remove(selected, key) break end end else tinsert(selected, item.MakeIndex) end else -- 单选 if selectAble(item) then selected = {} else selected = {item.MakeIndex} end end local jsonData = {} jsonData.Act = link jsonData.SelectItemID = table.concat(selected, ",") callback(jsonData) end, 2) end -- 选中 if selectAble(item) then local imageS = ccui.ImageView:create() imageBG:addChild(imageS) imageS:loadTexture(global.MMO.PATH_RES_PUBLIC .. "1900000678_2.png") imageS:ignoreContentAdaptWithSize(true) imageS:setCapInsets(cc.rect(0, 0, 0, 0)) imageS:setScale9Enabled(false) imageS:setTouchEnabled(false) imageS:setAnchorPoint(cc.p(0.5,0.5)) imageS:setPosition(cc.p(size.width/2, size.height/2)) imageS:setScaleX(itemscaleX) imageS:setScaleY(itemscaleY) end end end return widget end function SUILoader:load_render_TIMETIPS(swidget, callback) local element = swidget.element local size = tonumber(element.attr.size) or defaultFontSize local color = tonumber(element.attr.color) or defaultColorID local time = tonumber(element.attr.time) or 0 local outline = tonumber(element.attr.outline) or defaultOutline local outlinecolor = tonumber(element.attr.outlinecolor) or defaultOutlineC local link = element.attr.link local widget = ccui.Text:create() widget:setString("") widget:setFontSize(size) widget:setFontName(defaultFontPath) widget:setTextColor(GET_COLOR_BYID_C3B(color)) widget:enableOutline(GET_COLOR_BYID_C3B(outlinecolor), outline) local endTime = time + GetServerTime() local function scheduleCB() local remaining = math.max(endTime - GetServerTime(), 0) widget:setString(SecondToHMS(remaining, true)) if remaining <= 0 then -- link if link and string.len(link) > 0 then if callback then local jsonData = {} jsonData.Act = link callback(jsonData) end end widget:stopAllActions() end end schedule(widget, scheduleCB, 1) scheduleCB() return widget end function SUILoader:load_render_LoadingBar(swidget, callback) local element = swidget.element local size = tonumber(element.attr.size) or defaultFontSize local color = tonumber(element.attr.color) or defaultColorID local outline = tonumber(element.attr.outline) or defaultOutline local outlinecolor = tonumber(element.attr.outlinecolor) or defaultOutlineC local direction = tonumber(element.attr.direction) or 0 -- 0从左至右 1从右到左 local loadBgImg = element.attr.loadingbg or "public/bg_szjm_03_1.png" local loadBarImg = element.attr.loadingbar or "public/bg_szjm_03_2.png" local startPercent = tonumber(element.attr.startper) or 0 local interval = tonumber(element.attr.interval) or 0.05 local loadValue = tonumber(element.attr.loadvalue) or 10 local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local offsetX = element.attr.offsetX or 0 local offsetY = element.attr.offsetY or 0 local endPercent = tonumber(element.attr.endper) or 100 local imgBg = SUIHelper.fixImageFileName(loadBgImg) local imgBar = SUIHelper.fixImageFileName(loadBarImg) local fullPathBG = (imgBg and imgBg ~= "") and string.format(getResFullPath("res/%s"), imgBg) or "" local fullPathBAR = (imgBar and imgBar ~= "") and string.format(getResFullPath("res/%s"), imgBar) or "" local widget = ccui.ImageView:create() widget:ignoreContentAdaptWithSize(false) if fullPathBG and fullPathBG ~= "" and global.FileUtilCtl:isFileExist(fullPathBG) then widget:loadTexture(fullPathBG) end local LoadingBar = ccui.LoadingBar:create() if fullPathBAR and fullPathBAR ~= "" and global.FileUtilCtl:isFileExist(fullPathBAR) then LoadingBar:loadTexture(fullPathBAR) end LoadingBar:ignoreContentAdaptWithSize(false) LoadingBar:setPercent(startPercent) if direction == 1 then LoadingBar:setDirection(1) end LoadingBar:setPosition(cc.p(widget:getContentSize().width/2 + offsetX, widget:getContentSize().height/2 + offsetY)) widget:addChild(LoadingBar) local percentText = ccui.Text:create() percentText:setString(string.format(GET_STRING(1053), startPercent, 100)) percentText:setAnchorPoint(0.5, 0.5) percentText:setPosition(cc.p(widget:getContentSize().width/2, widget:getContentSize().height/2)) percentText:setFontSize(size) percentText:setFontName(defaultFontPath) percentText:setTextColor(GET_COLOR_BYID_C3B(color)) percentText:enableOutline(GET_COLOR_BYID_C3B(outlinecolor), outline) widget:addChild(percentText) LoadingBar:stopAllActions() local percent = startPercent local function scheduleCB() percent = percent + loadValue percent = math.min(percent, endPercent) LoadingBar:setPercent(percent) local curPercent = mfloor(percent/100 * 100) percentText:setString(string.format(GET_STRING(1053), curPercent, 100)) -- if percent >= endPercent then LoadingBar:stopAllActions() if link and string.len(link) > 0 then if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end end end schedule(LoadingBar, scheduleCB, interval) scheduleCB() return widget end function SUILoader:load_render_CircleBar(swidget, callback) local element = swidget.element local loadBgImg = element.attr.loadingbg or "private/sui/bg_xbzy_02.png" local loadBarImg = element.attr.loadingbar or "private/sui/bg_xbzy_03.png" local startPercent = tonumber(element.attr.startper) or 0 local endPercent = tonumber(element.attr.endper) or 100 local time = tonumber(element.attr.time) or 1 local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local offsetX = element.attr.offsetX or 0 local offsetY = element.attr.offsetY or 0 local imgBg = SUIHelper.fixImageFileName(loadBgImg) local imgBar = SUIHelper.fixImageFileName(loadBarImg) local fullPathBG = (imgBg and imgBg ~= "") and string.format(getResFullPath("res/%s"), imgBg) or "" local fullPathBAR = (imgBar and imgBar ~= "") and string.format(getResFullPath("res/%s"), imgBar) or "" local widget = ccui.ImageView:create() widget:ignoreContentAdaptWithSize(false) if fullPathBG and fullPathBG ~= "" and global.FileUtilCtl:isFileExist(fullPathBG) then widget:loadTexture(fullPathBG) end local contentSize = widget:getContentSize() if fullPathBAR and fullPathBAR ~= "" and global.FileUtilCtl:isFileExist(fullPathBAR) then local loadingBar = cc.ProgressTimer:create(cc.Sprite:create(fullPathBAR)) widget:addChild(loadingBar) loadingBar:setPosition(cc.p(contentSize.width / 2 + offsetX, contentSize.height / 2 + offsetY)) loadingBar:setPercentage(startPercent) local function loadEndCallBack() loadingBar:stopAllActions() if link and string.len(link) > 0 then if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end end loadingBar:runAction( cc.Sequence:create( cc.ProgressFromTo:create(time, startPercent, endPercent), cc.DelayTime:create(0.1), cc.CallFunc:create(loadEndCallBack) ) ) end return widget end function SUILoader:load_render_PercentImg(swidget, callback) local element = swidget.element local direction = tonumber(element.attr.direction) or 0 -- 0 从左到右 1从右到左 2从上往下 3从下往上 local loadImg = element.attr.img or "public/bg_szjm_03_2.png" local minValue = tonumber(element.attr.minValue) or 100 local maxValue = tonumber(element.attr.maxValue) or 100 local percent = mfloor( minValue/maxValue * 100) or 100 local img = SUIHelper.fixImageFileName(loadImg) local fullPath = (img and img ~= "") and string.format(getResFullPath("res/%s"), img) or "" local widget = ccui.LoadingBar:create() if fullPath and fullPath ~= "" and global.FileUtilCtl:isFileExist(fullPath) then widget:loadTexture(fullPath) end widget:ignoreContentAdaptWithSize(false) if direction == 0 or direction == 1 then widget:setPercent(percent) if direction == 1 then widget:setDirection(1) end elseif direction == 2 or direction == 3 then local barRenderer = widget:getVirtualRenderer() local barRendererTextureSize = widget:getVirtualRendererSize() local innerSprite = barRenderer:getSprite() local contentSize = widget:getContentSize() widget:setDirection(direction) if direction == 2 then barRenderer:setAnchorPoint(0, 0) barRenderer:setPosition(0, 0) else barRenderer:setAnchorPoint(0, 1) barRenderer:setPosition(0, contentSize.height) end if innerSprite then local rect = innerSprite:getTextureRect() rect.height = barRendererTextureSize.height * percent / 100 innerSprite:setTextureRect(rect, innerSprite:isTextureRectRotated(), cc.size(rect.width, rect.height)) if direction == 2 then innerSprite:setFlippedY(true) else innerSprite:setFlippedY(false) end end end -- 加入元变量组件管理 local isMateValue = false if not tonumber(element.attr.minValue) or not tonumber(element.attr.maxValue) then local metaValue = {} local content = element.attr.minValue while content and string.len(content) > 0 do local find_info = {sfind(content, "$STM%((.-)%)")} local begin_pos = find_info[1] local end_pos = find_info[2] if begin_pos and end_pos then isMateValue = true -- prefix if begin_pos ~= 1 then local substr = string.sub(content, 1, begin_pos - 1) table.insert(metaValue, substr) end -- metaValue local slices = ssplit(find_info[3], "_") table.insert(metaValue, {key = slices[1], param = slices[2]}) -- suffix content = string.sub(content, end_pos+1, string.len(content)) else table.insert(metaValue, content) content = "" end end local metaValue2 = {} local content2 = element.attr.maxValue while content2 and string.len(content2) > 0 do local find_info = {sfind(content2, "$STM%((.-)%)")} local begin_pos = find_info[1] local end_pos = find_info[2] if begin_pos and end_pos then isMateValue = true -- prefix if begin_pos ~= 1 then local substr = string.sub(content2, 1, begin_pos - 1) table.insert(metaValue2, substr) end -- metaValue local slices = ssplit(find_info[3], "_") table.insert(metaValue2, {key = slices[1], param = slices[2]}) -- suffix content2 = string.sub(content2, end_pos+1, string.len(content)) else table.insert(metaValue2, content2) content2 = "" end end if isMateValue then widget.useMetaValue = true global.Facade:sendNotification(global.NoticeTable.SUIMetaWidgetAdd, {metaValue = metaValue, metaValue2 = metaValue2, widget = widget, lifewidget = widget}) end end return widget end function SUILoader:load_render_UIModel(swidget,callback) local element = swidget.element local sex = tonumber(element.attr.sex) or 0 local scale = tonumber(element.attr.scale) or 1 local function parseEffectStr(str) if not str then return nil end return string.gsub(str, "&", "|") end local feature = {} feature.clothID = tonumber(element.attr.clothID) feature.weaponID = tonumber(element.attr.weaponID) feature.headID = tonumber(element.attr.headID) feature.headEffectID = parseEffectStr(element.attr.headEffectID) feature.weaponEffectID = parseEffectStr(element.attr.weaponEffectID) feature.clothEffectID = parseEffectStr(element.attr.clothEffectID) feature.capID = tonumber(element.attr.capID) feature.shieldID = tonumber(element.attr.shieldID) feature.shieldEffectID = parseEffectStr(element.attr.shieldEffectID) feature.tDressID = tonumber(element.attr.tDressID) feature.tDressEffectID = parseEffectStr(element.attr.tDressEffectID) feature.tWeaponID = tonumber(element.attr.tWeaponID) feature.tWeaponEffectID = parseEffectStr(element.attr.tWeaponEffectID) feature.capEffectID = parseEffectStr(element.attr.capEffectID) feature.veilID = tonumber(element.attr.veilID) feature.veilEffectID = parseEffectStr(element.attr.veilEffectID) feature.hairID = tonumber(element.attr.hairID) feature.notShowMold = element.attr.notShowMold feature.notShowHair = element.attr.notShowHair local UIModel = CreateStaticUIModel(sex, feature, scale, {ignoreStaticScale = true}) if UIModel then return UIModel end end ---- 英雄相关 function SUILoader:load_render_HEROEquipShow(swidget, callback) local element = swidget.element local index = tonumber(element.attr.index) or 0 local showtips = tonumber(element.attr.showtips) or 1 local bgtype = tonumber(element.attr.bgtype) local scale = tonumber(element.attr.scale) or 1 local grey = tonumber(element.attr.grey) or 0 local showstar = tonumber(element.attr.showstar) == 1 local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local dblink = element.attr.dblink local effectshow = tonumber(element.attr.effectshow) or 1 local contentSize = cc.size(66,66) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) local ItemMoveProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemMoveProxy) local HeroEquipProxy = global.Facade:retrieveProxy(global.ProxyTable.HeroEquipProxy) local equipData = HeroEquipProxy:GetEquipDataByPos(index) if equipData then local info = {} info.index = equipData.Index info.itemData = equipData info.look = showtips == 1 info.bgVisible = bgtype == 1 info.starLv = showstar if not info.look and global.isWinPlayMode then info.noMouseTips = true end if effectshow == 2 then info.showModelEffect = true elseif effectshow == 0 then info.isShowEff = false end info.from = ItemMoveProxy.ItemFrom.HERO_EQUIP local goodsItem = GoodsItem:create(info) widget:addChild(goodsItem) goodsItem:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) goodsItem:setScale(scale) goodsItem:setIconGrey(grey == 1) if dblink and string.len(dblink) then if not (showtips == 1) then goodsItem:addLookItemInfoEvent(nil, 2) end goodsItem:addDoubleEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = dblink jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) callback(jsonData) end end) end end if link and not dblink then local linkWidget = global.SWidgetCache:generateRender("ccui.Widget") widget:addChild(linkWidget) linkWidget:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) linkWidget:setContentSize(contentSize) linkWidget:setTouchEnabled(true) linkWidget:setSwallowTouches(false) linkWidget:addClickEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end return widget end function SUILoader:load_render_HEROEQUIPITEMS(swidget, callback) local element = swidget.element local positions = element.attr.positions or "*" local select = element.attr.select or "" local count = tonumber(element.attr.count) or 12 local row = tonumber(element.attr.row) or 2 local selecttype = tonumber(element.attr.selecttype) or 0 local showstar = tonumber(element.attr.showstar) == 1 local iwidth = tonumber(element.attr.iwidth) or 70 local iheight = tonumber(element.attr.iheight) or 70 local iimg = element.attr.iimg local link = element.attr.link local effectshow = tonumber(element.attr.effectshow) or 1 local itemscaleX = iwidth / 70 local itemscaleY = iheight / 70 -- 装备位 local equipPositions = {} local slices = ssplit(positions, ",") for _, v in ipairs(slices) do tinsert(equipPositions, tonumber(v)) end -- 是否选中 local selects = {} local slices = ssplit(select, ",") for _, v in pairs(slices) do tinsert(selects, tonumber(v)) end local function selectAble(item) for _, v in pairs(selects) do if v == item.MakeIndex then return true end end return false end local itemWid = iwidth local itemHei = iheight local col = math.ceil(count / row) local contentSize = cc.size(col * itemWid, row * itemHei) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) -- local boxes = {} for i = 1, count do local x = ((i - 1) % col + 0.5) * itemWid local y = contentSize.height - (mfloor((i - 1) / col) + 0.5) * itemHei local iimg = (iimg and iimg ~= "") and SUIHelper.fixImageFileName(iimg) or "public/1900000664.png" local fullPath = string.format(getResFullPath("res/%s"), iimg) local imageBG = ccui.ImageView:create() widget:addChild(imageBG) imageBG:loadTexture(fullPath) GUI:Image_setScale9Slice(imageBG, 21, 22, 21, 22) GUI:setContentSize(imageBG, itemWid, itemHei) imageBG:setTouchEnabled(false) imageBG:setAnchorPoint(cc.p(0.5, 0.5)) imageBG:setPosition(cc.p(x, y)) tinsert(boxes, imageBG) end -- items local items = {} local HeroEquipProxy = global.Facade:retrieveProxy(global.ProxyTable.HeroEquipProxy) if positions == "*" then local equipTypeConfig = HeroEquipProxy:GetEquipTypeConfig() for equipPos = equipTypeConfig.Equip_Type_Dress, equipTypeConfig.Equip_Type_Shield do local equipData = HeroEquipProxy:GetEquipDataByPos(equipPos) if equipData then tinsert(items, equipData) end end else for _, equipPos in ipairs(equipPositions) do local equipData = HeroEquipProxy:GetEquipDataByPos(equipPos) if equipData then tinsert(items, equipData) end end end local ItemMoveProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemMoveProxy) -- show for index, item in ipairs(items) do local imageBG = boxes[index] if imageBG then local size = imageBG:getContentSize() -- 道具图标 local info = {index = item.Index, itemData = item, starLv = showstar} if effectshow == 2 then info.showModelEffect = true elseif effectshow == 0 then info.isShowEff = false end info.from = ItemMoveProxy.ItemFrom.HERO_EQUIP local goodsItem = GoodsItem:create(info) imageBG:addChild(goodsItem) goodsItem:setPosition(cc.p(size.width/2, size.height/2)) goodsItem._canLooks = true goodsItem:addLookItemInfoEvent(nil, 1) goodsItem:setScaleX(itemscaleX) goodsItem:setScaleY(itemscaleY) -- link if link and string.len(link) > 0 then goodsItem:addTouchEventListener(function() local selected = clone(selects) if selecttype == 0 then -- 多选 if selectAble(item) then for key, value in pairs(selected) do if item.MakeIndex == value then table.remove(selected, key) break end end else tinsert(selected, item.MakeIndex) end else -- 单选 if selectAble(item) then selected = {} else selected = {item.MakeIndex} end end local jsonData = {} jsonData.Act = link jsonData.SelectItemID = table.concat(selected, ",") callback(jsonData) end, 2) end -- 选中 if selectAble(item) then local imageS = ccui.ImageView:create() imageBG:addChild(imageS) imageS:loadTexture(global.MMO.PATH_RES_PUBLIC .. "1900000678_2.png") imageS:ignoreContentAdaptWithSize(true) imageS:setCapInsets(cc.rect(0, 0, 0, 0)) imageS:setScale9Enabled(false) imageS:setTouchEnabled(false) imageS:setAnchorPoint(cc.p(0.5,0.5)) imageS:setPosition(cc.p(size.width/2, size.height/2)) imageS:setScaleX(itemscaleX) imageS:setScaleY(itemscaleY) end end end return widget end function SUILoader:load_render_HERODBItemShow(swidget, callback) local element = swidget.element local makeindex = tonumber(element.attr.makeindex) or 1 local showtips = tonumber(element.attr.showtips) or 1 local bgtype = tonumber(element.attr.bgtype) local scale = tonumber(element.attr.scale) or 1 local grey = tonumber(element.attr.grey) or 0 local showstar = tonumber(element.attr.showstar) == 1 local count = tonumber(element.attr.count) local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local dblink = element.attr.dblink local effectshow = tonumber(element.attr.effectshow) or 1 local ItemMoveProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemMoveProxy) local itemData = nil local from = nil if not itemData then local HeroEquipProxy = global.Facade:retrieveProxy(global.ProxyTable.HeroEquipProxy) itemData = HeroEquipProxy:GetEquipDataByMakeIndex(makeindex) if itemData then from = ItemMoveProxy.ItemFrom.HERO_EQUIP end end if not itemData then local HeroBagProxy = global.Facade:retrieveProxy(global.ProxyTable.HeroBagProxy) itemData = HeroBagProxy:GetItemDataByMakeIndex(makeindex) if itemData then from = ItemMoveProxy.ItemFrom.HERO_BAG end end if not itemData then local LookPlayerProxy = global.Facade:retrieveProxy(global.ProxyTable.LookPlayerProxy) itemData = LookPlayerProxy:GetLookPlayerItemDataByMakeIndex(makeindex) end local contentSize = cc.size(66,66) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) if itemData then local info = {} info.index = itemData.Index info.itemData = itemData info.look = showtips == 1 info.bgVisible = bgtype == 1 info.starLv = showstar if not info.look and global.isWinPlayMode then info.noMouseTips = true end if effectshow == 2 then info.showModelEffect = true elseif effectshow == 0 then info.isShowEff = false end info.from = from local goodsItem = GoodsItem:create(info) widget:addChild(goodsItem) goodsItem:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) goodsItem:setScale(scale) goodsItem:setIconGrey(grey == 1) if count then goodsItem:setCount(count) end if dblink and string.len(dblink) then if not (showtips == 1) then goodsItem:addLookItemInfoEvent(nil, 2) end goodsItem:addDoubleEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = dblink jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end end if link and string.len(link) > 0 and not dblink then local linkWidget = global.SWidgetCache:generateRender("ccui.Widget") widget:addChild(linkWidget) linkWidget:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) linkWidget:setContentSize(contentSize) linkWidget:setTouchEnabled(true) linkWidget:setSwallowTouches(false) linkWidget:addClickEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end return widget end function SUILoader:load_render_HEROBAGITEMS(swidget, callback) local element = swidget.element local condition = element.attr.condition or "" local exclude = element.attr.exclude or "" local select = element.attr.select or "" local count = tonumber(element.attr.count) or 12 local row = tonumber(element.attr.row) or 2 local selecttype = tonumber(element.attr.selecttype) or 0 local showstar = tonumber(element.attr.showstar) == 1 local iwidth = tonumber(element.attr.iwidth) or 70 local iheight = tonumber(element.attr.iheight) or 70 local iimg = element.attr.iimg local filter1 = element.attr.fliter1 or element.attr.filter1 or "" local filter2 = element.attr.fliter2 or element.attr.filter2 or "" local filter3 = element.attr.fliter3 or element.attr.filter3 or "" local link = element.attr.link local conditionEx = element.attr.conditionEx local conditionParam = element.attr.conditionParam local conditionOnOff = tonumber(element.attr.conditionOnOff) or 0 local condition2 = element.attr.condition2 local dblink = element.attr.dblink local effectshow = tonumber(element.attr.effectshow) or 1 local itemscaleX = iwidth / 70 local itemscaleY = iheight / 70 -- 是否满足显示条件 local conditionT = {} local slices1 = ssplit(condition, ",") local slices2 = {} for _, v in pairs(slices1) do slices2 = ssplit(v, "#") tinsert(conditionT, {StdMode = tonumber(slices2[1]), Shape = tonumber(slices2[2])}) end -- 唯一ID过滤 local excludeT = {} local slices = ssplit(exclude, ",") for _, v in pairs(slices) do tinsert(excludeT, tonumber(v)) end -- 道具ID过滤,存在不显示 local filter1T = {} local slices = ssplit(filter1, ",") for _, v in pairs(slices) do tinsert(filter1T, tonumber(v)) end -- 道具名过滤,存在不显示 local filter2T = {} local slices = ssplit(filter2, ",") for _, v in pairs(slices) do if v ~= "" then tinsert(filter2T, v) end end -- 道具ID过滤,存在才显示 local filter3T = {} local slices = ssplit(filter3, ",") for _, v in pairs(slices) do if v ~= "" then tinsert(filter3T, v) end end local function conditionAble(item) if conditionEx and tonumber(conditionEx) == 1 then local starLv = item.Star or 0 if conditionOnOff and conditionOnOff == 0 then if conditionParam and starLv < tonumber(conditionParam) then return false end elseif conditionOnOff == 1 then if conditionParam and starLv > tonumber(conditionParam) then return false end end end -- 被排除 for _, v in ipairs(excludeT) do if v == item.MakeIndex then return false end end -- 道具ID过滤 for _, v in ipairs(filter1T) do if v == item.Index then return false end end -- 道具名过滤 for _, v in ipairs(filter2T) do if v == item.Name then return false end end -- 道具ID/道具名过滤 if #filter3T > 0 then for _, v in ipairs(filter3T) do if tonumber(v) == item.Index or v == item.Name then return true end end return false end -- 筛选 if condition == "*" then return true end for _, v in pairs(conditionT) do if v.StdMode == item.StdMode and (not v.Shape or v.Shape == item.Shape) then return true end end if condition2 then if tonumber(item.sDivParam2) and tonumber(item.sDivParam2) == tonumber(condition2) then return true elseif string.find(tostring(condition2), "#") then local paramList = string.split(tostring(condition2), "#") for _, param in ipairs(paramList) do if tonumber(param) == tonumber(item.sDivParam2) then return true end end end end return false end -- 是否选中 local selects = {} local slices = ssplit(select, ",") for _, v in pairs(slices) do tinsert(selects, tonumber(v)) end local function selectAble(item) for _, v in pairs(selects) do if v == item.MakeIndex then return true end end return false end local itemWid = iwidth local itemHei = iheight local col = math.ceil(count / row) local contentSize = cc.size(col * itemWid, row * itemHei) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) -- local boxes = {} for i = 1, count do local x = ((i - 1) % col + 0.5) * itemWid local y = contentSize.height - (mfloor((i - 1) / col) + 0.5) * itemHei local iimg = (iimg and iimg ~= "") and SUIHelper.fixImageFileName(iimg) or "public/1900000664.png" local fullPath = string.format(getResFullPath("res/%s"), iimg) local imageBG = ccui.ImageView:create() widget:addChild(imageBG) imageBG:loadTexture(fullPath) GUI:Image_setScale9Slice(imageBG, 21, 22, 21, 22) GUI:setContentSize(imageBG, itemWid, itemHei) imageBG:setTouchEnabled(false) imageBG:setAnchorPoint(cc.p(0.5, 0.5)) imageBG:setPosition(cc.p(x, y)) tinsert(boxes, imageBG) end -- bag items local HeroBagProxy = global.Facade:retrieveProxy(global.ProxyTable.HeroBagProxy) local items = {} for i = 1, global.MMO.MAX_ITEM_NUMBER do local itemMakeIndex = HeroBagProxy:GetMakeIndexByBagPos(i) if itemMakeIndex then local itemData = HeroBagProxy:GetItemDataByMakeIndex(itemMakeIndex) if itemData and conditionAble(itemData) then tinsert(items, itemData) end end end -- local ItemMoveProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemMoveProxy) -- show for index, item in ipairs(items) do local imageBG = boxes[index] if imageBG then local size = imageBG:getContentSize() -- 道具图标 local info = {index = item.Index, itemData = item, starLv = showstar} if effectshow == 2 then info.showModelEffect = true elseif effectshow == 0 then info.isShowEff = false end info.from = ItemMoveProxy.ItemFrom.HERO_BAG local goodsItem = GoodsItem:create(info) imageBG:addChild(goodsItem) goodsItem:setPosition(cc.p(size.width/2, size.height/2)) goodsItem._canLooks = true goodsItem:addLookItemInfoEvent(nil, 1) goodsItem:setScaleX(itemscaleX) goodsItem:setScaleY(itemscaleY) -- link if link and string.len(link) > 0 then goodsItem:addTouchEventListener(function() local selected = clone(selects) if selecttype == 0 then -- 多选 if selectAble(item) then for key, value in pairs(selected) do if item.MakeIndex == value then table.remove(selected, key) break end end else tinsert(selected, item.MakeIndex) end else -- 单选 if selectAble(item) then selected = {} else selected = {item.MakeIndex} end end local jsonData = {} jsonData.Act = link jsonData.SelectItemID = table.concat(selected, ",") callback(jsonData) end, 2) end -- 选中 if selectAble(item) then local imageS = ccui.ImageView:create() imageBG:addChild(imageS) imageS:loadTexture(global.MMO.PATH_RES_PUBLIC .. "1900000678_2.png") imageS:ignoreContentAdaptWithSize(true) imageS:setCapInsets(cc.rect(0, 0, 0, 0)) imageS:setScale9Enabled(false) imageS:setTouchEnabled(false) imageS:setAnchorPoint(cc.p(0.5,0.5)) imageS:setPosition(cc.p(size.width/2, size.height/2)) imageS:setScaleX(itemscaleX) imageS:setScaleY(itemscaleY) end if dblink and string.len(dblink) then goodsItem:addDoubleEventListener(function() local jsonData = {} jsonData.Act = dblink jsonData.SelectItemID = item.MakeIndex callback(jsonData) end) end end end return widget end --- function SUILoader:load_render_QuickTextView(swidget, callback) local element = swidget.element local text = element.attr.text or "" local size = tonumber(element.attr.size) or defaultFontSize local color = element.attr.color or defaultColorID local outline = tonumber(element.attr.outline) or defaultOutline local outlinecolor = tonumber(element.attr.outlinecolor) or defaultOutlineC local direction = tonumber(element.attr.direction) or 1 local bounce = tonumber(element.attr.bounce) or 1 local margin = tonumber(element.attr.margin) or 0 local width = tonumber(element.attr.width) or 800 local height = tonumber(element.attr.height) or global.Director:getVisibleSize().height local count = tonumber(element.attr.count) or 1 local function createText( str ) local item = global.SWidgetCache:generateRender("ccui.Text") item:setScale(1) item:setString(str) item:setFontSize(size) item:setFontName(defaultFontPath) item:setTextColor(GET_COLOR_BYID_C3B(color)) item:setTouchEnabled(false) item:stopAllActions() item:disableEffect(1) item:disableEffect(6) item:getVirtualRenderer():setMaxLineWidth(0) item:enableOutline(GET_COLOR_BYID_C3B(outlinecolor), outline) return item end local function createItem(loadText, wid, hei) local panel = global.SWidgetCache:generateRender("ccui.Layout") panel:setClippingEnabled(true) panel:setContentSize(cc.size(wid, hei)) for i = 1, count do if loadText and next(loadText) and loadText[i] then local str = loadText[i] local item = global.SWidgetCache:generateRender("ccui.Text") item:setScale(1) item:setString(str) item:setFontSize(size) item:setFontName(global.MMO.PATH_FONT) item:setTextColor(GET_COLOR_BYID_C3B(color)) item:setTouchEnabled(false) item:stopAllActions() item:disableEffect(1) item:disableEffect(6) item:getVirtualRenderer():setMaxLineWidth(0) item:enableOutline(GET_COLOR_BYID_C3B(outlinecolor), outline) item:setAnchorPoint(cc.p(0,0)) item:setPosition(cc.p(wid/count*(i-1), 0)) panel:addChild(item) end end return panel end local widget = global.SWidgetCache:generateRender("ccui.ListView") widget:ignoreContentAdaptWithSize(false) widget:setClippingEnabled(true) widget:setClippingType(0) widget:setTouchEnabled(true) widget:setDirection(direction) widget:setGravity(0) widget:setItemsMargin(margin) widget:setBounceEnabled(bounce == 1) widget:setBackGroundColorType(0) widget:stopAllActions() local textList = string.split(text, "\\") local itemHei = 10 if textList and textList[1] then itemHei = createText(textList[1]):getContentSize().height end local screenHeight = height-- global.Director:getVisibleSize().height local limitSize = math.ceil(screenHeight/itemHei) local loadText = clone(textList) local loadNum = 0 local function loadItem( ... ) local lastIndex = #widget:getItems() - 1 while next(loadText) and loadNum < limitSize do loadNum = loadNum + 1 local cell_data = {} cell_data.wid = width cell_data.hei = itemHei local strList = {} for i = 1, count do if loadText and next(loadText) then table.insert( strList, table.remove( loadText,1 )) end end cell_data.createCell = function () local cell = createItem(strList, cell_data.wid, cell_data.hei) return cell end local quickCell = QuickCell:Create(cell_data) widget:pushBackCustomItem(quickCell) end if lastIndex >= 0 then widget:jumpToItem(lastIndex, cc.p(0, 0), cc.p(0, 0)) end end loadItem() local loadForce = true widget:addScrollViewEventListener(function(sender, eventType) local itemNum = #sender:getItems() local BottomItem = sender:getBottommostItemInCurrentView() local innerPos = widget:getInnerContainerPosition() if (eventType == 1 or ((eventType == 10 or eventType == 9) and innerPos.y == 0)) and next(loadText) then loadNum = 0 if loadForce then loadForce = false PerformWithDelayGlobal( function() loadForce = true end, 0.5 ) loadItem() end end end) widget:addMouseScrollPercent() return widget end function SUILoader:load_render_RTextX(swidget, callback) local element = swidget.element local text = element.attr.text or "" local size = tonumber(element.attr.size) or defaultFontSize local color = tonumber(element.attr.color) or defaultColorID local width = tonumber(element.attr.width) or 1136 local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local outline = tonumber(element.attr.outline) or defaultOutline local outlinecolor = tonumber(element.attr.outlinecolor) or defaultOutlineC local scrollWidth = tonumber(element.attr.scrollWidth) local scrollWay = tonumber(element.attr.scrollWay) or 0 -- 0 从右到左 1 从下到上 local scrollTime = tonumber(element.attr.scrollTime) or 4 local scrollHeight = tonumber(element.attr.scrollHeight) local function textCB(str) if callback then local jsonData = {} jsonData.Act = str callback(jsonData) end end local ttfConfig = { outlineSize = outline, outlineColor = GET_COLOR_BYID_C3B(outlinecolor) } local SUI_RTEXT_FONT_PATH = SL:GetMetaValue("WINPLAYMODE") and SL:GetMetaValue("GAME_DATA","SUI_RTEXT_FONT_PATH") or nil local fontPath = SUI_RTEXT_FONT_PATH or defaultFontPath local widget = RichTextHelp:CreateRichTextWithXML(text, width, size, GET_COLOR_BYID(color), fontPath, textCB, SL:GetMetaValue("GAME_DATA","DEFAULT_VSPACE")) self:addMouseOverTips(widget, element) -- auto scroll if scrollWidth then local widgetSize = widget:getContentSize() local scrollH = scrollHeight or widgetSize.height local scrollLayout = global.SWidgetCache:generateRender("ccui.Layout") scrollLayout:setClippingEnabled(true) scrollLayout:setClippingType(0) scrollLayout:setContentSize(cc.size(scrollWidth, scrollH)) scrollLayout:addChild(widget) widget:setAnchorPoint(cc.p(0, 0)) widget:setPosition(cc.p(0, 0)) if scrollWay == 0 then widget:runAction(cc.RepeatForever:create(cc.Sequence:create( cc.MoveBy:create(scrollTime, cc.p(-widgetSize.width, 0)), cc.MoveBy:create(0, cc.p(widgetSize.width, 0))) )) elseif scrollWay == 1 then widget:setAnchorPoint(cc.p(0, 1)) widget:setPosition(cc.p(0, scrollH)) widget:runAction(cc.RepeatForever:create(cc.Sequence:create( cc.MoveBy:create(scrollTime, cc.p(0, widgetSize.height)), cc.MoveBy:create(0, cc.p(0, -widgetSize.height)) ))) end return scrollLayout end return widget end function SUILoader:load_render_DLINKITEMS(swidget, callback) local element = swidget.element local condition = element.attr.condition or "" local exclude = element.attr.exclude or "" local select = element.attr.select or "" local count = tonumber(element.attr.count) or 12 local row = tonumber(element.attr.row) or 2 local selecttype = tonumber(element.attr.selecttype) or 0 local showstar = tonumber(element.attr.showstar) == 1 local iwidth = tonumber(element.attr.iwidth) or 70 local iheight = tonumber(element.attr.iheight) or 70 local iimg = element.attr.iimg local filter1 = element.attr.fliter1 or element.attr.filter1 or "" local filter2 = element.attr.fliter2 or element.attr.filter2 or "" local filter3 = element.attr.fliter3 or element.attr.filter3 or "" local link = element.attr.link local conditionEx = element.attr.conditionEx local conditionParam = element.attr.conditionParam local conditionOnOff = tonumber(element.attr.conditionOnOff) or 0 local itemscaleX = iwidth / 70 local itemscaleY = iheight / 70 -- 是否满足显示条件 local conditionT = {} local slices1 = ssplit(condition, ",") local slices2 = {} for _, v in pairs(slices1) do slices2 = ssplit(v, "#") tinsert(conditionT, {StdMode = tonumber(slices2[1]), Shape = tonumber(slices2[2])}) end -- 唯一ID过滤 local excludeT = {} local slices = ssplit(exclude, ",") for _, v in pairs(slices) do tinsert(excludeT, tonumber(v)) end -- 道具ID过滤,存在不显示 local filter1T = {} local slices = ssplit(filter1, ",") for _, v in pairs(slices) do tinsert(filter1T, tonumber(v)) end -- 道具名过滤,存在不显示 local filter2T = {} local slices = ssplit(filter2, ",") for _, v in pairs(slices) do if v ~= "" then tinsert(filter2T, v) end end -- 道具ID过滤,存在才显示 local filter3T = {} local slices = ssplit(filter3, ",") for _, v in pairs(slices) do if v ~= "" then tinsert(filter3T, v) end end local function conditionAble(item) if conditionEx and tonumber(conditionEx) == 1 then local starLv = item.Star or 0 if conditionOnOff and conditionOnOff == 0 then if conditionParam and starLv < tonumber(conditionParam) then return false end elseif conditionOnOff == 1 then if conditionParam and starLv > tonumber(conditionParam) then return false end end end -- 被排除 for _, v in ipairs(excludeT) do if v == item.MakeIndex then return false end end -- 道具ID过滤 for _, v in ipairs(filter1T) do if v == item.Index then return false end end -- 道具名过滤 for _, v in ipairs(filter2T) do if v == item.Name then return false end end -- 道具ID/道具名过滤 if #filter3T > 0 then for _, v in ipairs(filter3T) do if tonumber(v) == item.Index or v == item.Name then return true end end return false end -- 筛选 if condition == "*" then return true end for _, v in pairs(conditionT) do if v.StdMode == item.StdMode and (not v.Shape or v.Shape == item.Shape) then return true end end return false end local itemWid = iwidth local itemHei = iheight local col = math.ceil(count / row) local contentSize = cc.size(col * itemWid, row * itemHei) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) -- local boxes = {} for i = 1, count do local x = ((i - 1) % col + 0.5) * itemWid local y = contentSize.height - (mfloor((i - 1) / col) + 0.5) * itemHei local iimg = (iimg and iimg ~= "") and SUIHelper.fixImageFileName(iimg) or "public/1900000664.png" local fullPath = string.format(getResFullPath("res/%s"), iimg) local imageBG = ccui.ImageView:create() widget:addChild(imageBG) imageBG:loadTexture(fullPath) GUI:Image_setScale9Slice(imageBG, 21, 22, 21, 22) GUI:setContentSize(imageBG, itemWid, itemHei) imageBG:setTouchEnabled(false) imageBG:setAnchorPoint(cc.p(0.5, 0.5)) imageBG:setPosition(cc.p(x, y)) tinsert(boxes, imageBG) end -- bag items local BagProxy = global.Facade:retrieveProxy(global.ProxyTable.Bag) local items = {} local BagMaxNum = BagProxy:GetMaxBag() for i = 1, BagMaxNum do local itemMakeIndex = BagProxy:GetMakeIndexByBagPos(i) if itemMakeIndex then local itemData = BagProxy:GetItemDataByMakeIndex(itemMakeIndex) if itemData and conditionAble(itemData) then tinsert(items, itemData) end end end -- -- show for index, item in ipairs(items) do local imageBG = boxes[index] if imageBG then local size = imageBG:getContentSize() -- 道具图标 local goodsItem = GoodsItem:create({index = item.Index, itemData = item, starLv = showstar,look = true}) imageBG:addChild(goodsItem) goodsItem:setPosition(cc.p(size.width/2, size.height/2)) goodsItem:setScaleX(itemscaleX) goodsItem:setScaleY(itemscaleY) -- link if link and string.len(link) > 0 then goodsItem:addDoubleEventListener(function() local jsonData = {} jsonData.Act = link jsonData.SelectItemID = item.MakeIndex callback(jsonData) end) end end end return widget end function SUILoader:load_render_MKItemShow(swidget, callback) local element = swidget.element local makeindex = tonumber(element.attr.makeindex) or 1 local showtips = tonumber(element.attr.showtips) or 1 local bgtype = tonumber(element.attr.bgtype) local scale = tonumber(element.attr.scale) or 1 local grey = tonumber(element.attr.grey) or 0 local showstar = tonumber(element.attr.showstar) == 1 local count = tonumber(element.attr.count) local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local canmove = tonumber(element.attr.canmove) or 0 local effectshow = tonumber(element.attr.effectshow) or 1 -- 1只显示背包 2只显示内观 0不显示 local itemData = nil if not itemData then local PetsEquipProxy = global.Facade:retrieveProxy(global.ProxyTable.PetsEquipProxy) itemData = PetsEquipProxy:GetEquipDataByMakeIndex(makeindex) end -- 人物 if not itemData then local EquipProxy = global.Facade:retrieveProxy(global.ProxyTable.Equip) itemData = EquipProxy:GetEquipDataByMakeIndex(makeindex) end if not itemData then local BagProxy = global.Facade:retrieveProxy(global.ProxyTable.Bag) itemData = BagProxy:GetItemDataByMakeIndex(makeindex) end -- 英雄 if not itemData then local HeroEquipProxy = global.Facade:retrieveProxy(global.ProxyTable.HeroEquipProxy) itemData = HeroEquipProxy:GetEquipDataByMakeIndex(makeindex) end if not itemData then local HeroBagProxy = global.Facade:retrieveProxy(global.ProxyTable.HeroBagProxy) itemData = HeroBagProxy:GetItemDataByMakeIndex(makeindex) end local ItemMoveProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemMoveProxy) local contentSize = cc.size(66,66) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) if itemData then local info = {} info.index = itemData.Index info.itemData = itemData -- info.look = showtips == 1 info.bgVisible = bgtype == 1 info.starLv = showstar info.from = ItemMoveProxy.ItemFrom.PETS_EQUIP info.movable = false if effectshow == 2 then info.showModelEffect = true elseif effectshow == 0 then info.isShowEff = false end local goodsItem = GoodsItem:create(info) widget:addChild(goodsItem) goodsItem:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) goodsItem:setScale(scale) goodsItem:setIconGrey(grey == 1) if count then goodsItem:setCount(count) end local function linkFunc() if link and string.len(link) > 0 then local jsonData = {} jsonData.Act = link jsonData.SelectItemID = itemData.MakeIndex if callback then callback(jsonData) end end end local itemMoveState = { begin = 1, moving = 2, end_move = 3, } local function SetGoodItemState(state, movePos) if not itemData then return end if itemMoveState.begin == state then if widget and not tolua.isnull(widget) then widget._movingState = true widget:setVisible(false) end global.Facade:sendNotification(global.NoticeTable.Layer_ItemTips_Close) global.Facade:sendNotification(global.NoticeTable.Layer_Moved_Begin,{ pos = movePos, itemData = itemData, linkFunc = linkFunc, cancelCallBack = function() if widget and not tolua.isnull(widget) then widget._movingState = false widget:setVisible(true) end end, from = ItemMoveProxy.ItemFrom.PETS_EQUIP }) elseif itemMoveState.moving == state then elseif itemMoveState.end_move == state then global.Facade:sendNotification(global.NoticeTable.Layer_Moved_End, movePos) end end local function doubleEventCallBack() local ItemMoveProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemMoveProxy) local itemMoving = ItemMoveProxy:GetMovingItemState() if itemMoving then --在道具移动中 return end if itemData then linkFunc() end end local function clickEventCallBack(widget, eventtype) if tolua.isnull(widget) then return end local ItemMoveProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemMoveProxy) if not itemData or widget._movingState then return end local panelPos = widget:getWorldPosition() if global.isWinPlayMode and canmove == 1 then SetGoodItemState(itemMoveState.begin, panelPos) else if showtips == 1 then local data = {} data.itemData = itemData data.pos = panelPos data.from = ItemMoveProxy.ItemFrom.PETS_EQUIP global.Facade:sendNotification(global.NoticeTable.Layer_ItemTips_Open, data) end end end local pressEventCallBack = clickEventCallBack local isEventPress = false local isMoved = true local hasEventCallOnTouchBegin = false --只有在响应了touchbegin 时才会去响应延时方法 因为在延时后 鼠标事件的 状态已经被置掉 local isMobile = not global.isWinPlayMode local function delayCallback() isEventPress = true if pressEventCallBack then if not pressEventCallBack then return false end if not isMoved then pressEventCallBack() return false end local movedPos = widget:getTouchMovePosition() local beganPos = widget:getTouchBeganPosition() local diff = cc.pSub(movedPos, beganPos) local distSq = cc.pLengthSQ(diff) if distSq <= 100 then pressEventCallBack() end end end local function touchEvent( touch, eventType ) if global.OperatingMode == global.MMO.OPERATING_MODE_WINDOWS then local ItemMoveProxy = global.Facade:retrieveProxy(global.ProxyTable.ItemMoveProxy) local itemMoving = ItemMoveProxy:GetMovingItemState() if itemMoving then --在道具移动中 return end end if eventType == 0 then isEventPress = false isMoved = false hasEventCallOnTouchBegin = true if pressEventCallBack then performWithDelay(widget, delayCallback, global.MMO.CLICK_DOUBLE_TIME) end elseif eventType == 1 then local movedPos = widget:getTouchMovePosition() local beganPos = widget:getTouchBeganPosition() local diff = cc.pSub(movedPos, beganPos) local distSq = cc.pLengthSQ(diff) if not isMoved and distSq > 100 then isMoved = true if isMobile and canmove == 1 then local beginMovePos = widget:getWorldPosition() SetGoodItemState(itemMoveState.begin, beginMovePos) end end if isMobile then local movedPos = widget:getTouchMovePosition() global.Facade:sendNotification(global.NoticeTable.Layer_Moved_Moving,{pos = movedPos}) end elseif eventType == 2 then widget:stopAllActions() if not isMoved then if not isEventPress then -- 判断是否有双击事件 if doubleEventCallBack then -- 记录上一次点击时间 if not widget._lastClickTime then widget._lastClickTime = true -- 记录单击触发 -- 记录进入此处时的状态,避免在延时操作后状态被改变 local stateOnbegin = hasEventCallOnTouchBegin widget._clickDelayHandler = PerformWithDelayGlobal( function() if clickEventCallBack and stateOnbegin then clickEventCallBack(widget, eventType) end widget._lastClickTime = nil end, global.MMO.CLICK_DOUBLE_TIME ) else if widget._clickDelayHandler then UnSchedule(widget._clickDelayHandler) widget._clickDelayHandler = nil end if doubleEventCallBack then doubleEventCallBack() end widget._lastClickTime = nil end else if clickEventCallBack then clickEventCallBack(widget, eventType) end end end else if isMobile and canmove == 1 then local endPos = widget:getTouchEndPosition() SetGoodItemState(itemMoveState.end_move, endPos) end end hasEventCallOnTouchBegin = false elseif eventType == 3 then if isMobile and canmove == 1 then local endPos = widget:getTouchEndPosition() SetGoodItemState(itemMoveState.end_move, endPos) end hasEventCallOnTouchBegin = false end end widget:setTouchEnabled(true) widget:addTouchEventListener( touchEvent ) end return widget end function SUILoader:load_render_PETEQUIPSHOW(swidget, callback) local element = swidget.element local index = tonumber(element.attr.index) or 0 local showtips = tonumber(element.attr.showtips) or 1 local bgtype = tonumber(element.attr.bgtype) local scale = tonumber(element.attr.scale) or 1 local grey = tonumber(element.attr.grey) or 0 local showstar = tonumber(element.attr.showstar) == 1 local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local dblink = element.attr.dblink local contentSize = cc.size(66,66) local widget = global.SWidgetCache:generateRender("ccui.Widget") widget:setContentSize(contentSize) local PetsEquipProxy = global.Facade:retrieveProxy(global.ProxyTable.PetsEquipProxy) local curSelectPetIdx = PetsEquipProxy:GetSelectPetIdx() local equipData = PetsEquipProxy:GetEquipDataByPos(curSelectPetIdx, index) if equipData then local info = {} info.index = equipData.Index info.itemData = equipData info.look = showtips == 1 info.bgVisible = bgtype == 1 info.starLv = showstar if not info.look and global.isWinPlayMode then info.noMouseTips = true end local goodsItem = GoodsItem:create(info) widget:addChild(goodsItem) goodsItem:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) goodsItem:setScale(scale) goodsItem:setIconGrey(grey == 1) if dblink and string.len(dblink) then if not (showtips == 1) then goodsItem:addLookItemInfoEvent(nil, 2) end goodsItem:addDoubleEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = dblink jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end end if link and not dblink then local linkWidget = global.SWidgetCache:generateRender("ccui.Widget") widget:addChild(linkWidget) linkWidget:setPosition(cc.p(contentSize.width/2, contentSize.height/2)) linkWidget:setContentSize(contentSize) linkWidget:setTouchEnabled(true) linkWidget:setSwallowTouches(false) linkWidget:addClickEventListener(function() if callback then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end) end return widget end function SUILoader:load_render_PageView(swidget, callback) local element = swidget.element local width = element.attr.width or 200 local height = element.attr.height or 200 local color = tonumber(element.attr.color) -- local direction = tonumber(element.attr.direction) or 2 local default = tonumber(element.attr.default) local cantouch = tonumber(element.attr.cantouch) or 1 local widget = ccui.PageView:create() widget:ignoreContentAdaptWithSize(false) widget:setClippingEnabled(true) widget:setClippingType(0) widget:setTouchEnabled(true) -- widget:setDirection(direction) widget:setBackGroundColorType(0) widget:stopAllActions() if DEBUG_MODE then widget:setBackGroundColorType(1) widget:setBackGroundColorOpacity(100) widget:setBackGroundColor(cc.Color3B.GREEN) end -- color if color then widget:setBackGroundColorType(1) widget:setBackGroundColorOpacity(255) widget:setBackGroundColor(GET_COLOR_BYID_C3B(color)) end -- default if default then -- default local function callback() default = default - 1 local index = math.max(default, 0) widget:setCurrentPageIndex(index) widget:doLayout() end performWithDelay(widget, callback, 1/60) end if cantouch == 0 then widget:setTouchEnabled(false) end return widget end function SUILoader:load_render_Slider(swidget, callback) local element = swidget.element local sliderid = element.attr.sliderid local ballPath = element.attr.ballimg or "public/bg_szjm_02_1.png" local barPath = element.attr.barimg or "public/bg_szjm_02.png" local bgPath = element.attr.bgimg or "public/bg_szjm_01.png" local default = tonumber(element.attr.defvalue) or 0 local maxValue = tonumber(element.attr.maxvalue) or 100 local link = element.attr.link local SUIComponentProxy = global.Facade:retrieveProxy(global.ProxyTable.SUIComponentProxy) local defaultPer = mfloor(default) ballPath = SUIHelper.fixImageFileName(ballPath) barPath = SUIHelper.fixImageFileName(barPath) bgPath = SUIHelper.fixImageFileName(bgPath) local widget = ccui.Slider:create() widget:loadBarTexture(string.format(getResFullPath("res/%s"), bgPath), 0) widget:loadProgressBarTexture(string.format(getResFullPath("res/%s"), barPath), 0) widget:loadSlidBallTextureNormal(string.format(getResFullPath("res/%s"), ballPath), 0) widget:ignoreContentAdaptWithSize(false) widget:setTouchEnabled(true) widget:setMaxPercent(maxValue) widget:setPercent(defaultPer) widget:addEventListener(function(_, eventType) if eventType == 0 then local per = widget:getPercent() local curValue = mfloor(per) if self._sliderWidgets[sliderid] then self._sliderWidgets[sliderid].value = curValue end SUIComponentProxy:SetSUISliderValueById(sliderid, curValue) global.Facade:sendNotification(global.NoticeTable.SUISlider_Value_Change) elseif eventType == 2 then if callback then local sliderTable = self:getSliderTableByID(sliderid) local jsonData = {} jsonData.Act = link jsonData.Slider = (#sliderTable > 0 and sliderTable or nil) callback(jsonData) end end end) if sliderid and self._sliderWidgets then self._sliderWidgets[sliderid] = { widget = widget, value = default } SUIComponentProxy:SetSUISliderValueById(sliderid, default) global.Facade:sendNotification(global.NoticeTable.SUISlider_Value_Change) end return widget end local function fixPosition(p) if not p then return nil end if tonumber(p) then return mfloor(p) end return cc.p(mfloor(p.x), mfloor(p.y)) end function SUILoader:load_render_MenuItem(swidget, callback) local element = swidget.element local menuid = element.attr.menuid local imgPath = element.attr.img or "public/1900000668.png" local arrowPath = element.attr.arrowimg or "public/btn_szjm_01.png" local listPath = element.attr.listimg or "public/1900000677.png" local itemname = element.attr.itemname local select = element.attr.select or "" local selectimg = element.attr.selectimg or "public/1900000678.png" local direction = tonumber(element.attr.direction) or 0 -- 默认0下拉 1上拉 local width = tonumber(element.attr.width) local height = tonumber(element.attr.height) local itemHei = tonumber(element.attr.itemhei) or 16 local fontSize = tonumber(element.attr.fontsize) or 14 local fontColor = tonumber(element.attr.fontcolor) or 255 local selectColor = tonumber(element.attr.selectcolor) local maxHei = tonumber(element.attr.maxhei) local link = element.attr.link local itemList = {} if itemname and string.len(itemname) > 0 then itemList = string.split(itemname, "#") end local selectPath = string.format(getResFullPath("res/%s"), SUIHelper.fixImageFileName(selectimg)) imgPath = string.format(getResFullPath("res/%s"), SUIHelper.fixImageFileName(imgPath)) arrowPath = string.format(getResFullPath("res/%s"), SUIHelper.fixImageFileName(arrowPath)) listPath = string.format(getResFullPath("res/%s"), SUIHelper.fixImageFileName(listPath)) -- 默认显示选项 local widget = ccui.ImageView:create() widget:loadTexture(imgPath) widget:ignoreContentAdaptWithSize(false) if not width then width = widget:getVirtualRendererSize().width end if not height then height = widget:getVirtualRendererSize().height end widget:setContentSize(cc.size(width, height)) local arrow = ccui.ImageView:create() arrow:loadTexture(arrowPath) arrow:setAnchorPoint(cc.p(1, 0.5)) arrow:setPosition(fixPosition(cc.p(width - 6, height / 2))) arrow:setFlippedY(direction == 0) arrow:addTo(widget) local showText = ccui.Text:create() showText:setAnchorPoint(cc.p(0.5, 0.5)) showText:setPosition(fixPosition(cc.p(width / 2, height / 2))) showText:setFontName(global.MMO.PATH_FONT) showText:setFontSize(fontSize) showText:setTextColor(GET_COLOR_BYID_C3B(fontColor)) showText:setString(select) showText:addTo(widget) if not next(itemList) then return widget end local menuListView = nil local itemCells = {} local isOpen = false local function onRefreshSelect() for _, cell in ipairs(itemCells) do local titleText = cell.title local selectImg = cell.selectImg if titleText and selectImg then local name = titleText:getString() if select and name == select then selectImg:setVisible(true) if selectColor then titleText:setTextColor(GET_COLOR_BYID_C3B(selectColor)) end else selectImg:setVisible(false) titleText:setTextColor(GET_COLOR_BYID_C3B(fontColor)) end end end showText:setString(select) arrow:setFlippedY(direction == 0) if widget:getChildByTag(777) then widget:removeChildByTag(777) isOpen = false end end local function showItemList() isOpen = not isOpen if widget:getChildByTag(777) then widget:removeChildByTag(777) end if not isOpen then arrow:setFlippedY(direction == 0) return end arrow:setFlippedY(direction ~= 0) local num = #itemList local menuListBg = ccui.ImageView:create() menuListBg:loadTexture(listPath) menuListBg:ignoreContentAdaptWithSize(false) menuListBg:setScale9Enabled(true) menuListBg:setCapInsets({x = 21, y = 33, width = 23, height = 34}) local aPoint = direction == 0 and cc.p(0, 1) or cc.p(0, 0) menuListBg:setAnchorPoint(aPoint) local posX = width * (0 - widget:getAnchorPoint().x) local posY = direction == 0 and height * (0 - widget:getAnchorPoint().y) or height * (1 - widget:getAnchorPoint().y) local posY = direction == 0 and 0 or height menuListBg:setPosition(fixPosition(cc.p(0, posY))) menuListBg:setTag(777) widget:addChild(menuListBg) menuListView = ccui.ListView:create() menuListBg:addChild(menuListView) menuListView:setPosition(fixPosition(cc.p(width/2, 3))) menuListView:setAnchorPoint(cc.p(0.5, 0)) menuListView:setContentSize(cc.size(width, 0)) menuListView:setClippingEnabled(true) menuListView:setClippingType(0) menuListView:setTouchEnabled(true) menuListView:setDirection(1) for id, name in ipairs(itemList) do if string.len(name) > 0 then local channel_cell = ccui.Layout:create() channel_cell:setContentSize(cc.size(width, itemHei)) local selectImg = ccui.ImageView:create() selectImg:setPosition(fixPosition(cc.p(width/2, itemHei/2))) selectImg:loadTexture(selectPath) selectImg:ignoreContentAdaptWithSize(false) selectImg:setContentSize(cc.size(width, itemHei)) selectImg:addTo(channel_cell) local titleText = ccui.Text:create() titleText:setAnchorPoint(cc.p(0.5, 0.5)) titleText:setPosition(fixPosition(cc.p(width/2, itemHei/2))) titleText:setFontName(global.MMO.PATH_FONT) titleText:setFontSize(fontSize) titleText:setString(name) titleText:addTo(channel_cell) if select and name == select then selectImg:setVisible(true) if selectColor then titleText:setTextColor(GET_COLOR_BYID_C3B(selectColor)) end else selectImg:setVisible(false) titleText:setTextColor(GET_COLOR_BYID_C3B(fontColor)) end channel_cell:setTouchEnabled(true) channel_cell:addClickEventListener(function() select = name onRefreshSelect() if callback then local menuTable = self:getMenuItemTableByID(menuid) local jsonData = {} jsonData.Act = link jsonData.MenuItem = (#menuTable > 0 and menuTable or nil) callback(jsonData) end end) menuListView:pushBackCustomItem(channel_cell) itemCells[id] = {cell = channel_cell, title = titleText, selectImg = selectImg} end end local count = #menuListView:getChildren() local listWid = menuListView:getContentSize().width local rHei = count * itemHei local listHei = maxHei and math.min(rHei, maxHei) or rHei menuListView:setContentSize(cc.size(listWid, listHei)) menuListBg:setContentSize(cc.size(listWid + 4, listHei + 6)) end widget:setTouchEnabled(true) widget:addClickEventListener(function () DelayTouchEnabled(widget) showItemList() end) if menuid and self._menuItemWidgets then self._menuItemWidgets[menuid] = { widget = showText, value = select } end return widget end function SUILoader:load_render_ScrapePic(swidget, callback) local element = swidget.element local showImg = element.attr.showimg -- 展示图片 local maskImg = element.attr.maskimg or "public/mask_1.png" -- 遮罩图片 local clearHei = element.attr.clearhei -- 刮除高度 local moveTime = tonumber(element.attr.movetime) or 5 -- 移动时间 local beginTime = tonumber(element.attr.begintime) -- 开始按下时间 local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local widget = global.SWidgetCache:generateRender("ccui.Layout") widget:setBackGroundColorType(0) widget:setTouchEnabled(false) local path = SUIHelper.fixImageFileName(showImg) local img = nil local fullPath = (path and path ~= "") and string.format(getResFullPath("res/%s"), path) or "" if not fullPath or fullPath == "" or not global.FileUtilCtl:isFileExist(fullPath) then img = global.SWidgetCache:generateEmptyImageRender("ccui.ImageView") else img = global.SWidgetCache:generateRender("ccui.ImageView") end img:loadTexture(fullPath) img:ignoreContentAdaptWithSize(false) img:setContentSize(img:getVirtualRendererSize()) widget:addChild(img) local imgSize = img:getContentSize() widget:setContentSize(imgSize) img:setAnchorPoint(cc.p(0.5, 0.5)) img:setPosition(cc.p(fixPosition(imgSize.width / 2), fixPosition(imgSize.height / 2))) if imgSize.width == 0 or imgSize.height == 0 then return widget end local radius = clearHei and mfloor(clearHei / 2) or 8 local drawNode = cc.DrawNode:create() widget:addChild(drawNode) drawNode:retain() drawNode:drawSolidCircle(cc.p(0, 0), radius, 0, radius, 1, 1, cc.c4b(0, 0, 0, 0)) drawNode:setVisible(false) local renderTexture = cc.RenderTexture:create(imgSize.width, imgSize.height) widget:addChild(renderTexture, 10) renderTexture:retain() renderTexture:setPosition(cc.p(fixPosition(imgSize.width / 2), fixPosition(imgSize.height / 2))) local mask = nil local path = SUIHelper.fixImageFileName(maskImg) local fullPath = (path and path ~= "") and string.format(getResFullPath("res/%s"), path) if not fullPath or fullPath == "" or not global.FileUtilCtl:isFileExist(fullPath) then mask = global.SWidgetCache:generateEmptyImageRender("ccui.ImageView") else mask = global.SWidgetCache:generateRender("ccui.ImageView") end mask:loadTexture(fullPath) mask:ignoreContentAdaptWithSize(false) mask:setContentSize(imgSize) mask:setAnchorPoint(cc.p(0.5, 0.5)) mask:setPosition(cc.p(fixPosition(imgSize.width / 2), fixPosition(imgSize.height / 2))) renderTexture:begin() mask:visit() renderTexture:endToLua() local lastMovePos = nil local moveBT = nil local iMoveTime = 0 local iBeginAct = nil local releaseCount = 0 local touchPosList = {} local function timeCB() if releaseCount == 0 then releaseCount = releaseCount + 1 if drawNode then drawNode:removeFromParent() drawNode:autorelease() drawNode = nil end if renderTexture then renderTexture:removeFromParent() renderTexture:autorelease() renderTexture = nil end if callback and link and string.len(link) > 0 then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end end end local function getKey(x, y) return x * 10000 + y end local function addTouchPoint(x, y) local key = getKey(x, y) if touchPosList[key] then return end if x <= 0 or x >= imgSize.width then return end if y <= 0 or y >= imgSize.height then return end if not touchPosList[key] then touchPosList[key] = true end end widget:setTouchEnabled(true) widget:addTouchEventListener(function (node, eventType) if eventType == 0 then lastMovePos = nil moveBT = os.clock() if tonumber(beginTime) and not iBeginAct then iBeginAct = performWithDelay(widget, function() timeCB() end, tonumber(beginTime)) end elseif eventType == 1 then if releaseCount > 0 then return end local movedPos = node:getTouchMovePosition() local tt = GUI:convertToNodeSpace(widget, movedPos.x, movedPos.y) tt = fixPosition(tt) local key = getKey(tt.x, tt.y) if touchPosList[key] then return end drawNode:setPosition(tt) drawNode:setBlendFunc({src = gl.ONE, dst = gl.ZERO}) drawNode:setVisible(true) renderTexture:begin() drawNode:visit() renderTexture:endToLua() drawNode:setVisible(false) if lastMovePos then local distance = math.abs(cc.pGetDistance(lastMovePos, movedPos)) local pos = cc.pSub(lastMovePos, movedPos) local angle = 180 * (cc.pToAngleSelf(pos) / math.pi) local height = radius * 2 local midPos = cc.pMidpoint(lastMovePos, movedPos) midPos = fixPosition(GUI:convertToNodeSpace(widget, midPos.x, midPos.y)) local rectNode = cc.DrawNode:create() local posList = { cc.p(- distance / 2 , - height / 2), cc.p(- distance / 2 , height / 2), cc.p(distance / 2 , height / 2), cc.p(distance / 2 , - height / 2) } rectNode:drawSolidPoly(posList, 4, cc.c4b(0,0,0,0)) rectNode:setPosition(midPos) rectNode:setRotation(angle) rectNode:setBlendFunc({src = gl.ONE, dst = gl.ZERO}) renderTexture:begin() rectNode:visit() renderTexture:endToLua() end -- pos local mPos = GUI:convertToNodeSpace(widget, movedPos.x, movedPos.y) mPos = fixPosition(mPos) for i = mPos.x - radius, mPos.x + radius do for j = mPos.y - radius, mPos.y + radius do if math.pow(i - mPos.x, 2) + math.pow(j - mPos.y, 2) <= math.pow(radius, 2) then addTouchPoint(i, j) end end end if moveBT then iMoveTime = iMoveTime + (os.clock() - moveBT) end moveBT = os.clock() if tonumber(moveTime) then if iMoveTime >= tonumber(moveTime) then timeCB() end end lastMovePos = movedPos elseif eventType == 2 or eventType == 3 then lastMovePos = nil moveBT = nil end end) return widget end function SUILoader:load_render_BmpText(swidget, callback) local element = swidget.element local text = element.attr.text or "" local size = tonumber(element.attr.size) or defaultFontSize local color = tonumber(element.attr.color) or defaultColorID local link = element.attr.link local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local clickInterval = (tonumber(element.attr.clickInterval) or 0) * 0.001 local tips = element.attr.tips local tipsx = tonumber(element.attr.tipsx) or 0 local tipsy = tonumber(element.attr.tipsy) or 0 local tipWidth = tonumber(element.attr.tipWidth) or 1136 text = string.gsub(text, "\\", "\r\n") text = string.trim(text) local widget = ccui.Text:create() GUI:SetBmpTextProperties(widget) widget:setBMFontFilePath() widget:setFontSize(size) widget:setTextColor(GET_COLOR_BYID_C3B(color)) widget:setString(text) if link and string.len(link) > 0 or (tips and string.len(tips) > 0) then widget:setTouchEnabled(true) widget:addClickEventListener(function() DelayTouchEnabled(widget, clickInterval) widget:setScale(1 + 0.2) local function reback() widget:setScale(1) end performWithDelay(widget, reback, 0.03) if callback and link then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) callback(jsonData) end if not global.isWinPlayMode then if tips and string.len(tips) > 0 then local offset = cc.p(tipsx, -tipsy) local anchorPoint = cc.p(0.5, 1) tips = string.gsub(tips, "%^", "\\") SHOW_SUI_DESCTIP( widget ,tips, tipWidth, offset, anchorPoint) end end end) -- 下划线 widget:getVirtualRenderer():enableUnderline() end self:addMouseOverTips(widget, element) return widget end function SUILoader:load_render_ButtonKeFu(swidget, callback, closeCB) local element = swidget.element local nimg = element.attr.nimg local pimg = element.attr.pimg local mimg = element.attr.mimg local text = element.attr.text or "" local color = tonumber(element.attr.color) or defaultColorID local size = tonumber(element.attr.size) or defaultFontSize local width = tonumber(element.attr.width) local height = tonumber(element.attr.height) local link = element.attr.o_link or element.attr.link or "&701" -- 没有配置强制默认打开 local submitInput = element.attr.submitInput local submitCheckBox = element.attr.submitCheckBox local tips = element.attr.tips local tipsx = tonumber(element.attr.o_tipsx) or tonumber(element.attr.tipsx) or 0 local tipsy = tonumber(element.attr.o_tipsy) or tonumber(element.attr.tipsy) or 0 local textWidth = tonumber(element.attr.textwidth) local grey = tonumber(element.attr.grey) or 0 local clickInterval = (tonumber(element.attr.clickInterval) or 0) * 0.001 local outline = tonumber(element.attr.outline) or defaultOutline local outlinecolor = tonumber(element.attr.outlinecolor) or defaultOutlineC local tipWidth = tonumber(element.attr.tipWidth) or 1136 local redPointTx = tonumber(element.attr.effectid) or 0 local redPointPath = element.attr.redimg local redx = tonumber(element.attr.redx) or 0 local redy = tonumber(element.attr.redy) or 0 local mainIndex = element.attr._mainIndex local widgetID = element.attr.id text = string.gsub(text, "\\", "\r\n") text = string.trim(text) local nimg = SUIHelper.fixImageFileName(nimg) local pimg = SUIHelper.fixImageFileName(pimg) local mimg = SUIHelper.fixImageFileName(mimg) local fullPathN = (nimg and string.len(nimg) > 0 and string.format(getResFullPath( "res/%s" ), nimg) or "") local fullPathP = (pimg and string.len(pimg) > 0 and string.format(getResFullPath( "res/%s" ), pimg) or "") local fullPathM = (mimg and string.len(mimg) > 0 and string.format(getResFullPath( "res/%s" ), mimg) or "") local widget = nil local isNormalExist = fullPathN ~= "" and global.FileUtilCtl:isFileExist(fullPathN) local isPressExist = fullPathP ~= "" and global.FileUtilCtl:isFileExist(fullPathP) local isMouseExist = fullPathM ~= "" and global.FileUtilCtl:isFileExist(fullPathM) local Button_Type = 1 --1-normalAndPress 2-Normal 3-Press 4-nil if isNormalExist and isPressExist then Button_Type = 1 elseif isNormalExist then Button_Type = 2 elseif isPressExist then Button_Type = 3 else Button_Type = 4 end widget = global.SWidgetCache:generateButtonRender(Button_Type) widget:resetNormalRender() widget:resetPressedRender() widget:setTitleText(text) widget:setTitleColor(GET_COLOR_BYID_C3B(color)) widget:setTitleFontName(defaultFontPath) widget:setTitleFontSize(size) widget:setTouchEnabled(false) widget:getTitleRenderer():setMaxLineWidth(0) widget:getTitleRenderer():enableOutline(GET_COLOR_BYID_C3B(outlinecolor), outline) if isNormalExist then widget:loadTextureNormal(fullPathN) end if isPressExist then widget:loadTexturePressed(fullPathP) end -- widget:ignoreContentAdaptWithSize(false) widget:setContentSize(widget:getVirtualRendererSize()) swidget.element.attr.o_link = element.attr.link swidget.element.attr.link = nil swidget.element.attr.bg = nil local redPointWidget = nil if redPointTx > 0 then -- redPointWidget = self:load_render_Effect(swidget) redPointWidget = global.FrameAnimManager:CreateSFXAnim(redPointTx) redPointWidget:Play(0, 0, true, 1) else redPointWidget = ccui.ImageView:create() local fullPath = (redPointPath and redPointPath ~= "") and string.format(getResFullPath("res/%s"), redPointPath) or "" if global.FileUtilCtl:isFileExist(fullPath) then redPointWidget:loadTexture(fullPath) end -- redPointWidget = self:load_render_Img(swidget) end SL:UnRegisterLUAEvent(LUA_EVENT_MANUAL_SERVICE_MESSAGE_UN_READ, "MABUAL_SERVICE_996_RED__"..(widgetID or "")) if redPointWidget then redPointWidget:setPosition(redx, redy) widget:addChild(redPointWidget) -- 监听客服红点 local ManualService996Proxy = global.Facade:retrieveProxy(global.ProxyTable.ManualService996Proxy) local unReadNums = tonumber(ManualService996Proxy:GetUnReadNums()) or 0 redPointWidget:setVisible(unReadNums > 0) SL:RegisterLUAEvent(LUA_EVENT_MANUAL_SERVICE_MESSAGE_UN_READ, "MABUAL_SERVICE_996_RED__"..(widgetID or ""), function(data) if not redPointWidget or tolua.isnull(redPointWidget) then SL:UnRegisterLUAEvent(LUA_EVENT_MANUAL_SERVICE_MESSAGE_UN_READ, "MABUAL_SERVICE_996_RED__"..(widgetID or "")) return end local unReadNums = data and tonumber(data.unReadNums) or 0 redPointWidget:setVisible(unReadNums > 0) end) end local showTips = tips and string.len(tips) > 0 if isNormalExist and (isMouseExist or showTips) then if global.isWinPlayMode then local function checkResType(path) if global.SpriteFrameCache:getSpriteFrame(path) then return 1 end if global.FileUtilCtl:isFileExist(path) then return 0 end return 0 end local function checkRes(path) local resType = checkResType(path) if isMouseExist and isNormalExist then widget:loadTextureNormal(path, resType) end end local offset = cc.p(tipsx, -tipsy) local anchor = cc.p(0.5, 1) local function enterCB(touchPos) if global.userInputController:isTouching() or not widget:isVisible() then return false end if not CheckNodeCanCallBack(widget, touchPos) then return false end checkRes(fullPathM) if showTips then tips = string.gsub(tips, "%^", "\\") showMouseOverTips(widget, tips, offset, anchor) end end local function leaveCB() checkRes(fullPathN) hideMouseOverTips() end -- widget:loadTextureMouseOver(fullPathN, fullPathM, enterCB, leaveCB) global.mouseEventController:registerMouseMoveEvent( widget, { enter = enterCB, leave = leaveCB, checkIsVisible = true } ) end end -- 加入元变量组件管理 local isMateValue = false local metaValue = {} local content = text while content and string.len(content) > 0 do local find_info = {sfind(content, "$STM%((.-)%)")} local begin_pos = find_info[1] local end_pos = find_info[2] if begin_pos and end_pos then isMateValue = true -- prefix if begin_pos ~= 1 then local substr = string.sub(content, 1, begin_pos - 1) table.insert(metaValue, substr) end -- metaValue local slices = ssplit(find_info[3], "_") table.insert(metaValue, {key = slices[1], param = slices[2]}) -- suffix content = string.sub(content, end_pos+1, string.len(content)) else table.insert(metaValue, content) content = "" end end if isMateValue then widget.useMetaValue = true global.Facade:sendNotification(global.NoticeTable.SUIMetaWidgetAdd, {metaValue = metaValue, widget = widget, lifewidget = widget}) end if textWidth then local renderer = widget:getTitleRenderer() renderer:setMaxLineWidth(textWidth) end -- link if link and string.len(link) > 0 or (tips and string.len(tips) > 0) then widget:setTouchEnabled(true) widget:addClickEventListener(function() DelayTouchEnabled(widget, clickInterval) if mainIndex then -- 数据上报 local NativeBridgeProxy = global.Facade:retrieveProxy(global.ProxyTable.NativeBridgeProxy) NativeBridgeProxy:GN_MainUIClickEvent({ index = mainIndex, id = element.attr.id, link = link }) end if link == "@DEFAULT_CLOSE" then if closeCB then closeCB() end elseif callback and link then local inputTable = self:getInputTable(submitInput) local checkBoxTable = self:getCheckBoxTable(submitCheckBox) local jsonData = {} jsonData.Act = link jsonData.Input = (#inputTable > 0 and inputTable or nil) jsonData.CheckBox = (#checkBoxTable > 0 and checkBoxTable or nil) self:linkFuncWithCheckWords(callback, jsonData) end if not global.isWinPlayMode then if tips and string.len(tips) > 0 then local offset = cc.p(tipsx, -tipsy) local anchorPoint = cc.p(0.5, 1) tips = string.gsub(tips, "%^", "\\") SHOW_SUI_DESCTIP( widget ,tips, tipWidth, offset, anchorPoint) end end end) end -- if nil == mimg then -- self:addMouseOverTips(widget, element) -- end -- grey if grey == 1 then Shader_Grey(widget) else Shader_Normal(widget) end return widget end return SUILoader