CSGWarSceneView = CSGWarSceneView or BaseClass(BaseView) local CSGWarSceneView = CSGWarSceneView --[[ CSGWarSceneView.TabData = { [1] = {name = "人物", level = MainRoleModel.TabOpenLevel[1]}, } --]] function CSGWarSceneView:__init() self.base_file = "CSGWar" self.layout_file = "CSGWarSceneView" self.layer_name = "Main" self.destroy_imm = true self.use_background = false --全屏界面默认使用这个参数 --self.hide_maincancas = true --全屏界面需要放开隐藏主UI self.change_scene_close = false self.append_to_ctl_queue = false --是否要添加进界面堆栈 self.need_show_money = false --是否要显示顶部的金钱栏 self.is_first = true self.is_show_order = false self.model = CSGWarModel:getInstance() self.model:Fire(CSGWarConst.REQ_CSGWAR_SCMD, 60110) self.buff_item = {} self.has_show_dialog = false self.is_show_left_time = false self.city_list = {} self.order_list = {} self.load_callback = function () self:LoadSuccess() end self.open_callback = function ( ) self:OpenSuccess() end self.switch_callback = function(index) self:SwitchTab(index) end self.destroy_callback = function ( ) self:DestroySuccess() end end function CSGWarSceneView:Open( ) --self.data = data BaseView.Open(self) end function CSGWarSceneView:LoadSuccess() local nodes = { "left_con/time_text:tmp", "left_con/city_con", "left_con", "right_con", "middle_con/order_con:obj", "middle_con:obj", "middle_con/btnCon/order_btn:obj", "middle_con/btnCon/defend_btn:obj", "middle_con/btnCon/attack_btn:obj", "right_con/instruction_btn:obj", "right_con/exit_btn:obj", } self:GetChildren(nodes) self:AddEvent() self.country = KfWorldModel:GetInstance():GetMyCountryId() SetAnchoredPosition(self.transform, 0, 0) self.transform.sizeDelta = Vector3(ScreenWidth, ScreenHeight) SetAnchoredPositionX(self.instruction_btn, -134) self:ChangeUiPosition() self.model:Fire(CSGWarConst.OPEN_CSGWAR_INSTRUCTION_VIEW, true) self.exit_btn_obj:SetActive(false) if not self.init_exit_btn then self.init_exit_btn = true local function call_back( ... ) local ok = function ( ) self.model:Fire(CSGWarConst.REQ_CSGWAR_SCMD, 60109) end Alert.show("即将退出跨国团战,是否确定?",Alert.Type.Two,ok) end local data = {call_back = call_back, pos = {x = 196,y = 275}} -- pos 为左侧侧边栏的长度 GlobalEventSystem:Fire(EventName.SHOW_EXIT_BTN_STATE, data) end end function CSGWarSceneView:AddEvent() --适配刘海屏 local function onOrientationChange() self:ChangeUiPosition() end self.orientation_change_id = GlobalEventSystem:Bind(EventName.ORIENTATION_DID_CHANGE, onOrientationChange) local function changeFunc(is_hide) -- self.exit_btn_obj:SetActive(is_hide) self.instruction_btn_obj:SetActive(is_hide) end self.change_icon_event_id = GlobalEventSystem:Bind(EventName.CHANGE_RIGHT_TIP_ICON, changeFunc) local function on_update_blood( ) self:UpdateCityBlood() end self.on_update_blood_id = self.model:Bind(CSGWarConst.UPDATE_CSGWAR_CITY_INFO, on_update_blood) local function on_update_btn_state( ) self:UpdateOrderBtn() end self.on_update_btn_state_id = self.model:BindOne("CSGWar_sign_info", on_update_btn_state) local function on_show_command( id ) if id then local cfg = Config.Crossguildwarscene[id] local str = string.format("团长下令:请火速赶往%s", cfg.name) local special_tip_data = { type = SpecialTipType.Middle, sepeical_str = str, need_flash = true, show_time = 10, } CommonController.Instance:Fire(EventName.OPEN_SPECIALTIPVIEW, special_tip_data) local temp_head_name = RoleManager.Instance.mainRoleInfo.name -- local str = string.format("团长下令全员前往%s!", cfg.name) -- local data = { -- head_type = 1004, -- desc = str, -- head_name = temp_head_name or "", -- hide_time = 15, -- dalay_time = 1, -- is_task_type = true, -- pos = Vector3(230,0,0), -- } -- GlobalEventSystem:Fire(EventName.SHOW_COM_DIALOGUE_SHOW_VIEW,data) end end self.on_show_command_id = self.model:Bind(CSGWarConst.SHOW_CSGWAR_COMMAND, on_show_command) local function on_click( target ) if self.order_btn_obj == target then self.is_show_order = not self.is_show_order self:ShowOrderCon(self.is_show_order) elseif self.exit_btn_obj == target then local ok = function ( ) self.model:Fire(CSGWarConst.REQ_CSGWAR_SCMD, 60109) end Alert.show("即将退出跨国团战,是否确定?",Alert.Type.Two,ok) elseif self.defend_btn_obj == target then self:GoNearestCity(false,1) elseif self.attack_btn_obj == target then self:GoNearestCity(true,2) elseif self.instruction_btn_obj == target then self.model:Fire(CSGWarConst.OPEN_CSGWAR_INSTRUCTION_VIEW) end end AddClickEvent(self.order_btn_obj, on_click) AddClickEvent(self.exit_btn_obj, on_click) AddClickEvent(self.defend_btn_obj, on_click) AddClickEvent(self.attack_btn_obj, on_click) AddClickEvent(self.instruction_btn_obj, on_click) self:BindLittleMove(self.middle_con, BaseView.LittleMoveDir.Bottom, 147.5) self:BindLittleMove(self.left_con, BaseView.LittleMoveDir.Left, 0) self:BindLittleMove(self.right_con, BaseView.LittleMoveDir.Right, 0) -- 主界面聊天展开事件 self:BindMainUIExpandEvent( self.middle_con ) end --寻路到最近的城 function CSGWarSceneView:GoNearestCity( is_attack,go_type ) local data = self.model:GetCSGWarCityInfo() local has_city = self:HasOccupy(data) local near_index = nil local cfg = Config.Crossguildwarscene local main_role = Scene.Instance:GetMainRole() local main_role_pos = CoVector2.New(main_role.real_pos.x,main_role.real_pos.y) local near_pos = 9999999 local dis = 0 local city_pos = CoVector2.New(0,0) local temp_pos = {} for i,v in ipairs(cfg) do --如果没有占领城 就不去核心城了 if not has_city and i == 1 then else local need_cal = false local city_data = data[i] if city_data then if self.country == city_data.group and city_data.group ~= 0 then --如果是自己的城 且不是攻击才参与计算距离 need_cal = not is_attack else --如果不是自己的城 且是攻击才参与计算距离 need_cal = is_attack end end if need_cal then--经过上面的判断才知道符不符合条件 temp_pos = stringtotable(v.flag) city_pos.x = temp_pos[2] city_pos.y = temp_pos[3] dis = CoVector2.distance(main_role_pos,city_pos) if dis < near_pos then near_pos = dis near_index = i end end end end if near_index then local city_pos = cfg[near_index].city_pos if not city_pos then city_pos = stringtotable(cfg[near_index].flag) end local function call_back( ... ) GlobalEventSystem:Fire(EventName.STARTAUTOFIGHT) end local findVo = FindVo.New() findVo.sceneId = SceneManager.Instance:GetSceneId() findVo.type = FindVo.POINT findVo.x = city_pos[2]/ SceneObj.LogicRealRatio.x findVo.y = city_pos[3]/ SceneObj.LogicRealRatio.y findVo.call_back = call_back GlobalEventSystem:Fire(EventName.FIND,findVo) if go_type == 1 then Message.show("准备前往我方城池进行守卫!") elseif go_type == 2 then Message.show("准备前往敌方城池进行攻击!") end else local str = "" if is_attack then str = "太厉害了!您已经占领了全部地区!" else str = "您现在没有占领任何地区!" end Message.show(str) end end function CSGWarSceneView:ChangeUiPosition( ) SetAnchoredPositionX(self.right_con.transform, -ClientConfig.iphone_x_offset_right) SetAnchoredPosition(self.left_con.transform, ClientConfig.iphone_x_offset_left, -169) end function CSGWarSceneView:OpenSuccess() self:UpdateView() end function CSGWarSceneView:UpdateView() self:UpdateCityBlood() self:UpdateOrderBtn() self:StartLeftTime() self:UpdateOccupyBuff() end function CSGWarSceneView:SwitchTab( index ) end function CSGWarSceneView:UpdateCityBlood( ) local near_index = nil if self.is_first then self.is_first = false local cfg = Config.Crossguildwarscene local main_role = Scene.Instance:GetMainRole() local main_role_pos = CoVector2.New(main_role.real_pos.x,main_role.real_pos.y) local near_pos = 9999999 local dis = 0 local city_pos = CoVector2.New(0,0) local temp_pos = {} for i,v in ipairs(cfg) do temp_pos = stringtotable(v.flag) city_pos.x = temp_pos[2] city_pos.y = temp_pos[3] dis = CoVector2.distance(main_role_pos,city_pos) if dis < near_pos then near_pos = dis near_index = i end end end local select_callback = function( index ) for i,v in ipairs(self.city_list) do v:SetSelected(i == index) end end local data = self.model:GetCSGWarCityInfo() local has_city = self:HasOccupy(data) local y_offset = 48 for i=1,5 do local item = self.city_list[i] if not item then item = CSGWarCityItem.New(self.city_con) item:SetPosition(0, -(i-1)*y_offset) self.city_list[i] = item end item:SetData(data[i], i, has_city, near_index, select_callback) end end --获取本阵营是否有占领某一个副城 function CSGWarSceneView:HasOccupy( data ) local bool = false for i=1,5 do if data[i] then if data[i].group ~= 0 and data[i].group == self.country then bool = true break end end end return bool end function CSGWarSceneView:StartLeftTime() if self.exit_timer_id then GlobalTimerQuest:CancelQuest(self.exit_timer_id) self.exit_timer_id = nil end local data = self.model:GetCSGWarBaseInfo() if TableSize(data) == 0 then return end local left_time = math.max(0,data.etime - TimeUtil:getServerTime()) if left_time <= 0 then else local function onExitTimer() left_time = data.etime - TimeUtil:getServerTimeMs() / 1000 if left_time <= 300 and not self.has_show_dialog then self:ShowTimeDialog() end if left_time <= 15 then self:ShowLeftTime(left_time) end if left_time > 0 then self.time_text_tmp.text = string.format("活动剩余时间:%s",HtmlColorTxt(TimeUtil:convertMillisecondTime(left_time), ColorUtil.GREEN_DARK)) else if self.exit_timer_id then GlobalTimerQuest:CancelQuest(self.exit_timer_id) self.exit_timer_id = nil end end end onExitTimer() self.exit_timer_id = GlobalTimerQuest:AddPeriodQuest(onExitTimer, 0.03, -1) end end function CSGWarSceneView:ShowLeftTime( left_time ) if self.is_show_left_time then return end self.is_show_left_time = true left_time = math.floor(left_time) local data = { time = left_time, time_str = "秒后", exit_desc = "自动退出", } GlobalEventSystem:Fire(EventName.OPEN_EXIT_TIME_TIP, data, true) end function CSGWarSceneView:ShowTimeDialog( ) if self.has_show_dialog then return end local temp_head_name = RoleManager.Instance.mainRoleInfo.name local str = "这是最后的时刻了!一定要拿下核心区!" local data = { head_type = 1004, desc = str, head_name = temp_head_name or "", hide_time = 15, dalay_time = 1, is_task_type = true, pos = Vector3(230,0,0), } GlobalEventSystem:Fire(EventName.SHOW_COM_DIALOGUE_SHOW_VIEW,data) self.has_show_dialog = true end function CSGWarSceneView:UpdateOrderBtn( ) local my_guild_id = RoleManager.Instance.mainRoleInfo.guild_id local is_fight_guild = self.model:IsCSGWarFightGuild(my_guild_id) local is_leader = RoleManager.Instance.mainRoleInfo.position == GuildModel.GuildPosition.Leader or RoleManager.Instance.mainRoleInfo.position == GuildModel.GuildPosition.ViceLeader self.order_btn_obj:SetActive(is_fight_guild and is_leader) if is_fight_guild and is_leader then else self:ShowOrderCon(false) end end function CSGWarSceneView:ShowOrderCon( bool ) self.order_con_obj:SetActive(bool) if bool and TableSize(self.order_list) == 0 then local y_offset = 36 for i=1,5 do local item = self.order_list[i] if not item then item = CSGWarOrderItem.New(self.order_con) item:SetPosition(0, -y_offset*(i-1)) item:SetData(i) self.order_list[i] = item end end end end function CSGWarSceneView:UpdateOccupyBuff( ) local data = SandTableModel:getInstance():GetBuffListByFaction(self.country) local x_offset = 114 local y_offset = 120 for i,v in ipairs(data) do local item = self.buff_item[i] if not item then item = CSGWarBuffItem.New(self.right_con) item:SetPosition(-((i-1)%2)*x_offset,math.floor((i-1)/2)*y_offset) self.buff_item[i] = item end item:SetData(i,v) end -- print("HWR:CSGWarSceneView [start:357] data:", data) -- PrintTable(data) -- print("HWR:CSGWarSceneView [end]") end function CSGWarSceneView:DestroySuccess( ) GlobalEventSystem:Fire(EventName.HIDE_EXIT_BTN_STATE) if self.orientation_change_id then GlobalEventSystem:UnBind(self.orientation_change_id) self.orientation_change_id = nil end if self.change_icon_event_id then GlobalEventSystem:UnBind(self.change_icon_event_id) self.change_icon_event_id = nil end if self.exit_timer_id then GlobalTimerQuest:CancelQuest(self.exit_timer_id) self.exit_timer_id = nil end if self.on_update_blood_id then self.model:UnBind(self.on_update_blood_id) self.on_update_blood_id = nil end if self.on_show_command_id then self.model:UnBind(self.on_show_command_id) self.on_show_command_id = nil end for i,v in ipairs(self.city_list) do v:DeleteMe() v = nil end self.city_list = {} for i,v in ipairs(self.order_list) do v:DeleteMe() v = nil end self.order_list = {} if self.on_update_btn_state_id then self.model:UnBind(self.on_update_btn_state_id) self.on_update_btn_state_id = nil end for i,v in ipairs(self.buff_item) do v:DeleteMe() v = nil end self.buff_item = {} -- 清除横幅 GlobalEventSystem:Fire(EventName.OPEN_EXIT_TIME_TIP, nil, false) CommonController.Instance:Fire(EventName.CLOSE_SPECIALTIPVIEW) end