GameLobby.js 13.1 KB
//游戏大厅列表页
var Common = require('Common');
var TVFocus = require('TVFocus');
var FocusInfo = require('FocusInfo');
var TVCanvas = require('TVCanvas');
var ListView = require('ListView');
var GameLobbyCategoryJson = require('GameLobbyCategoryJson');

cc.Class({
    extends: TVCanvas,
    properties: {
    },

    onLoad: function () {
        this._super();

        //-----------上下文及参数相关处理------------
        let oSceneParameter = this._cApplication.getTopSceneParameter();
        if (oSceneParameter) {
            this._strAppId = oSceneParameter.appId;//应用id
        }
        //从其他界面退回来的
        if (this._cApplication.getBackStatus()) {
            this._oSceneContext = this._cApplication.popSceneContext();
            this._cApplication.setBackStatus(false);
        } else {
            this._oSceneContext = {};
            // this._oSceneContext.iRecordKeyDownOperation = 0; //记录用户上下左右操作记录,目的是为了解决用户回退界面焦点框位置不准确问题
            this._oSceneContext.categoryRecordIndexOfFirstCell = 0;
            this._oSceneContext.focusPath = "CategoryList/DataContainerMask/DataContainer/StarListCell0";
        }
        //---------上下文及参数相关处理结束-----------
        this._nodeCategoryList = this.node.getChildByName('CategoryList');
        let lvCategoryList = this._nodeCategoryList.addComponent(ListView);
        lvCategoryList.init(this, 3, 1, 3, 4, 'GameCategoryListCell',
            -380, 230,//起始位置
            0, 30, 15, 0,  //margin
            1, 1,
            function () {
                this.getCategoryList();
            }
        );
        //滚动条位置
        let nodeScrollBtn = cc.find("CategoryList/ScrollBarContainer/ScrollBarShadow/ScrollBarBlock", this.node);
        var fiScrollBtn = nodeScrollBtn.addComponent(FocusInfo);
        this._aFocusTargets[0]['scroll_btn'] = nodeScrollBtn;
        fiScrollBtn.init(null, true);

        // this.getPageBg(this, "background");
        this.addHomeIcon(this);
    },

    getCategoryList: function () {
        let lvCategoryList = this._nodeCategoryList.getComponent(ListView);
        let oCategoryRequestParameters = {
            "view": "json",
            "name": "starIndexnew",
            "sortField": "left",
            "sortDirection": "desc",
        };
        let iStart = 0;
        // //滚行:上翻-4,下翻+4,
        // //滚页:上翻-8,下翻+8
        // if (null != this._oSceneContext.categoryRecordIndexOfFirstCell && this._oSceneContext.categoryRecordIndexOfFirstCell != 0) {
        //     //TODO:回退界面返回原来焦点框位置
        //     iStart = this._oSceneContext.categoryRecordIndexOfFirstCell + this._oSceneContext.iRecordKeyDownOperation;
        // }
        if (null != this._oSceneContext.categoryRecordIndexOfFirstCell) {
            iStart = this._oSceneContext.categoryRecordIndexOfFirstCell;
        }

        lvCategoryList.setDataSource(
            "GET",
            Common.TOPDRAW_API_SERVER + "Promotion/ListItemByName",
            oCategoryRequestParameters,
            iStart, (lvCategoryList.getShowCellRows() + lvCategoryList.getAlphaCellRows()) * lvCategoryList.getCellCountEachRow(),
            "left", "desc"
        );

        lvCategoryList.loadData(
            function (strResponse) {
                strResponse = GameLobbyCategoryJson.gameCategory;     //暂时采用假数据
                // cc.log("网络列表:" + JSON.stringify(strResponse));
                lvCategoryList.renderInitData(JSON.stringify(strResponse)); //将假数据转成字符串在给过去
                this._bIsCategoryListDataInit = true;
                this._oSceneContext.categoryRecordIndexOfFirstCell = lvCategoryList.getRecordIndexOfFirstCellInPage();
                this.checkDataReadyAndInitFocus();
            },
            null,
            this
        );

        var self = this;
        lvCategoryList.setDataPositionRender(function (iPosition, iCount) {
            //这里是ListView的this 执行时作用域
            let nodeDataPosition = self.node.getChildByName('DataPosition');
            if (null == iCount) {
                iCount = parseInt(nodeDataPosition.getComponent(cc.Label).string.split('/')[1]);
                cc.log(iCount);
            }
            nodeDataPosition.getComponent(cc.Label).string = Math.ceil(Math.min((iPosition + this._iShowCellRows * this._iCellCountEachRow - 1), iCount) / this._iShowCellRows / this._iCellCountEachRow) + " / " + Math.ceil(iCount / this._iShowCellRows / this._iCellCountEachRow);
            nodeDataPosition.x = Common.SCREEN_WIDTH / 2 - 100 - nodeDataPosition.width / 2;
            // this._compSceneCanvas.checkCountAndDisplayTopBtns(iCount);
        });
    },

    checkDataReadyAndInitFocus: function () {
        if (this._bIsCategoryListDataInit && !this._bIsFocusInit) {
            this.scheduleOnce(() => {           //指定0让回调函数在下一帧立即执行
                this.initFocus();
            }, 0.1);
            this._bIsFocusInit = true;
        }
    },

    initFocus: function () {
        var nodeInitFocus = cc.find(this._oSceneContext.focusPath, this.node);
        var nodeFocus = new cc.Node('nodeFocus');
        this.node.addChild(nodeFocus, 10);
        this._cFocus = this.node.getChildByName('nodeFocus').addComponent(TVFocus);
        this._cFocus.init('focusContainer', this,
            nodeInitFocus.getComponent(FocusInfo),
            Common.SCREEN_WIDTH, Common.SCREEN_HEIGHT, 0, 0, 1.0);
        // cc.log("nodeInitFocus的name:"+nodeInitFocus.name);
        // if (0 == nodeInitFocus.name.indexOf('StarListCell')) {
        //     cc.loader.loadRes('texture/ui/home_pserson_bg', cc.Texture2D, function (err, texture) {
        //         nodeInitFocus.getChildByName('Bg').getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture, cc.rect(0, 214, 214, 214));
        //     });
        // }
    },

    onKeyDown: function (event) {
        this._super(event);
        var fiFocusTarget = null;
        var fiCurrentFocus = this._fiCurrentFocus;
        var oScrollParameter = null;
        //TODO:给ListView传值,使其可以让滑块跟随滚动
        let lvCategoryList = this.node.getChildByName('CategoryList').getComponent(ListView);
        if (lvCategoryList) {
            lvCategoryList.setCurrentFocus(this._fiCurrentFocus);
        }
        if (event.keyCode == cc.macro.KEY.up || event.keyCode == Common.ANDROID_KEY.up) {
            if (this._bIsCategoryItemMoving || this._bIsSongListMoving) {
                return;
            }
            if (0 == this._fiCurrentFocus.node.getName().indexOf('ScrollBarBlock')) { //如果滚动条
                let lvCategoryList = this.node.getChildByName('CategoryList').getComponent(ListView);
                if (lvCategoryList.scrollAPageUp()) {
                    // this._oSceneContext.iRecordKeyDownOperation = -8;
                    // this._oSceneContext.categoryRecordIndexOfFirstCell = lvCategoryList.getRecordIndexOfFirstCellInPage();
                }
                return;
            }
            if (0 == this._fiCurrentFocus.node.getName().indexOf('StarListCell')) {
                var index = parseInt(this._fiCurrentFocus.node.getName().replace('StarListCell', ''));
                let lvCategoryList = this.node.getChildByName('CategoryList').getComponent(ListView);
                if (lvCategoryList.scrollARowUp(index)) {
                    // this._oSceneContext.iRecordKeyDownOperation = -4;
                    // this._oSceneContext.categoryRecordIndexOfFirstCell = lvCategoryList.getRecordIndexOfFirstCellInPage();
                    return;
                }
            }
            fiFocusTarget = this._cFocus.findTarget(fiCurrentFocus, this._aFocusTargets, 0, Common.MOVE_DIRECTION_UP);
            this._cFocus.flyFocus(this._fiCurrentFocus, fiFocusTarget, Common.MOVE_DIRECTION_UP, null, oScrollParameter);
        }
        if (event.keyCode == cc.macro.KEY.right || event.keyCode == Common.ANDROID_KEY.right) {
            fiFocusTarget = this._cFocus.findTarget(this._fiCurrentFocus, this._aFocusTargets, 0, Common.MOVE_DIRECTION_RIGHT);
            this._cFocus.flyFocus(this._fiCurrentFocus, fiFocusTarget, Common.MOVE_DIRECTION_RIGHT, null, oScrollParameter);
        }
        if (event.keyCode == cc.macro.KEY.down || event.keyCode == Common.ANDROID_KEY.down) {
            if (this._bIsCategoryItemMoving || this._bIsSongListMoving) {
                return;
            }
            if (!this._iScrollGroupStatus) {
                if (0 == this._fiCurrentFocus.node.getName().indexOf('ScrollBarBlock')) { //如果是滚动条
                    let lvCategoryList = this.node.getChildByName('CategoryList').getComponent(ListView);
                    if (lvCategoryList.scrollAPageDown()) {
                        // this._oSceneContext.iRecordKeyDownOperation = 8;
                        // this._oSceneContext.categoryRecordIndexOfFirstCell = lvCategoryList.getRecordIndexOfFirstCellInPage();
                    }
                    return;
                }
                if (0 == this._fiCurrentFocus.node.getName().indexOf('StarListCell')) {
                    var index = parseInt(this._fiCurrentFocus.node.getName().replace('StarListCell', ''));
                    let lvCategoryList = this.node.getChildByName('CategoryList').getComponent(ListView);
                    if (lvCategoryList.scrollARowDown(null, index)) {
                        // this._oSceneContext.iRecordKeyDownOperation = 4;
                        // this._oSceneContext.categoryRecordIndexOfFirstCell = lvCategoryList.getRecordIndexOfFirstCellInPage();
                        return;
                    }
                }
                fiFocusTarget = this._cFocus.findTarget(this._fiCurrentFocus, this._aFocusTargets, 0, Common.MOVE_DIRECTION_DOWN);
                this._cFocus.flyFocus(this._fiCurrentFocus, fiFocusTarget, Common.MOVE_DIRECTION_DOWN, null, oScrollParameter);

            }
        }
        if (event.keyCode == cc.macro.KEY.left || event.keyCode == Common.ANDROID_KEY.left) {
            fiFocusTarget = this._cFocus.findTarget(this._fiCurrentFocus, this._aFocusTargets, 0, Common.MOVE_DIRECTION_LEFT);
            this._cFocus.flyFocus(this._fiCurrentFocus, fiFocusTarget, Common.MOVE_DIRECTION_LEFT, null, oScrollParameter);
        }
        if (event.keyCode == cc.macro.KEY.enter || event.keyCode == Common.ANDROID_KEY.enter) {
            this.doCurrentFocusTVLinkAction(Common.TV_LINK_ACTION_CLICK);
        }
        if (event.keyCode == cc.macro.KEY.space) {
            // this.doCurrentFocusTVLinkAction(Common.TV_LINK_ACTION_CLICK);
        }
        if (event.keyCode == cc.macro.KEY.backspace || event.keyCode == Common.ANDROID_KEY.back) {
            this.backAScene();
        }

        //记录CategoryList滚动位置
        if (lvCategoryList) {
            this._oSceneContext.categoryRecordIndexOfFirstCell = lvCategoryList.getRecordIndexOfFirstCellInPage();
        }

    },

    onBeforeFocusChange: function (event) {
        this._super(event);
        let fiFrom = event.detail.from;
        let fiTo = event.detail.to;
        // if (0 == fiFrom.node.getName().indexOf('StarListCell')) {
        //     // cc.loader.loadRes('Texture/common/home_pserson_bg', cc.Texture2D, function (err, texture) {
        //     // fiFrom.node.getChildByName('Bg').getComponent(cc.Sprite).spriteFrame.setRect(cc.rect(0, 0, 214, 214));
        //     cc.loader.loadRes('texture/ui/home_pserson_bg', cc.Texture2D, function (err, texture) {
        //         fiFrom.node.getChildByName('Bg').getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture, cc.rect(0, 0, 214, 214));
        //     });
        //     // });
        // }
    },

    onAfterFocusChange: function (event) {
        this._super(event);
        let fiFrom = event.detail.from;
        let fiTo = event.detail.to;
        // if (0 == fiTo.node.getName().indexOf('StarListCell')) {
        //     cc.loader.loadRes('texture/ui/home_pserson_bg', cc.Texture2D, function (err, texture) {
        //         fiTo.node.getChildByName('Bg').getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture, cc.rect(0, 214, 214, 214));
        //     });
        // }
    },

    doCurrentFocusTVLinkAction: function (strAction) {
        let strTVLink = this._fiCurrentFocus.getTVLink();
        var joTVLink = null;
        try {
            joTVLink = JSON.parse(strTVLink);
            let jaOperationList = joTVLink.click;
            for (let i = 0; i < jaOperationList.length; i++) {
                switch (jaOperationList[i].action) {
                    default:
                        this.doTVLinkAction(jaOperationList[i]);
                        break;
                }
            }
        } catch (error) {
            cc.log("runTVLinkAction Exception..." + error);
        }
    },

    onListScrollStart: function () {
        this._bIsSongListMoving = true;
        cc.log("scroll start");
    },
    onListScrollEnd: function () {
        this._bIsSongListMoving = false;
        cc.log("scroll completed");
    },

    onDestroy: function () {
        cc.director.emit('stop_render');   //分发事件
    },
});