cocos2d-x 场景切换

***************************************转载请注明出处:http://blog.csdn.net/lttree*******************************************

今天终于把界面交上去了,~~o(>_<)o ~~,花费了好多时间。。。

做个  场景切换  来庆祝一下。

PS:欢迎大家一起讨论呀~,共同加油!

*********************************

本文三部分:

1.前言

2.菜单按钮执行场景切换

3.场景切换特效

*********************************

1.前言

场景切换,我觉得可以分为两种,

一种就是自动切换,比如玩游戏碰到的,游戏加载完成时的切换,这种一般有个事件触发机制,本次暂先不讲

还有就是点击切换,比如点击某个按钮,回调函数时场景切换。

首先说一下,我们刚开始创建新的项目后,开始的HelloWorld场景是怎么显现出来的呢?

C++程序在运行时,首找main函数,可以发现,在新建项目中Classes里面没有main函数,

难道cocos2d-x没有main函数吗?当然...不是!

其实在win32目录下,main.cpp和main.h

打开main.cpp 可以看到:

#include "main.h"
#include "AppDelegate.h"
#include "cocos2d.h"

USING_NS_CC;

int APIENTRY _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // create the application instance
    AppDelegate app;
    return Application::getInstance()->run();
}

最上面那三行,不用多说,

接下来的using namespace cocos2d

然后是cocos2d-x的入口  APIENTRY _tWinMain

接下来,看到了创建了AppDelegate对象,然后,run函数。

暂时先说到这,感兴趣的,可以跟踪一下,看具体有什么,怎么执行~

在AppDelegate类中,有个函数applicationDidFinishLaunching()

这个函数是程序启动后调用的函数,一般在这个函数里创建设备与场景。

函数里面注释也很给力,额。。啥?你说英文看不懂= =....度娘或有道总有一款适合你呀。。

这里我用的以前的项目,所以创建的场景不是HelloWorld的。

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLView::create("My Game");
        director->setOpenGLView(glview);
    }

    // turn on display FPS
    director->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);

    // create a scene. it's an autorelease object
    auto scene = WelcomeScene::createScene();

    // run
    director->runWithScene(scene);

    return true;
}

然后,我们可以看到 director->runWithScene

对的,控制场景运行是 导演在执行的。

2.菜单按钮的场景切换

恩,现在来进行场景的切换吧,先要创建一个场景,这里就用我以前创建的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);
}

都有注释,就不详解,如果有不懂,随时欢迎咨询~

注意哟,要调用哪个场景时,不要忘了添加那个场景的头文件。

主要看一下回调函数,创建HelloWorld场景,然后导演执行的replaceScene函数,所以是替换操作。

②栈换

然后再试一试,压栈出栈的场景跳转。

这时候,需要两个场景的配合,

以为这样场景切换,主要用于游戏进行时,点击暂停,我们需要将现在场景压栈,然后弹出暂停界面,

点击暂停界面返回,这时候就出栈,原场景重现。

这时候,我们改变一下,HelloWorld场景中,关闭按钮的回调函数,让它进行导演的pop操作。

WelcomeScene.cpp,只有回调函数改变了:

void WelcomeScene::menujumpCallback(Ref* pSender)
{
	// 创建HelloWorld场景
	auto scene=HelloWorld::createScene();
	// 让导演 用HelloWorld场景 ☆压栈☆ 现在的场景
	Director::getInstance()->pushScene(scene);
}

HelloWorldScene.cpp,也是只有回调函数改变:

void HelloWorld::menuCloseCallback(Ref* pSender)
{
	// 让导演  ☆出栈☆ 现在的场景
	Director::getInstance()->popScene();
}

我们可以Push很多个场景,每一次Pop恢复上一个,当然也可以通过  void popToRootScene()来回到根场景,就是最初的场景。

这就是第二种进行入栈,出栈式的场景切换。

3.切换动画效果

Cocos2d-x 引擎,对于切换场景提供了很多动画效果。

我们来试一试吧

void WelcomeScene::menujumpCallback(Ref* pSender)
{
	auto scene=HelloWorld::createScene();
	auto scene02=TransitionZoomFlipY::create(1.0f,scene);
	Director::getInstance()->replaceScene(scene02);
}

