cocos-lua是怎么实现场景的切换的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cocos-lua是怎么实现场景的切换的相关的知识,希望对你有一定的参考价值。

参考技术A 适用版本cocos2dx 2.2.5

[plain] view plain copy
--切换到下一场景
local function NextScene(scene)
runningScene = CCDirector:sharedDirector():getRunningScene()
local trans = CCTransitionFade:create(1.5, scene)
if runningScene == nil then
CCDirector:sharedDirector():runWithScene(trans)
else
CCDirector:sharedDirector():replaceScene(trans)
end
end
CCTransitionFade淡出。

下列转, C++

[cpp] view plain copy
void StartScene::beginGame()

CCLog("beginGame");

//CCTransitionScene *trans = CCTransitionScene::create(2, level);
//CCDirector::sharedDirector()->replaceScene(level);
//场景切换
CCTransitionScene *reScene = NULL;
CCScene *s = LevelScene::scene();

float t = 1.2f;

// CCTransitionJumpZoom
// 作用: 创建一个跳动的过渡动画
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionJumpZoom ::create(t , s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressRadialCCW
// 作用: 创建一个扇形条形式的过渡动画, 逆时针方向
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressRadialCCW::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressRadialCW
// 作用: 创建一个扇形条形式的过渡动画, 顺时针方向
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressRadialCW::create(t,s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressHorizontal
// 作用: 创建一个水平条形式的过渡动画,
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressHorizontal ::create(t,s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressVertical
// 作用: 创建一个垂直条形式的过渡动画,
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressVertical::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressInOut
// 作用: 创建一个由里向外扩展的过渡动画,
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressInOut::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressOutIn
// 作用: 创建一个由外向里扩展的过渡动画,
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressOutIn::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionCrossFade
// 作用:创建一个逐渐透明的过渡动画
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionCrossFade::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionPageTurn
// 作用:创建一个翻页的过渡动画
// 参数1:过渡动作持续的时间
// 参数2:切换的目标场景的对象
// 参数3:是否逆向翻页
// reScene = CCTransitionPageTurn::create(t, s, false);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFadeTR
// 作用:创建一个部落格过渡动画, 从左下到右上
// 参数1:过渡动作持续的时间
// 参数2:切换的目标场景的对象
// reScene =CCTransitionFadeTR::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFadeBL
// 作用:创建一个部落格过渡动画, 从右上到左下
// 参数1:过渡动作持续的时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionFadeBL::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFadeUp
// 作用:创建一个从下到上,条形折叠的过渡动画
// 参数1:过渡动作持续的时间
// 参数2:切换的目标场景的对象
// reScene= CCTransitionFadeUp::create(t, s);
// CCDirector::sharedDirector()->replaceScene(s);

// CCTransitionFadeDown
// 作用:创建一个从上到下,条形折叠的过渡动画
// 参数1:过渡动作持续的时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionFadeDown::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionTurnOffTiles
// 作用:创建一个随机方格消失的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
reScene= CCTransitionTurnOffTiles::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSplitRows
// 作用:创建一个分行划分切换的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionSplitRows::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSplitCols
// 作用:创建一个分列划分切换的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionSplitCols::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFade
// 作用:创建一个逐渐过渡到目标颜色的切换动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:目标颜色
// reScene= CCTransitionFade::create(t, s, ccc3(255, 0, 0));
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFlipX
// 作用:创建一个x轴反转的切换动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// kOrientationDownOver kOrientationLeftOver kOrientationRightOver kOrientationUpOver
// reScene = CCTransitionFlipX::create(t, s, kOrientationRightOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFlipY
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// reScene = CCTransitionFlipY::create(t, s
// , kOrientationDownOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFlipAngular
// 作用:创建一个带有反转角切换动画
// // 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// reScene = CCTransitionFlipAngular::create(t, s, kOrientationLeftOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionZoomFlipX
// 作用:创建一个带有缩放的x轴反转切换的动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// reScene=CCTransitionZoomFlipX::create(t, s, kOrientationLeftOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionZoomFlipY
// 作用:创建一个带有缩放的Y轴反转切换的动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// reScene=CCTransitionZoomFlipY::create(t, s, kOrientationDownOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionZoomFlipAngular
// 作用:创建一个带有缩放 ,反转角切换的动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// reScene=CCTransitionZoomFlipAngular::create(t, s, kOrientationRightOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionShrinkGrow
// 创建一个放缩交替的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionShrinkGrow::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionRotoZoom
// 创建一个旋转放缩交替的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionRotoZoom::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionMoveInL
// 作用:创建一个从左边推入覆盖的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionMoveInL::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionMoveInR
// 作用:创建一个从右边推入覆盖的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionMoveInR::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionMoveInB
// 作用:创建一个从下边推入覆盖的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionMoveInB::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionMoveInT
// 作用:创建一个从上边推入覆盖的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionMoveInT::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSlideInL
// 作用:创建一个从左侧推入并顶出旧场景的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene =CCTransitionSlideInL::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSlideInR
// 作用:创建一个从右侧推入并顶出旧场景的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene =CCTransitionSlideInR::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSlideInT
// 作用:创建一个从顶部推入并顶出旧场景的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene =CCTransitionSlideInT::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSlideInB
// 作用:创建一个从下部推入并顶出旧场景的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
//reScene =CCTransitionSlideInB::create(t, s);
CCDirector::sharedDirector()->replaceScene(reScene);

Egret场景切换管理类切换和单例使用方法

场景切换是很多开发者在开发过程中必不可少的一个环节,当项目中有两个或两个以上的游戏场景时,怎样管理这些场景,能够使它们之间的切换更加方便呢?今天就为大家介绍场景切换管理类的切换方法和单例的使用方法。

案例源码:https://github.com/hkjlx/qhcj

首先创建一个所有场景的父类Scene

Scene类主要是为了方便管理场景,此类是一个抽象类,子类必须继承此类并实现onComplete()抽象方法才能进行场景的切换。

abstract class Scene extends eui.Component{
    public constructor() {
        super();
        // 监听组件创建完毕 也就是场景的外观创建完毕
        this.addEventListener(eui.UIEvent.CREATION_COMPLETE,this.onComplete,this);
    }
     protected abstract onComplete();
}

场景管理器SceneManger

所有场景的切换,弹出关闭都是由SceneManger类来控制,这样方便对场景进行统一管理。

1.使用单例模式

SceneManger类需要使用到单例模式,单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。

class SceneManager {
    private static _manager:SceneManager;
    public static get Instance(){
        if( SceneManager._manager==null){
            SceneManager._manager = newSceneManager();
        }
        return SceneManager._manager;
    }
    public constructor() {
    }
}

2.控制场景切换的方法

changeScene()方法:当舞台上有场景时,会先将当前场景从舞台移除,再添加新场景到舞台上;当舞台还没有场景时,会直接添加到舞台上。

 public rootLayer:eui.UILayer;//起始场景
    private currentScene:Scene;//需要显示的场景
    private pop_scene:Scene;//弹出场景层
    //切换场景
    public changeScene(s:Scene){
        if(this.currentScene){
           this.rootLayer.removeChild(this.currentScene);
            this.currentScene = null;
        }
        this.rootLayer.addChild(s);
        this.currentScene = s;
    }

3.弹出场景和关闭弹出场景

弹出场景不会使底层场景消失,而是直接在当前场景上再显示一个场景出来(主要用于设置面板之类的)。

在弹出场景时先调用了一次关闭场景层,防止还没关闭场景层又点击了弹出场景层。

//弹出场景层
    public pushScene(s:Scene){
        this.popScene();
        if(!this.pop_scene){
            this.rootLayer.addChild(s);
            this.pop_scene = s;
        }
    }
    //关闭场景层
    public popScene(){
        if(this.pop_scene){
            this.rootLayer.removeChild(this.pop_scene);
            this.pop_scene = null;
        }
    }

在入口文件 Main.ts 中引入场景管理类 SceneManage

首先将Main.ts中createGameScene()方法中的代码删掉,再调用下面的方法,将this定为起始场景(舞台)。

SceneManager.Instance.rootLayer = this;


使用eui创建三个场景和一个弹出场景

使用eui创建三个场景,分别为:开始场景(StartScene.exml),游戏场景(GameScene.exml),结束场景(EndScene.exml)。

下图示例为开始场景(StartScene.exml):

技术分享图片

使用eui创建弹出层(TanChu.exml)。

下图示例为弹出场景:

技术分享图片

eui文件创建完成之后需在终端中输入egret build编译项目,这时会在default.thm.json 文件中生成皮肤对应的skinName。

技术分享图片

开始场景(StartScene.ts)、游戏场景(GameScene.ts),结束场景(EndScene.ts)对应的TS文件

由于StartScene类继承自Scene抽象类,所以在此类中必须得实现onComplete()方法,示例代码如下:

class StartScene extends Scene {
        public btn_tc: eui.Label;//弹出层按钮
        public btn_qh2: eui.Label;//切换场景

        public constructor() {
            super();
            //指定开始场景对应的皮肤文件StartScene.exml
            this.skinName ="resource/game/StartScene.exml";
        }
        //实现父类的onComplete方法
        protected onComplete() {
            //设置两个Label为可点击
            this.btn_tc.touchEnabled =true;
            this.btn_qh2.touchEnabled =true;
            //添加点击事件
           this.btn_tc.addEventListener(egret.TouchEvent.TOUCH_TAP, this.onTaptc,this);
            this.btn_qh2.addEventListener(egret.TouchEvent.TOUCH_TAP,this.onTapqiehuan, this);
        }
        //弹出场景
        private onTaptc(){
        }
        private onTapqiehuan(){
        }
}

游戏场景(GameScene),结束场景(EndScene)对应的ts文件基本与开始场景一致。

可参考源码:https://github.com/hkjlx/qhcj

游戏初始化时在Main.ts中的createGameScene()方法添加开始游戏场景(StartScene),切换场景时调用SceneManager.Instance.changeScene()即可;注意:此处参数为一个场景实例。

let s1:StartScene = new StartScene();
SceneManager.Instance.changeScene(s1);

弹出场景层方法

在对应的点击事件中调用pushScene()方法。

let tc:Tanchu = new Tanchu();
SceneManager.Instance.pushScene(tc);//添加场景弹出层

如果需要关闭弹出场景层,在弹出场景层的类中调用popScene()方法。

SceneManager.Instance.popScene();//移除场景层

小结

本文主要讲解了场景切换管理类的切换方法和单例的使用方法,有任何技术问题或者觉得这篇文章对你有所帮助,欢迎留言与我们交流互动!

以上是关于cocos-lua是怎么实现场景的切换的的主要内容,如果未能解决你的问题,请参考以下文章

cocos-lua

cocos-lua3.17 Lua tablrView工具类

Cocos2d-x多场景切换生命周期

Cocos Creator 最简易例子,场景切换,节点挂载脚本

cocos2dx CCTransitionScene

cocos2dx CCTransitionScene