AchievementView.lua 9.83 KB
local AchievementView = dialog.uinode("ui/AchievementLayer.csb",import(".BaseView"))

function AchievementView:ctor()
    AchievementView.super.ctor(self);
end

function AchievementView:show()
    local scene = cc.Director:getInstance():getRunningScene()
    local inst = AchievementView:create();
    scene:addChild(inst, dialog.ZORDER_APP);

    inst:setContentSize(cc.size(display.width,display.height));
    ccui.Helper:doLayout(inst);

    local panel = inst:getChildByName("panel");

    inst.panel_head = panel:getChildByName("head"):getChildByName("panel");
    inst.headContainer = inst.panel_head:getChildByName("head");
    local head;
    if UserModel.user_info.head_url ~= "" then
        head = HeadImageSprite:create(UserModel.user_info.head_url,76,76);
    else
        head = NodeManager.getHeadSprite("head_"..UserModel.user_info.head..".png");
    end
    inst.headContainer:addChild(head);

    local btn_head = inst.panel_head:getChildByName("btn");
    btn_head:loadTextureNormal("res/headframe/"..UserModel.user_info.head_frame..".png");
    btn_head:loadTexturePressed("res/headframe/"..UserModel.user_info.head_frame..".png");

    local txt_nick = panel:getChildByName("txt_nick");

    if StringUtil.GetUTFLen(UserModel.user_info.nick) > 10 then
        txt_nick:setString(StringUtil.getMaxLenString(UserModel.user_info.nick,10).."...");
    else
        txt_nick:setString(UserModel.user_info.nick);
    end

    
    local achievement_cnt = UserModel.getAchievementNum();
    local txt_total_num = panel:getChildByName("txt_total_num");
    txt_total_num:setString("成就总数:"..achievement_cnt);

    local nextLevelInfo = AchievementInfo.getNextAchievementLevelReward(achievement_cnt);
    if nextLevelInfo then
        panel:getChildByName("panel_complete"):setVisible(false);
        panel:getChildByName("panel_reward"):getChildByName("txt_need_num"):setString(nextLevelInfo.cnt - achievement_cnt);
        local icon = panel:getChildByName("panel_reward"):getChildByName("icon");
        local itemArr = StringUtil.split(nextLevelInfo.itemList[1],",");
        icon:setSpriteFrame(cc.Sprite:create("res/iconsmall/"..itemArr[1]..".png"):getSpriteFrame());
        panel:getChildByName("panel_reward"):getChildByName("txt_reward_num"):setString("x"..itemArr[2]);

        local per = math.floor(achievement_cnt/nextLevelInfo.cnt*100);
        panel:getChildByName("panel_reward"):getChildByName("LoadingBar"):setPercent(per);
        panel:getChildByName("panel_reward"):getChildByName("txt_percent"):setString(achievement_cnt.."/"..nextLevelInfo.cnt);
    else
        panel:getChildByName("panel_reward"):setVisible(false);
    end

    inst.scrollView = panel:getChildByName("ScrollView");

    inst:init();

    inst.layer = cc.Layer:create();
    inst:addChild(inst.layer,1);
    registerScriptTouchEvent(inst.layer,handler(inst,inst.onTouchBegin),handler(inst,inst.onTouchMove),handler(inst,inst.onTouchEnd));

    return inst;
end

function AchievementView:init()
    self.btn_close = self:getChildByName("panel"):getChildByName("btn_close");
    self.btn_close.fn = handler(self,self.onClose);
    self.btn_close:addTouchEventListener(function(ref,type) self:onButtonClick(ref,type,self.btn_close.fn)end);
    if IS_TV == 1 then
        self.btn_close:setVisible(false);
    end

    self.nodesCopy = {};

    self:updateItems();
end

function AchievementView:onTouchBegin(event)
    self.begin_touch_pos = self.layer:getParent():convertToWorldSpace(event:getLocation());
    self.isMoved = false;
    return true;
end

function AchievementView:onTouchMove(event)
    local move_touch_pos = self.layer:getParent():convertToWorldSpace(event:getLocation());
    local _distance = Point.distance(self.begin_touch_pos,move_touch_pos);
    if _distance > 5 then
        self.isMoved = true;
    end
end

function AchievementView:onTouchEnd(event)
    local p = self.layer:convertToWorldSpace(event:getLocation());
end

