MainScene.ts 8.81 KB
// Learn TypeScript:
//  - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
//  - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html

import { GuideManager } from "../component/GuideManager";
import { SaveDataManager } from "../component/SaveDataManager";
import { SoundManager } from "../component/SoundManager";
import { GlobalEvent, ResType, tMgr } from "../Global";

import { getGlobalNode } from "../kernel/battle/BattleConst";
import { GameSceneObjTableMgr } from "../kernel/table/GameSceneObjTableMgr";
import { GamePlayTable, GameSceneObjTable, TableName } from "../kernel/table/TableDefine";
import GameSceneControl from "../ui/gameScene/GameSceneControl";
import { UIManager } from "../ui/UIManager";
import ResWidget from "../ui/uiView/widget/ResWidget";

const { ccclass, property } = cc._decorator;

@ccclass
export default class MainScene extends cc.Component {

    private _pageView: cc.PageView;
    private _buildScenePrefab: cc.Node;

    private _charNode: cc.Node;
    private _tipNode: cc.Node;
    private _parGreenNode: cc.Node;
    private _bgLightNode: cc.Node;
    private _unlockSpineNode: cc.Node;

    //#region  LIFE-CYCLE CALLBACKS:

    onLoad() {

        getGlobalNode().on(GlobalEvent.OBJ_UNLOCK_ANI_FINISH, this.onObjUnlock, this);
        getGlobalNode().on(GlobalEvent.SOUND_MUSIC_CONFIG_CHANGE, this.onSoundConfigChange, this);

        let guideNode = this.node.getChildByName('guideNode');
        if (guideNode.childrenCount > 0) {
            GuideManager.ins.init(guideNode);
        }


    }

    start() {
        this.node.getChildByName('widgetStar').getComponent(ResWidget).setType(ResType.STAR);
        this.node.getChildByName('widgetDiamond').getComponent(ResWidget).setType(ResType.DIAMOND);

        this._pageView = cc.find('gameSceneRoot/pageView', this.node).getComponent(cc.PageView);
        this._buildScenePrefab = cc.find('gameSceneRoot/container', this.node);
        this._charNode = cc.find('gameSceneRoot/' + (SaveDataManager.ins.runtimeData.gender == 0 ? 'girl' : 'boy'), this.node);
        this._tipNode = cc.find('gameSceneRoot/unlockTip', this.node);
        this._parGreenNode = cc.find('gameSceneRoot/parGreen', this.node);
        this._bgLightNode = cc.find('gameSceneRoot/bg', this.node);
        this._unlockSpineNode = cc.find('gameSceneRoot/unlockSpine', this.node);

        let curScene = SaveDataManager.ins.runtimeData.curGameScene;

        for (let i = 1; i < 4; ++i) {
            if (i <= curScene) {
                this.addScene(i);
            }
        }

        if (this._pageView.getPages().length == 1) {
            //只有一页,手动刷新
            this._pageView.getPages()[0].getComponent(GameSceneControl).onSlideShow();
        }
        else {
            this._pageView.setCurrentPageIndex(this._pageView.getPages().length - 1);
        }

        this.scheduleOnce(this.checkGuide.bind(this), 0); //等待自适应布局完毕后再检查


    }

    protected onEnable(): void {
        UIManager.ins.widgetLayer.active = true;

        if (SaveDataManager.ins.mainSceneAddStar > 0) {
            SaveDataManager.ins.adjustStar(SaveDataManager.ins.mainSceneAddStar, true);
            SaveDataManager.ins.mainSceneAddStar = 0;
        }

        //预加载地图
        let maxLevel = (tMgr.getConfig(TableName.GAME_PLAY, 22) as GamePlayTable).Value;
        let nextLevelId = SaveDataManager.ins.runtimeData.curLevel + 1;
        if (nextLevelId > maxLevel) {
            nextLevelId = maxLevel;
        }
        cc.resources.preload('map/map-' + nextLevelId.toString(), cc.TiledMapAsset);

        this.onSoundConfigChange(SaveDataManager.ins.runtimeData.musicMute);


    }

    protected onDisable(): void {
        this._sceneEffectAudioId > -1 && cc.audioEngine.stopEffect(this._sceneEffectAudioId);
    }

    protected onDestroy(): void {
        // getGlobalNode().off(GlobalEvent.OBJ_UNLOCK_ANI_FINISH, this.onObjUnlock, this);
        getGlobalNode().targetOff(this);
    }

    update(dt) {
        let backNode = cc.find('gameSceneRoot/pageView/backImgContainer', this.node);
        let contentNode = cc.find('gameSceneRoot/pageView/content', this.node);
        backNode.setPosition(contentNode.position);
        let lightNode = cc.find('gameSceneRoot/pageView/effectLayer', this.node);
        lightNode.setPosition(contentNode.position);
    }

    //#endregion

