cocos2dx4.0怎么切换场景?

2021-07-06 17:54发布

9条回答

我们要切换场景,那么得有一个触发点,我们就用HelloWorld右下角的关闭按钮来实现吧。


我们要做的是,按下关闭按钮,不是关闭窗口而是切换到MyHelloWorldScene。那么我们看一下HelloWorldScene.cpp的menuCloseCallback()函数吧。把关闭处理去掉,加上一句话就可以了。


void HelloWorld::menuCloseCallback(Ref* sender)

{

    //Director::getInstance()->end();

    Director::getInstance()->replaceScene(MyHelloWorld::createScene());

}


我把MyHelloWorld里面的Label文字和图片都改了,这样看着能清晰一些。


特殊效果

这么直接的变换有点太土了,如何增加一些变换效果呢。Cocos2dx已经为我们准备好函数了,只需要变成下面的代码就OK了。


void HelloWorld::menuCloseCallback(Ref* sender)

{

    //Director::getInstance()->end();

    Director::getInstance()->replaceScene(TransitionSlideInT::create(2.0f, MyHelloWorld::createScene()));

}

看一下效果,是不是有初步大片的感觉了。




TransitionSlideInT也是一个场景类,它通过Create函数就创建出这种带有滑动效果的场景。


它有两个参数,


float f:场景切换的时间,秒


Scene* scene:你要切换的目标场景


Cocos2dx不只提供了这一种特效,还有其他很多,


比如:TransitionJumpZoom:原场景缩小弹出,新场景放大弹入。




再有TransitionFadeUp:从下到上的百叶窗效果:


场景的推进和弹出

用replaceScene切换场景,新场景显示出来后,旧的场景资源会被释放。这是非常必要的,因为一个场景有时候会很大,所以切换场景后必须释放旧场景的资源。


那么有些时候,我们不希望旧场景被释放,想新旧场景来回切换,这个就用到了场景的推进和弹出。


把replaceScene换成pushScene:


// HelloWorldScene.cpp

void HelloWorld::menuCloseCallback(Ref* sender)

{

    //Director::getInstance()->end();

    Director::getInstance()->pushScene(TransitionSplitCols::create(2.0f, MyHelloWorld::createScene()));

}

然后在MyHelloWorldScene里,做下面的修改:


// MyHelloWorldScene.h

void backToScene(Ref* sender);

 

// MyHelloWorldScene.cpp

    auto closeItem = MenuItemImage::create(

        "CloseNormal.png",

        "CloseSelected.png",

        CC_CALLBACK_1(MyHelloWorld::backToScene, this));

 

void MyHelloWorld::backToScene(Ref* sender)

{

    Director::getInstance()->popScene();

}

popScene和pushScene函数是对应关系。用popScene()函数就可以回到原来的场景了,MyHelloWorld的场景资源会被释放。


一个Ai
3楼 · 2021-07-08 10:10

我们创建两个场景,然后再场景中分别创建一个菜单条目来实现场景跳转函数接口的调用!这样我们点击了场景一的菜单条目,就会跳到第二个场景,再点击场景二的菜单条目,就会跳回一个场景。思路就这样。


好!现在开始编写场景的代码,我就直接给代码了,如果有不懂的可以留言问:


MyFirstScene.h:


#pragma once

#include "cocos2d.h" //包含头文件

 

using namespace cocos2d; //使用cocos2d命名空间

 

class MyFirstScene : public Layer //新建一个类,继承层(Layer)

{

public:

    static Scene* createScene(); //MyFirstScene场景创建实现

 

    virtual bool init(); //MyFirstScene层的初始化

 

    CREATE_FUNC(MyFirstScene); //创建MyFirstScene的Create方法

 

    void EnterSecondScene(Ref *pSender); //创建一个菜单回调函数,这里实现了场景的跳转

};

MyFirstScene.cpp:

#include "MyFirstScene.h"

#include"MySecondScene.h"

 

//MyFirstScene场景创建实现

Scene* MyFirstScene::createScene()

{

    auto scene = Scene::create(); //创建一个场景

    auto layer = MyFirstScene::create();//创建一个MyFirstScene层

    scene->addChild(layer); //把MyFirstScene层加入刚刚创建的场景中,

    return scene; //返回这个场景

}

 

bool MyFirstScene::init()