在第一行创建了HelloWorld场景,

在第二行创建动画效果的场景,第三行导演类执行替换场景,用第二行创建的场景哟。

一般第二行的参数必要的为两个(多长时间动画(浮点类型),切换到的目标场景)

第三个可选,一般都有,这次我用的动画效果API里是这样的:

Orientation就是一些转换方向的类型:

动画效果还有很多:

//慢慢淡化到另一场景

TransitionCrossFade::create(时间,目标场景);

//本场景变暗消失后另一场景慢慢出现

TransitionFade::create(时间,目标场景);

//本场景右上角到左下角方块消失到另一场景

TransitionFadeBL::create(时间,目标场景);

//本场景从上到下横条消失到另一场景

TransitionFadeDown::create(时间,目标场景);

//本场景左下角到右上角方块消失到另一场景

TransitionFadeTR::create(时间,目标场景);

//本场景从下到上横条消失到另一场景

TransitionFadeUp::create(时间,目标场景);

//本场景翻转消失到另一场景(斜上方)

TransitionFlipAngular::create(时间,目标场景,样式 );

//本场景翻转消失到另一场景(X轴)

TransitionFlipX::create(时间,目标场景,样式);

//本场景翻转消失到另一场景(Y轴)

TransitionFlipY::create(时间,目标场景);

//本场景跳动消失后另一场景跳动出现

TransitionJumpZoom::create(时间,目标场景);

//另一场景由整体从下面出现

TransitionMoveInB::create(时间,目标场景);

//另一场景由整体从左面出现

TransitionMoveInL::create(时间,目标场景);

//另一场景由整体从上面出现

TransitionMoveInT::create(时间,目标场景);

//另一场景由整体从右面出现

TransitionMoveInR::create(时间,目标场景);

//翻页切换,bool为true是向前翻。

TransitionPageTurn::create(时间,目标场景,bool);

//本场景从左到右消失同时另一场景出现

TransitionProgressHorizontal::create(时间,目标场景);

//本场景从中间到四周消失同时另一场景出现

TransitionProgressInOut::create(时间,目标场景);

//本场景从四周到中间消失同时另一场景出现

TransitionProgressOutIn::create(时间,目标场景);

//本场景逆时针消失到另一场景

TransitionProgressRadialCCW::create(时间,目标场景);

//本场景顺时针消失到另一场景

TransitionProgressRadialCW::create(时间,目标场景);

//本场景从上到下消失同时另一场景出现

TransitionProgressVertical::create(时间,目标场景);

//本场景旋转消失后另一场景旋转出现

TransitionRotoZoom::create(时间,目标场景);

//本场景缩小切换到另一场景放大

TransitionShrinkGrow::create(时间,目标场景);

//本场景向上滑动到另一场景

TransitionSlideInB::create(时间,目标场景);

//本场景向右滑动到另一场景

TransitionSlideInL::create(时间,目标场景);

//本场景向左滑动到另一场景

TransitionSlideInR::create(时间,目标场景);

//本场景向下滑动到另一场景

TransitionSlideInT::create(时间,目标场景);

//本场景三矩形上下消失后另一场景三矩形上下出现

TransitionSplitCols::create(时间,目标场景);

//本场景三矩形左右消失后另一场景三矩形左右出现

TransitionSplitRows::create(时间,目标场景);

//本场景小方块消失到另一场景

TransitionTurnOffTiles::create(时间,目标场景);

//本场景翻转消失到另一场景(斜上方)

TransitionZoomFlipAngular::create(时间,目标场景,样式);

//本场景翻转消失到另一场景(X轴)

TransitionZoomFlipX::create(时间,目标场景,样式);

//本场景翻转消失到另一场景(Y轴)

TransitionZoomFlipY::create(时间,目标场景,样式);

OK,今天先到这里了,(*^__^*) .....,加油!

***************************************转载请注明出处:http://blog.csdn.net/lttree*******************************************

cocos2d-x 场景切换

时间: 2024-08-05 07:03:56