    //#region event

    onPageSlide(view: cc.PageView) {

        let page = view.getCurrentPageIndex();
        let pages = view.getPages();

        for (let i = 0; i < pages.length; ++i) {
            pages[i].getComponent(GameSceneControl).onSlideLeave();
        }
        pages[page].getComponent(GameSceneControl).onSlideShow();

    }

    onToolClick(e: cc.Event.EventTouch) {
        let curPage = this._pageView.getCurrentPageIndex();
        this._pageView.getPages()[curPage].getComponent(GameSceneControl).onToolClick(e);
    }

    onObjUnlock(objId: number) {

        let obj = tMgr.getConfig(TableName.GAME_SCENE_OBJ, objId) as GameSceneObjTable;

        let sceneList = GameSceneObjTableMgr.ins.getByScene(obj.SceneId);

        let allUnlock: boolean = true;
        for (let i = 0; i < sceneList.length; ++i) {
            //判断此场景内的每个物件是否解锁
            if (!SaveDataManager.ins.runtimeData.unlockObj.includes(sceneList[i].ID)) {
                allUnlock = false;
                break;
            }
        }

        if (allUnlock && obj.SceneId < 3) {
            //添加下一场景
            SaveDataManager.ins.runtimeData.curGameScene++;
            SaveDataManager.ins.saveData();
            this.addScene(obj.SceneId + 1);
            this._pageView.setCurrentPageIndex(obj.SceneId);
        }
    }

    private _sceneEffectAudioId: number = -1;

    private onSoundConfigChange(mute: boolean) {

        let sceneEffect = cc.resources.get('soundEffect/Scene', cc.AudioClip) as cc.AudioClip;

        if (!mute) {
            SoundManager.ins.playMusic();
            this._sceneEffectAudioId = cc.audioEngine.playEffect(sceneEffect, true);
        }
        else {
            SoundManager.ins.stopMusic();
            this._sceneEffectAudioId > -1 && cc.audioEngine.stopEffect(this._sceneEffectAudioId);
        }
    }

    //#endregion

    //#region public

    onGuideClick() {
        this.node.getChildByName('mask').active = false;
        GuideManager.ins.hideTalk();
        GuideManager.ins.hideHand();

        // SaveDataManager.ins.runtimeData.guideStep++;
        // SaveDataManager.ins.saveData();
    }

    //#endregion

    //#region private

    private addScene(sceneId: number) {
        let buidScene = cc.instantiate(this._buildScenePrefab);
        buidScene.active = true;
        buidScene.getComponent(GameSceneControl).init(sceneId - 1, this._charNode, this._tipNode, this._parGreenNode, this._bgLightNode, this._unlockSpineNode);
        buidScene.getComponent(GameSceneControl).loadScene(sceneId);
        this._pageView.addPage(buidScene);
    }

    private checkGuide() {
        //引导
        if (SaveDataManager.ins.runtimeData.guideStep == 0) {
            let wpos = this._charNode.convertToWorldSpaceAR(cc.v2(0, 380));
            let txt = (tMgr.getConfig(TableName.GAME_PLAY, 25) as GamePlayTable).Comment;
            GuideManager.ins.showTalk(wpos, txt);
            this.scheduleOnce(() => {
                GuideManager.ins.hideTalk();
                SaveDataManager.ins.runtimeData.guideStep++;
                SaveDataManager.ins.saveData();
                this.checkGuide();
            }, 3);
        }
        else if (SaveDataManager.ins.runtimeData.guideStep == 1) {
            let wpos = this.node.getChildByName('UITitle').getChildByName('bottom').convertToWorldSpaceAR(cc.v2(0, 120));
            GuideManager.ins.showHand(wpos, true);

            wpos = this.node.getChildByName('UITitle').getChildByName('bottom').convertToWorldSpaceAR(cc.v2(0, 100));
            wpos.y += 200;
            let txt = (tMgr.getConfig(TableName.GAME_PLAY, 26) as GamePlayTable).Comment;
            txt = txt.replace('{0}', (tMgr.getConfig(TableName.GAME_PLAY, SaveDataManager.ins.runtimeData.gender == 0 ? 24 : 23) as GamePlayTable).Comment);
            GuideManager.ins.showTalk(wpos, txt);

            let btn = cc.find('UITitle/bottom/naviBar/btnLayer/btn3', this.node);
            wpos = btn.convertToWorldSpaceAR(cc.Vec2.ZERO);
            UIManager.ins.widgetLayer.convertToNodeSpaceAR(wpos, wpos);
            let newBtn = cc.instantiate(btn);
            newBtn.setPosition(wpos);
            newBtn.getComponent(cc.Button).clickEvents[0].customEventData = '99';
            UIManager.ins.widgetLayer.addChild(newBtn);

            this.node.getChildByName('mask').active = true;

        }
    }

    //#endregion
}