{

    if ( !Layer::init() ) //先初始化父类的init方法,如何初始化失败,则创建MyFirstScene层失败

    {

        return false;

    }

Size VisibleSize = Director::getInstance()->getVisibleSize(); //获得屏幕大小

 

auto label = Label::createWithSystemFont("Hello,This is MyFirstScene", "fonts/arial.ttf", 30);//创建一个标签

//菜单条目的创建有多种,之前的HelloWorld.cpp中实现的是图片菜单条目(MenuItemImage),即根据图片来创建菜单条目

//这里是根据标签来创建菜单条目,然后设置回调函数

auto menuitem = MenuItemLabel::create(label,CC_CALLBACK_1(MyFirstScene::EnterSecondScene,this));

//创建好了菜单条目,就需要加入菜单中,所以下面就是创建菜单

auto menu = Menu::create(menuitem, NULL);

//把菜单添加到MyFirstScene层中

this->addChild(menu);

 

    return true;

}

//菜单回调函数的实现

void MyFirstScene::EnterSecondScene(Ref *pSender)

{

//我们知道,如果需要跳转场景,就会想到一个类,它就是Director类,它就是管理场景的

//这里跳转场景调用到的是导演类的这个接口:replaceScene(Scene *scene),里面传进去的是就是一个场景,这里需要注意的是场景二的头文件这是要加上的

Director::getInstance()->replaceScene(MySecondScene::createScene());

}

好了,其实上面注释也写的挺清楚了,就不再多说了,下面的MySecondScene场景的实现就没有注释了,因为基本都是一样的,如果有看不懂的,可以参照场景一的代码注释进行查看~

MySecondScene.h:


#pragma once

#include"cocos2d.h"

 

using namespace cocos2d;

 

class MySecondScene :public Layer

{

public:

static Scene *createScene();

 

CREATE_FUNC(MySecondScene);

 

virtual bool init();

 

void EnterFirstScene(Ref *pSender);

};

MySecondScene.cpp:

#include"MySecondScene.h"

#include"MyFirstScene.h"

 

Scene *MySecondScene::createScene()

{

Scene* scene = Scene::create();

MySecondScene *layer = MySecondScene::create();

scene->addChild(layer);

return scene;

}

 

bool MySecondScene::init()

{

if (!Layer::init())

{

return false;

}

 

Size VisibleSize = Director::getInstance()->getVisibleSize();

 

auto label = Label::createWithSystemFont("Hello,This is MySecondScene", "fonts/arial.ttf", 30);

auto menuitem = MenuItemLabel::create(label, CC_CALLBACK_1(MySecondScene::EnterFirstScene, this));

auto menu = Menu::create(menuitem, NULL);

this->addChild(menu);

 

return true;

}

 

void MySecondScene::EnterFirstScene(Ref *pSender)

{

//跳转到第一个场景,记得包含第一个场景的头文件:MyFirstScene.h

Director::getInstance()->replaceScene(MyFirstScene::createScene());

}

编写完成之后就可以运行了,然后效果如下:


不知读者实现了么有~


最后,既然见到这个场景的跳转问题,就在此基础上加个比较有意思的效果,那就是场景跳转的方式。


使用很简单,就是在跳转场景的前面创建一个切换的效果就行了,比如创建一个淡入淡出效果:TransitionFade::create(float t,cocos2d::Scene *scene);


第一个参数就是场景跳转时所需要的时间,第二个就是跳转的场景了。然后使用如下:


Director::getInstance()->replaceScene(TransitionFade::create(1.0f,MySecondScene::createScene()));


运行效果就不贴出来了~


关于跳转方式,cocos官方提供的好多种跳转方式,比如淡入淡出效果,向上、向下、向左及向右跳转等等,反正挺多的,下面我就把它们部分的写出来,具体大家可以去试一下:


TransitionFade(淡入淡出效果)


TransitionFadeBL(从右上到左下消失)


TransitionFadeTR(从左下到右上消失)


TransitionCrossFade(对象交替呈现)


TransitionFadeDown(从上到下百叶窗效果)


TransitionFadeUp(从下到上百叶窗效果)


TransitionFlipAngular(轻弹效果的翻转)


TransitionFlipX(水平翻转)


TransitionFlipY(垂直翻转)


TransitionJumpZoom(跳跃试效果)


。。。。。。。。。。。。