cocos2d-x 场景切换的相关文章

quick cocos2d x场景切换的生命周期函数调用学习

先上一个场景的基本模版: 1 local ModelScene = class("ModelScene", function() 2 return display.newScene("ModelScene") 3 end) 4 5 function ModelScene:ctor() 6 self.sceneName = "ModelScene" 7 -- 注册点击事件监听 8 self.layer = display.newLayer() 9

【Cocos2D学习】Cocos2d-x之CCScene场景切换效果的使用

我们要怎样切入游戏场景呢?其实就会要用到CCScene场景切换的知识,然后场景的切换效果,也即是场景的一种过渡效果...   Cocos2d-x提供了很多场景间切换的效果,可以方便大家使用 过渡类: //用CCTransition绕y轴翻转x轴过渡到FilipXpScene CCDirector::sharedDirector()->replaceScene( CCTransitionFlipX::create(2, pScene) ); CCTransitionFlipX::create(&quo

8 cocos2dx添加场景切换效果,控制场景切换彻底完成之后再执行动画

 1 添加场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadialCW CCTransitionProgressHorizontal CCTransitionProgressVertical CCTransitionProgressInOut CCTransitionProgressOutIn CCTransitionCrossFade CCTransitionF

Cocos2dx 学习笔记整理----场景切换

据说Cocos2dx场景切换的方法有32种:cocos2dx 常见的32种切换场景的动画 无需一一求证,只需要知道切换场景需要怎么做就行了. 作为导演CCDirector,切换场景的事情当然归它管了. 切换场景的接口如下: ? 1 CCDirector::sharedDirector()->replaceScene(cocos2d:CCScene * pScene); 所以,我们只要把需要切换的场景实例传进去就可以了. ? 1 2 CCScene * pScene = GameMain::sce

05--简单场景切换与精灵创建

场景就是游戏的不同状态,如游戏菜单.游戏关卡等等.而场景的切换由导演类CCDirector来完成,通常我们使用replaceScene(CCScene *pScene)函数来切换场景.为了方便我使用上一节的项目,新建一个场景GameScene类和一个图层GameLayer类. //GameScene.h #pragma once #include "cocos2d.h" //使用VS类向导添加,需要手工添加这句 class GameScene : public cocos2d::CCS

Cocos2d-x场景切换我换换换!----之游戏开发《赵云要格斗》(12)

这里是Evankaka的博客,欢迎大家前来讨论与交流------        转载请注明出处http://blog.csdn.net/evankaka/article/details/42883881 本文主要讲讲用Cocos Studio制作的登录界面,来设计一个层类,然后根据这个登录界面的选择,跳转到不同的场景.其中,本文用到的界面可参看上篇Cocos2d-x使用Cocos Studio制作界面并应用---之游戏开发<赵云要格斗>(11) cocos2d-x版本:2.2.5 工程环境:w

Cocos2d-x-v3场景切换

Cocos2d-x-v3场景切换 cocos2d中场景的切换采用的是包装的思想,通过创建一个专场效果类,将需要专场的场景进行包装.代码示例如下:     auto * scene = OtherScene::createScene();//创建一个场景     Director::getInstance()->replaceScene(TransitionFlipX::create(1, scene));//进行包装切换,第一个参数为切换时间,第二个为切换的场景 引擎为我们封装的特效有很多,函数

8 cocos2dx加入场景切换效果,控制场景切换彻底完毕之后再运行动画

 1 加入场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadialCW CCTransitionProgressHorizontal CCTransitionProgressVertical CCTransitionProgressInOut CCTransitionProgressOutIn CCTransitionCrossFade CCTransitionF

[cocos2dx笔记007]一个自定义场景切换的实例

cocos2dx框架已经提供了很多场景切换的类,但是一些自定义的场景切换,只有自己实现了.下面是实现的类.这里设计的分辨率是750*500.请根据实际的要求调整. 头文件 #ifndef _TRANSITION_GAME_H_ #define _TRANSITION_GAME_H_ #include <cocos2d.h> namespace cocos2d { class CCTransitionGame : public CCTransitionScene { public: CCTran