-- <* -- @Author: Saber -- @Description: 通用邀请右侧tips弹窗 -- *> CommonInviteTipView = CommonInviteTipView or BaseClass(BaseView) local CommonInviteTipView = CommonInviteTipView local clamp = Mathf.Clamp local math_floor = Mathf.Floor function CommonInviteTipView:__init() self.base_file = "common" self.layout_file = "CommonInviteTipView" self.layer_name = "Main" self.destroy_imm = true self.use_background = false --全屏界面默认使用这个参数,非全屏界面自行设置 self.anim_time = 0.5 self.is_animating = false -- 是否在动画中 self.waiting = true -- 是否在等待新的邀请数据更新界面 self.show_time_str = false--是否显示剩余时间 self.show_time_elapse = false --剩余时间显示 self.model = CommonModel:getInstance() self.dun_many_model = false self.req_duny_many_mirror = false self.load_callback = function () self:LoadSuccess() self:AddEvent() end self.open_callback = function ( ) self:UpdateView() end self.destroy_callback = function ( ) self:DestroySuccess() end end --[[ invite_data = { -- 邀请数据 layer_name -- 定制层级,可不传,默认Main层 invite_type -- 邀请类型 必传,用来在界面内决定要怎么展示内容 accept_callback -- 接受邀请回调 reject_callback -- 拒绝邀请回调 auto_close_time -- 自动拒绝时间,可不传,默认30秒 vip -- vip 等级 svip -- 贵族 -- 其他数据自己自行添加,然后根据invite_type编写自己的逻辑 } ]] function CommonInviteTipView:Open(invite_data) self.invite_data = invite_data -- 定制层级 self.layer_name = invite_data.layer_name or self.layer_name self:InitNodesAndData() BaseView.Open(self) end function CommonInviteTipView:ReOpen(invite_data) self.invite_data = invite_data if self.is_loaded then self:InitNodesAndData() self:UpdateView() end end function CommonInviteTipView:LoadSuccess() local nodes = { "reject_btn:obj:img", "accept_btn:obj", "role_name:tmp", "vip_con", "invite_content:tmp", "fillBg:img", "bg", "mirror_btn:obj", "time_text:tmp:obj", "time_bg:obj", "event_icon:obj", } self:GetChildren(nodes) self.vip_item = RoleVipItem.New(self.vip_con) self.vip_item:SetAnchoredPosition(0, 0) self.vip_item:SetScale(0.84, 0.84) -- 动画重点坐标初始化 self.start_anim_pos_x = 350 - ClientConfig.iphone_x_offset_right self.end_anim_pos_x = 0 - ClientConfig.iphone_x_offset_right SetAnchoredPositionX(self.transform, self.start_anim_pos_x) end function CommonInviteTipView:AddEvent() local function click_event(target) if target == self.accept_btn_obj then if not self.is_animating then -- 动画状态不允许操作 if self.invite_data and self.invite_data.accept_callback then self.invite_data.accept_callback(self.invite_data) end self:HideAnim() -- 播放关闭效果,并检查邀请缓存 end elseif target == self.reject_btn_obj then if not self.is_animating then -- 动画状态不允许操作 if self.invite_data and self.invite_data.reject_callback then self.invite_data.reject_callback(self.invite_data) end self:HideAnim() -- 播放关闭效果,并检查邀请缓存 end elseif target == self.mirror_btn_obj then if not self.is_animating then -- 动画状态不允许操作 if self.invite_data and self.invite_data.other_callback then self.invite_data.other_callback(self.invite_data) end self:HideAnim() -- 播放关闭效果,并检查邀请缓存 end end end AddClickEvent(self.accept_btn_obj, click_event) AddClickEvent(self.reject_btn_obj, click_event) AddClickEvent(self.mirror_btn_obj, click_event) local onMirrorInfoUpdate = function (dun_type) self.req_duny_many_mirror = false end self:BindEvent(DunManyModel:getInstance(), DunManyModel.UPDATE_DUNMANY_MIRROR, onMirrorInfoUpdate) end function CommonInviteTipView:InitNodesAndData( ) if self.is_loaded then if self.vip_item then self.vip_item:SetData(0) end self.role_name_tmp.text = "" self.invite_content_tmp.text = "" lua_resM:setImageSprite(self, self.reject_btn_img, "common_asset", "com_invite_reject") SetAnchoredPositionX(self.transform, self.start_anim_pos_x) end self.auto_close_time = self.invite_data.auto_close_time or 30 self.waiting = false self:ClearAutoCloseTimer() self:ClearViewAnimId() self:ClearDestroyTimer() end -- 更新邀请内容 function CommonInviteTipView:UpdateView() self.fillBg_img.fillAmount = 1 -- 进度条拉满 if self.invite_data then self.show_time_str = false self.show_time_elapse = false self.mirror_btn_obj:SetActive(false) self.event_icon_obj:SetActive(false) if self.invite_data.invite_type == CommonModel.InviteTipsType.GuildSpellList or self.invite_data.invite_type == CommonModel.InviteTipsType.Team or self.invite_data.invite_type == CommonModel.InviteTipsType.Crusade or self.invite_data.invite_type == CommonModel.InviteTipsType.GuardinThree then SetSizeDeltaX(self.bg, 329) SetSizeDeltaX(self.fillBg, 329) SetAnchoredPositionX(self.vip_con, -19) SetAnchoredPositionX(self.accept_btn, 100.5) SetAnchoredPositionX(self.reject_btn, 49) SetAnchoredPositionX(self.invite_content, -37) SetAnchoredPositionX(self.role_name, (self.invite_data.vip == 0 and self.invite_data.svip == 0) and -15 or 7) -- elseif self.invite_data.invite_type == CommonModel.InviteTipsType.Crusade -- or self.invite_data.invite_type == CommonModel.InviteTipsType.GuardinThree then --装备副本 -- self.mirror_btn_obj:SetActive(true) -- SetSizeDeltaX(self.bg, 325) -- SetSizeDeltaX(self.fillBg, 325) -- SetAnchoredPositionX(self.vip_con, -52.5) -- SetAnchoredPositionX(self.accept_btn, 38) -- SetAnchoredPositionX(self.reject_btn, -18.5) -- SetAnchoredPositionX(self.invite_content, -53) -- SetAnchoredPositionX(self.role_name, (self.invite_data.vip == 0 and self.invite_data.svip == 0) and -53 or -20) elseif self.invite_data.invite_type == CommonModel.InviteTipsType.EventTips then -- 活动tips self.event_icon_obj:SetActive(true) SetSizeDeltaX(self.bg, 329) SetSizeDeltaX(self.fillBg, 329) SetAnchoredPositionX(self.accept_btn, 100.5) SetAnchoredPositionX(self.reject_btn, 49) SetAnchoredPositionX(self.invite_content, -37) SetAnchoredPositionX(self.role_name, 7) lua_resM:setImageSprite(self, self.reject_btn_img, "common_asset", "com_invite_reject2") end if self.invite_data.invite_type == CommonModel.InviteTipsType.GuildSpellList then -- 社团拼单邀请 local str = string.format('Lv.%s %s', self.invite_data.inviter_lv, self.invite_data.inviter_name) self.role_name_tmp.text = str local sl_cfg = Config.Guildorder[self.invite_data.cfg_id] self.invite_content_tmp.text = string.format("拼单:%s", GuildModel.SpellListColor[sl_cfg.color], Trim(sl_cfg.name)) elseif self.invite_data.invite_type == CommonModel.InviteTipsType.Team then -- 组队邀请 local data = self.invite_data.param_data local str = string.format('Lv.%s %s', data.level, data.name) self.role_name_tmp.text = HtmlColorTxt( str, "#ffffff") -- 副本目标 local main_type = data.activity_id or "" local sub_type = data.subtype or "" local cfg = Config.Teamui[main_type.."@"..sub_type] if cfg then local txt = cfg.subtype_name self.invite_content_tmp.text = "副本:" .. HtmlColorTxt( Trim(txt), "#fdffc2") else self.invite_content_tmp.text = "暂无目标" end elseif self.invite_data.invite_type == CommonModel.InviteTipsType.Crusade then --装备副本 local data = self.invite_data self.role_name_tmp.text = HtmlColorTxt( data.inviter_name, "#ffffff") self.dun_cfg = DunManyModel.getInstance():GetManyDunCfg(data.dun_id) if self.dun_cfg then self.invite_content_tmp.text = HtmlColorTxt(Trim(self.dun_cfg.sub_type_name), "#FDFFC2") end self.show_time_str = data.show_time_str self.show_time_elapse = data.show_time elseif self.invite_data.invite_type == CommonModel.InviteTipsType.GuardinThree then --守卫信标 local data = self.invite_data self.role_name_tmp.text = HtmlColorTxt( data.inviter_name, "#ffffff") self.dun_cfg = BaseDungeonModel.Instance:GetDunCfg(data.dun_id) if self.dun_cfg then self.invite_content_tmp.text = HtmlColorTxt(Trim(self.dun_cfg.name), "#FDFFC2") end self.show_time_str = data.show_time_str self.show_time_elapse = data.show_time DunManyModel.getInstance():Fire(DunManyModel.REQUEST_CCMD_EVENT, 21528,DunManyModel.InviteTeamType.GuardinThree) elseif self.invite_data.invite_type == CommonModel.InviteTipsType.EventTips then -- 活动tips self.role_name_tmp.text = HtmlColorTxt(self.invite_data.inviter_name, "#ffffff") self.invite_content_tmp.text = self.invite_data.inviter_content end -- 设置vip 并调整名字的位置 self.vip_item:SetData(self.invite_data.vip, self.invite_data.svip) -- 自动关闭倒计时 self:StartAutoCloseTimer() -- 播放弹出动画 self:ShowAnim() end end -- 自动关闭倒计时 function CommonInviteTipView:StartAutoCloseTimer( ) self.time_bg_obj:SetActive(self.show_time_str ~= false and self.show_time_str ~= "") self.time_text_obj:SetActive(self.show_time_str ~= false and self.show_time_str ~= "") local end_time = self.auto_close_time + TimeUtil:getServerTimeMs()/1000 local show_time = self.show_time_elapse ~= false and ( self.show_time_elapse + TimeUtil:getServerTimeMs()/1000) or (false) self:ClearAutoCloseTimer() local function auto_close_func() local left_time = end_time - TimeUtil:getServerTimeMs()/1000 self.fillBg_img.fillAmount = clamp(left_time / self.auto_close_time, 0, 1) if show_time then local sce_time = math_floor(show_time - TimeUtil:getServerTimeMs()/1000) if sce_time >= 0 then self.time_text_tmp.text = string.format(self.show_time_str, HtmlColorTxt(sce_time, "#0ce148")) else self.time_text_tmp.text = "" self.time_text_obj:SetActive(false) self.show_time_str = false self.show_time_elapse = false end end --绝地守卫特殊显示 if self.invite_data and self.invite_data.invite_type == CommonModel.InviteTipsType.GuardinThree then self.time_text_tmp.text = self:GetGuardinThreeText() end if left_time <= 0 then if self.invite_data.invite_type == CommonModel.InviteTipsType.Crusade or self.invite_data.invite_type == CommonModel.InviteTipsType.GuardinThree then if self.invite_data and self.invite_data.other_callback then self.invite_data.other_callback(self.invite_data) end else if self.invite_data and self.invite_data.reject_callback then self.invite_data.reject_callback(self.invite_data) end end self:ClearAutoCloseTimer() self:HideAnim() -- 播放关闭效果,并检查邀请缓存 end end self.auto_close_func_id = GlobalTimerQuest:AddPeriodQuest(auto_close_func, 0.02, -1) end function CommonInviteTipView:ClearAutoCloseTimer( ) if self.auto_close_func_id then GlobalTimerQuest:CancelQuest(self.auto_close_func_id) self.auto_close_func_id = nil end end -- 弹出动画 function CommonInviteTipView:ShowAnim() local function anim_callback() self.is_animating = false end self:ClearViewAnimId() self.is_animating = true self.view_anim_id = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.ANCHORED_POSX, self.end_anim_pos_x, self.anim_time, anim_callback, TweenFunc.EASE_OUT_QUINT) end -- 播放关闭动画,并检测缓存是否还有其他邀请没有处理 function CommonInviteTipView:HideAnim() local function anim_callback() self.is_animating = false self.waiting = true self:DestroyTimer() -- 检查缓存 CommonController.Instance:Fire(EventName.SHOW_COMMON_INVITE_TIPS) end self:ClearViewAnimId() self.is_animating = true self.view_anim_id = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.ANCHORED_POSX, self.start_anim_pos_x, self.anim_time, anim_callback, TweenFunc.EASE_OUT_QUINT) end function CommonInviteTipView:ClearViewAnimId( ) if self.view_anim_id then TweenLite.Stop(self.view_anim_id) self.view_anim_id = nil end end -- 销毁界面倒计时 固定5秒后如果没有新的邀请则销毁界面 function CommonInviteTipView:DestroyTimer( ) local end_time = 5 + TimeUtil:getServerTime() self:ClearDestroyTimer() local function destroy_func() local left_time = end_time - TimeUtil:getServerTime() if left_time <= 0 then self:Close() end end self.destroy_func_id = GlobalTimerQuest:AddPeriodQuest(destroy_func, 0.1, -1) end function CommonInviteTipView:ClearDestroyTimer( ) if self.destroy_func_id then GlobalTimerQuest:CancelQuest(self.destroy_func_id) self.destroy_func_id = nil end end function CommonInviteTipView:DestroySuccess( ) if self.vip_item then self.vip_item:DeleteMe() self.vip_item = nil end self:ClearViewAnimId() self:ClearAutoCloseTimer() self:ClearDestroyTimer() end function CommonInviteTipView:GetGuardinThreeText( ) self.dun_many_model = self.dun_many_model or DunManyModel.getInstance() local info = self.dun_many_model:GetDunManyMirrorInfo(DunManyModel.InviteTeamType.GuardinThree) local str = "" if info then local time_str = "" if info.recover_time ~= 0 then local cur_time = TimeUtil:getServerTime() if cur_time >= info.recover_time then if not self.req_duny_many_mirror then self.dun_many_model:Fire(DunManyModel.REQUEST_CCMD_EVENT, 21528,DunManyModel.InviteTeamType.GuardinThree) self.req_duny_many_mirror = true end else local left_time = info.recover_time - cur_time time_str = string.format("%s后恢复%s次", HtmlColorTxt(TimeUtil:timeConvert8(left_time), "#0ce148"), HtmlColorTxt(1, "#0ce148")) end end str = string.format("剩余分身数:%s %s", HtmlColorTxt(info.count, "#0ce148") , time_str) end return str end