(因为效果挺多的,而且有些是重复的,只是方向变了下,所以在这里我就不列出来了。仔细看看,这些效果都有一个特性,就是前面都存在Transition这么一个单词,这个单词是跳转的意思。其实Vs上也是有提示的,只要往那一打这么个词,后面就会提示很多效果了,这个就可以慢慢去找自己想要的效果。)

梅向南
4楼 · 2021-07-09 14:02
  1. Director::getInstance()->replaceScene(要切换的场景::createScene());



我是大脸猫
5楼 · 2021-08-05 16:52

//Director::getInstance()->replaceScene(sence2::createScene());//




auto director = Director::getInstance();

auto sc = sence2::createScene();

director->replaceScene(sc); 


上下两部分代码应该是一样的吧,上面的可以,下面的无法运行


小狮子
6楼 · 2021-08-06 15:22

Director::getInstance()->replaceScene(MyHelloWorld::createScene());

蜗牛
7楼 · 2021-08-13 19:15

Director::getInstance()->replaceScene(MyHelloWorld::createScene());

使用这个代码

py大白
8楼 · 2021-08-25 09:19

菜单按钮的场景切换


恩,现在来进行场景的切换吧,先要创建一个场景,这里就用我以前创建的Welcomscene场景吧,


在里面加一个按钮,通过按钮的回调函数跳转到程序初始原有的HelloWorld场景中。




这里,场景的跳转也有不同方式:


①替换,就是用某个场景替换当前场景,原先场景就被释放掉了。


②栈式,将现在的场景保存,向入栈一样,压入栈中,显示新场景,如果新场景释放,将原场景显示。原场景不释放,耗内存大。




①替换


先演示,替换的,主要就是在回调函数中导演的动作,我先在WelcomeScene场景中新建背景图层即一个菜单按钮。


WelcomeScene.h:



#include "cocos2d.h"

 

class WelcomeScene : public cocos2d::Layer

{

public:

// 创建场景函数

    static cocos2d::Scene* createScene();

virtual bool init();  

 

void menujumpCallback(cocos2d::Ref* pSender);

    // 是一个宏定义

CREATE_FUNC(WelcomeScene);

};


WelcomeScene.cpp:


#include "WelcomeScene.h"

#include "HelloWorldScene.h"

USING_NS_CC;

 

// 创建场景函数

Scene* WelcomeScene::createScene()

{

auto scene = Scene::create();

auto layer = WelcomeScene::create();

scene->addChild(layer);

return scene;

}

 

bool WelcomeScene::init()

{

// 判断是否能初始化,若不能则直接返回,退出。

if ( !Layer::init() )

    {

        return false;

    }

 

// 获得屏幕高度与宽度与起点坐标

Size visibleSize = Director::getInstance()->getVisibleSize();

    Point origin = Director::getInstance()->getVisibleOrigin();

 

// 背景图片

auto mysprite=Sprite::create("backg.png");

mysprite->setPosition(Point(visibleSize.width/2,visibleSize.height/2));

this->addChild(mysprite,0);

 

// 创建菜单按钮,三个参数,第一个为点击前样子,第二个为点击后样子,第三个为点击按钮所执行的函数(就是回调函数)

    auto jumpItem = MenuItemImage::create(

                                           "icon01.png",

                                           "icon01.png",

   CC_CALLBACK_1(WelcomeScene::menujumpCallback, this));

    // 设置放置按钮的位置(宽度:屏幕最右侧-按钮的宽度/2,高度:屏幕最下侧-按钮高度/2,因为锚点在中心,所以除以2)

jumpItem->setPosition(Point(origin.x + visibleSize.width - jumpItem->getContentSize().width/2 ,

                                origin.y + jumpItem->getContentSize().height/2));

// 添加到菜单

    auto menu = Menu::create(jumpItem, NULL);

    menu->setPosition(Point::ZERO);

    this->addChild(menu, 1);

 

return true;

}

 

void WelcomeScene::menujumpCallback(Ref* pSender)

{

// 创建HelloWorld场景

auto scene=HelloWorld::createScene();

// 让导演 用HelloWorld场景 ☆替换☆ 现在的场景,注意是替换!

Director::getInstance()->replaceScene(scene);

}



回答: 2021-10-26 16:52

auto director = Director::getInstance();

auto sc = sence2::createScene();

director->replaceScene(sc); 



哈哈哈哈哈哈嗝
9楼 · 2021-09-03 10:26

