场景切换

实现场景转换需要通过场景函数实现,场景函数有:

runWithScene:运行场景

runWithScene属于CCDirector类的成员函数

函数原型: void runWithScene(CCScene *pScene)

函数参数:
*pScene(CCScene型指针)

replaceScene:切换场景

replaceScene属于CCDirector类的成员函数

函数原型: void replaceScene(CCScene *pScene);

函数参数:
*pScene(CCScene型指针)

pushScene: 将场景压到栈中

pushScene属于CCDirector类的成员函数

函数原型:void pushScene(CCScene *pScene);

函数参数:
*pScene(CCScene型指针)

popScene :弹出栈中的场景

popScene属于CCDirector类的成员函数

函数原型:void popScene(void);

函数参数:
没有参数

pause: 暂停场景

pause属于CCDirector类的成员函数

函数原型:void pause(void)

函数参数:
没有参数

resume:继续运行场景

resume属于CCDirector类的成员函数

函数原型:void resume(void)

函数参数:
没有参数

end: 结束场景

end属于CCDirector类的成员函数

函数原型:void end(void)

函数参数:
没有参数

建立工程测试场景函数:

建立一个SceneMan工程,在工程中添加一个SceneSecond类

在SceneSecond.h文件中添加下面的代码

#ifndef _SenceSecond_H_
#define _SenceSecond_H_
//防止代码重包含

#include "cocos2d.h"
USING_NS_CC;

class SceneSecond : public CCLayer
{
public:

    //创建一个场景
    static CCScene* scene();

    //初始化场景
    bool init();

    //菜单回调函数
    void menuCloseCallback(CCObject* pSender);

    CREATE_FUNC(SceneSecond);
};

#endif

在SeceneSecond.cpp中添加下面的代码

#include "SceneSecond.h"
#include "HelloWorldScene.h"

CCScene* SceneSecond::scene()
{
    //创建一个场景
    CCScene* s =  CCScene::create();

    //创建一个layer
    SceneSecond* layer = SceneSecond::create();

    //将layer加到场景中
    s->addChild(layer);

    //返回CCScene指针
    return s;
}

bool SceneSecond::init()
{
    //先调用父类的init函数
    CCLayer::init();

    //在场景中显示文字
    CCLabelTTF *label = CCLabelTTF::create("SceneSecond", "abcde", 36);

    //设置显示文字的位置(坐标)
    label->setPosition(CCPoint(100,200));

    //将文字加到场景中
    addChild(label);

    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();

     CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                        "CloseNormal.png",
                                        "CloseSelected.png",
                                        this,
                                        menu_selector(SceneSecond::menuCloseCallback));

	pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
                                origin.y + pCloseItem->getContentSize().height/2));

    //创建一个菜单
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    pMenu->setPosition(CCPointZero);
    this->addChild(pMenu, 1);

    return true;
}

//菜单回调函数
void SceneSecond::menuCloseCallback(CCObject* pSender)
{
     //切换到HelloWorld场景
     CCDirector::sharedDirector()->popScene();
}

最后将HelloWorld.cpp文件中的代码修改成

#include "HelloWorldScene.h"
#include "SceneSecond.h"

USING_NS_CC;

CCScene* HelloWorld::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();

    // 'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }

    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();

    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                        "CloseNormal.png",
                                        "CloseSelected.png",
                                        this,
                                        menu_selector(HelloWorld::menuCloseCallback));

	pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
                                origin.y + pCloseItem->getContentSize().height/2));

    // create menu, it's an autorelease object
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    pMenu->setPosition(CCPointZero);
    this->addChild(pMenu, 1);

    static int i = 1;

    char buf[256];

    sprintf(buf, "Hello World %d", i++);

    CCLabelTTF* pLabel = CCLabelTTF::create(buf, "Arial", 24);

    // position the label on the center of the screen
    pLabel->setPosition(ccp(origin.x + visibleSize.width/2,
                            origin.y + visibleSize.height - pLabel->getContentSize().height));

    // add the label as a child to this layer
    this->addChild(pLabel, 1);

    // add "HelloWorld" splash screen"
    CCSprite* pSprite = CCSprite::create("HelloWorld.png");

    // position the sprite on the center of the screen
    pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

    // add the sprite as a child to this layer
    this->addChild(pSprite, 0);

    return true;
}