function AchievementView:updateItems()
    self.scrollView:removeAllChildren();

    self.nodes = {};
    local list_nodes = {};
    local _list = AchievementInfo.getAchievementList();
    local _y = #_list*225;
    if _y < 482 then
        _y = 482;
    end
    for i=1,#_list do
        local info = _list[i];
        if info then
            local achievement_data = UserModel.getAchievementByID(info.id);
            list_nodes[i] = {};
            for ii,vv in ipairs(info.list) do
                local item = cc.CSLoader:createNode("ui/AchievementItem.csb");
                item:setPosition(cc.p(80+(ii-1)*200,_y - i*225));
                self.scrollView:addChild(item);
                item:getChildByName("txt_name"):setString(info.name);
                item:getChildByName("txt_des"):setString(info.des..vv.data);
                item:getChildByName("txt_progress"):setString("");
                item.main_id = info.id;
                item.step_id = ii;
                item.step_info = vv;

                local btn_get = item:getChildByName("btn_get");
                btn_get.main_id = info.id;
                btn_get.step_id = ii;
                btn_get.step_info = vv;
                if achievement_data and achievement_data.data >= vv.data then
                    item:getChildByName("icon"):setSpriteFrame(cc.Sprite:create("res/ui/achievement/"..i.."_"..ii..".png"):getSpriteFrame());
                    if not TableUtil.IsInTable(achievement_data.get_reward_id,ii) then
                        btn_get:setVisible(true);
                        btn_get:addTouchEventListener(function(ref,type) self:onButtonClick(ref,type,handler(self,self.onGetRewardClick))end);
                    else
                        btn_get:setVisible(false);
                    end
                else
                    if achievement_data then
                        item:getChildByName("txt_progress"):setString(achievement_data.data.."/"..vv.data);
                    else
                        item:getChildByName("txt_progress"):setString("0/"..vv.data);
                    end
                    btn_get:setVisible(false);
                    item:getChildByName("icon"):setSpriteFrame(cc.Sprite:create("res/ui/achievement/gray_"..i.."_"..ii..".png"):getSpriteFrame());
                end

                list_nodes[i][ii] = item;

                item.fn = function ()
                    self:onItemClick(item);
                end;
            end
        end
    end
    self.scrollView:setInnerContainerSize(cc.size(692,_y));

    self.nodes = TableUtil.merge(self.nodesCopy,list_nodes);
    self:updateSelectedState(false);
end

function AchievementView:onItemClick(ref,event)
    if self.isMoved then
        return;
    end

    local btn_get = ref:getChildByName("btn_get");
    self:onGetRewardClick(btn_get);
end

function AchievementView:onGetRewardClick(ref,type)
    if self.isMoved then
        return;
    end

    local achievement_data = UserModel.getAchievementByID(ref.main_id);
    if achievement_data and achievement_data.data >= ref.step_info.data and not TableUtil.IsInTable(achievement_data.get_reward_id,ref.step_id) then
        ref:setVisible(false);
        --发送获取奖励请求
        SocketClient:getInstance():send("gateway_msg.get_achievement_reward_msg",{type_id=ref.main_id,reward_id=ref.step_id});
    end
end

function AchievementView:onUpdateWin()
    local winNum = UserModel.getWinNUM();
    local loseNum = UserModel.getLoseNUM();
    local rate = 0;
    if winNum+loseNum ~= 0 then
        rate = math.floor(winNum*100/(winNum+loseNum));
    end
    self:getChildByName("panel"):getChildByName("panel_1"):getChildByName("txt_rate"):setString(rate.."%   ("..winNum.."胜)");
end

function AchievementView:onClose()
    self:close();
end

--返回键处理函数
function AchievementView:onKeypadBack()
    self:close();
end

--确认键处理函数
function AchievementView:onKeypadOk()
    local node = self.nodes[self.nodeIndex][self.selectedIndex];
    if node and node.fn then
        node.fn();
    end
end

--上键处理函数
function AchievementView:onKeypadUp()
    if self.nodeIndex ~= #self.nodesCopy + 1 then
        AchievementView.super.onKeypadUp(self,false);
    end

    local node = self.nodes[self.nodeIndex][self.selectedIndex];
    if self.nodeIndex > #self.nodesCopy then
        self:setScrollPosition(node);
    end

    if self.nodeIndex <= #self.nodesCopy and node and node.fn then
        node.fn();
    end
end

--下键处理函数
function AchievementView:onKeypadDown()
    if self.nodeIndex ~= #self.nodesCopy then
        AchievementView.super.onKeypadDown(self,false);
    end

    local node = self.nodes[self.nodeIndex][self.selectedIndex];
    if self.nodeIndex > #self.nodesCopy then
        self:setScrollPosition(node);
    end

    if self.nodeIndex <= #self.nodesCopy and node and node.fn then
        node.fn();
    end
end

--左键处理函数
function AchievementView:onKeypadLeft()
    if self.nodeIndex > #self.nodesCopy and self.selectedIndex == 1 then
        
    else
        AchievementView.super.onKeypadLeft(self,false);
    end
end

--右键处理函数
function AchievementView:onKeypadRight()
    if self.nodeIndex <= #self.nodesCopy and #self.nodes > #self.nodesCopy then
        self.nodeIndex = #self.nodesCopy + 1;
        self:updateSelectedState(false);
    else
        AchievementView.super.onKeypadRight(self,false);
    end
end

function AchievementView:setScrollPosition(node)
    local scrollSize = self.scrollView:getContentSize();

    local _list = AchievementInfo.getAchievementList();
    local len = #_list*225;
    local currentX = len - (node:getPositionY()+225);
    if currentX > len-scrollSize.height then
        currentX = len-scrollSize.height;
    elseif currentX < 0 then
        currentX = 0;
    end

    local per = 0;
    if len-scrollSize.height > 0 then
        per = currentX*100/(len-scrollSize.height);
    end
    print(len-scrollSize.height,per)
    self.scrollView:scrollToPercentVertical(per,0.5,true);
end

return AchievementView