cocos2d-x 3.0中场景切换特效比较多,而且游戏开发中也经常需要用到这些特效,来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用。
场景切换用到导演类Directory,大多数用的都是替换场景,当然也可以用出栈进栈的方式来进行场景的替换,这里以replaceScene来举例。
场景切换特效的应用代码:

auto scene=HelloWorld::createScene();//创建待切换的场景
auto transition=TransitionZoomFlipY::create(1.0f,scene);//给场景包装动画特效
Director::getInstance()->replaceScene(transition);//运用导演类来进行切换场景

相关问题推荐

  • 回答 6

    第一步:对着Assets点击右键,选择ExportPackage第二步:选择场景文件以及和场景相关的资源或者素材,然后点击Export第三步:给导出的资源取名,并且选择要保存的位置即可

  • 回答 87
    已采纳

    玩游戏玩的很好,说明你对于游戏里面的规则、剧情设置还是比较了解的,对于从事游戏相关岗位来说也是优势之一。但是学习游戏开发还是要对游戏开发的工作内容做进一步的了解,游戏开发涉及代码较多,可以通过进一步的了解,判断自己是否适合学习这个方向,另外...

  • 回答 11

    游戏开发入门不难。后期发展需要你有丰富的奇思妙想。游戏开发肯定是培训好,自学学得不系统,并且不易发现自身薄弱之处。游戏开发的学习时长还是要看你自己对知识与技术的掌握能力,一般来说,游戏开发的学习时长大约在五个月左右。...

  • 回答 18

    个人觉得如果有一定的技术基础的话还是可以考虑自学,如果零基础的话可能会有些难度

  • 回答 10

    问题还是出在粒子的sorting fudge。在unity的2d模式下,游戏本身的背景相当于是sorting fudge的0,当你把粒子的sorting fudge设为0以上的时候,粒子就都会被背景盖住。所以在3d模式下给alpha正值来给add垫底的话,到了2d模式下就会通通不显示。所以遇上这样的...

  • 回答 17

    虚幻4引擎,你会看到和平精英加载页面左下角有这个图标。

  • 回答 8
    已采纳

    转载知乎上的两位答友的回答,各有道理。作者:风小锐链接:https://www.zhihu.com/question/322249959/answer/675883379来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。未来Unity有可能出现3A大作吗? 有可能。基于Unity已...

  • 回答 11

    在Assets文件夹里面.点击右键Create/Material即可以创建材质球

  • 回答 23

    可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...

  • 回答 18

    粒子系统由粒子发射器、粒子动画器和粒子渲染器三部分组成,主要用于游戏场景中一些特殊效果,如水、烟火等等

  • 回答 18

    首先,Python开发游戏非常尴尬,原因是没有好用的游戏开发库。Python开发游戏仅推荐PyGame,PyGame是对多年以前很流行的游戏开发库——SDL的封装。但是说实话功能太简陋了,做个动画都得考虑刷新的问题。楼主要做简单小游戏,只需要画一两周熟悉Unity引擎,然...

  • 回答 9

    1.标记水体碰撞的位置2.计算水波的传递 通过波动公式,3D或者2D 波动公式都行3.水面顶点采样波动传递结果计算结果做顶点Y轴偏移

  • 回答 15

    Unity3D中两种阴影的实现传统的ShadowMapShadowMap说起来十分简单,把摄像机和光源的位置重叠,那么场景中该光源的阴影区域就是那些摄像机看不到的地方,主要应用在前向渲染路径中。具体实现分以下几个步骤:如果有平行光开启了阴影,Unity就会为该光源计算它...

  • 回答 18

    Doozy UI是Unity UI视图层的框架,本身使用的还是UGUI的组件,但提供了一套强大的UI管理功能,可以很方便的实现一些炫酷效果,方便的UI系统管理与事件传递机制。

  • 回答 12

    Unity3d更好,因为U3D占有的市场更大,目前cocos大都是用来开发棋牌游戏的,在这方面它有着巨大的优势。而Unity3d既可以用来开发大型3D游戏,也可以用来开发vr游戏、vr应用,这是比较不错的,未来有着巨大的前景。另外ue4也是个不错的选择,近年来用ue4开发的...

  • 回答 11

    当Unity 需要做热更新的时候(2013年开始),而普通的C#又做不到的时候,而对于游戏行业来说Lua脚本热更新已经是很成熟的方案,自然Lua 热更新就成为了Unity热更新的首选。

没有解决我的问题,去提问