//点击按钮后调用的函数
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    //切换到SceneSecond场景
    CCDirector::sharedDirector()->pushScene(SceneSecond::scene());

}

编译程序:程序的执行结果为

修改程序代码,将SceneSecond.cpp中的void SceneSecond::menuCloseCallback(CCObject* pSender)函数中的代码

  CCDirector::sharedDirector()->popScene();

修改成

CCDirector::sharedDirector()->replaceScene(HelloWorld::scene());

将HelloWorldScene.cpp中void HelloWorld::menuCloseCallback(CCObject* pSender)函数中的代码

  CCDirector::sharedDirector()->pushScene(SceneSecond::scene());

修改成

CCDirector::sharedDirector()->replaceScene(SceneSecond::scene());

程序执行结果:

修改后HelloWorld后的数字会出现累加,是因为在上一个程序中使用的场景切换函数为栈函数,在切换场景的过程中会执行出栈和压栈操作,不会出现累加,而使用replace函数切换场景的时候会实现数据累加





时间: 2024-08-13 02:24:37

场景切换的相关文章

cocos2d-x-3.x 场景(3)场景切换特效

听说cocos场景切换比较帅气,就在网上查了许多场景切换可以掉用的. 先说怎么弄,贴代码,在上一节所示的地方 bool HelloWorld::init(){ if (!Layer::init()) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); Sprite *la

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

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

cocos2dx 场景切换

版本是 cocos2dx 3.3 场景切换的时刻是:(代码有删减) void Director::drawScene() { // calculate "global" dt calculateDeltaTime(); if (_nextScene) { setNextScene(); } } 每一帧都会检查,看是不是有 _nextScene, 也就是 是不是需要进行场景切换了. 一般场景切换的过程: 当添加一个场景时,正在运行的场景会调用 _runningScene->onEx

Cocos2d-X研究之3.0 场景切换特效汇总

Cocos2d-X研究之3.0 场景切换特效汇总 2014-08-05      0个评论    来源:游戏编程    收藏    我要投稿 cocos2d-x 3.0中场景切换特效比较多,而且游戏开发中也经常需要用到这些特效,来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 场景切换用到导演类Directory,大多数用的都是替换场景,当然也可以用出栈进栈的方式来进行场景的替换,这里以replaceScene来举例.3.0事件分发机制—触摸事件监听不明白的可以看下. 场景切换特效的应

Cocos2d-X3.0 刨根问底(九)----- 场景切换(TransitionScene)源代码分析

上一章我们分析了Scene与Layer相关类的源代码,对Cocos2d-x的场景有了初步了解,这章我们来分析一下场景变换TransitionScene源代码. 直接看TransitionScene的定义 class CC_DLL TransitionScene : public Scene { public: /** Orientation Type used by some transitions */ enum class Orientation { /// An horizontal or

Cocos2d-X3.0 刨根问底(九)----- 场景切换(TransitionScene)源码分析

上一章我们分析了Scene与Layer相关类的源码,对Cocos2d-x的场景有了初步了解,这章我们来分析一下场景变换TransitionScene源码. 直接看TransitionScene的定义 class CC_DLL TransitionScene : public Scene { public: /** Orientation Type used by some transitions */ enum class Orientation { /// An horizontal orie

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

【转】Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)

本篇文章主要介绍了"Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)",主要涉及到Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)方面的内容,对于Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)感兴趣的同学可以参考一下. 持久化简单的数据储存在Unity3D 中提供了一个简单有效的方法,如果之前的你做过Android的开发你会发现在Unity3D中持久化数据的储存和Android非常的想象.那么下面MOMO 将用一

cocos2d-x 3.x 场景切换特效大集合

        游戏开发中经常需要用到Cocos2d-x 3.x中的场景切换特效,本文中进行一下汇总.       基本使用思路如下: ? 1 2 3 auto scene=HelloWorld::createScene();//创建待切换的场景 auto transition=TransitionZoomFlipY::create(1.0f,scene);//给场景包装动画特效  Director::getInstance()->replaceScene(transition);//运用导演类