Cocos2d-x学习笔记(四)CCScene分析

原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38730335

前言

之前提到CCScene是场景,是整个游戏的舞台,通过查看源码我们不难发现CCScene也是CCNode的子节点,那么它也拥有我们上一节讲的CCNode的所有非private属性及方法。

CCScene的作用十为了联系所有的CCNode节点(包括CCLayer、CCSprite等)。

当清楚知道每个场景要显示的内容,那么定义出不同的CCNode,然后统一添加到CCScene中,执行CCDirector->runWithScene()就可以显示在屏幕上了。

源码分析

class CC_DLL CCScene : public CCNode
{
public:
    CCScene();
    virtual ~CCScene();
    bool init();

    static CCScene *create(void);
};

CCScene::CCScene()
{
    m_bIgnoreAnchorPointForPosition = true;
    setAnchorPoint(ccp(0.5f, 0.5f));
}

CCScene::~CCScene()
{
}

bool CCScene::init()
{
    bool bRet = false;
     do
     {
         CCDirector * pDirector;
         CC_BREAK_IF( ! (pDirector = CCDirector::sharedDirector()) );
         this->setContentSize(pDirector->getWinSize());
         // success
         bRet = true;
     } while (0);
     return bRet;
}

CCScene *CCScene::create()
{
    CCScene *pRet = new CCScene();
    if (pRet && pRet->init())
    {
        pRet->autorelease();
        return pRet;
    }
    else
    {
        CC_SAFE_DELETE(pRet);
        return NULL;
    }
}

我们可以发现整个CCScene类实现的代码并不多,主要是在构造方法中将锚点设置在了中心位置,但是开启了在设置位置时忽略锚点坐标(我们知道CCNode默认的锚点位置是(0, 0),即节点左下角)。

作为场景类,为何只有这两个函数而没有其他方法呢,因为目前在CCScene承担的是一个容器的功能,游戏开发时需要渲染的对象反正CCScene里面统一管理,包括创建、销毁和场景切换等。

在场景切换的时候常常都可以看到切换效果,其实系统已经给我们提供了一套效果,他们都是继承自CCTransitionScene,下面看看它的源码:

class CC_DLL CCTransitionScene : public CCScene
{

protected:
    CCScene    * m_pInScene;
    CCScene    * m_pOutScene;
    float    m_fDuration;
    bool    m_bIsInSceneOnTop;
    bool    m_bIsSendCleanupToScene;

public:
    CCTransitionScene();
    virtual ~CCTransitionScene();
    virtual void draw();
    virtual void onEnter();
    virtual void onExit();
    virtual void cleanup();

    static CCTransitionScene * create(float t, CCScene *scene);

    // 该方法初始化一个场景过渡效果,并指定过渡时间和即将过渡的场景
    virtual bool initWithDuration(float t, CCScene* scene);
    // 该方法在过渡效果结束时会调用
    void finish(void);
    // 部分过渡效果会使用该方法来隐藏更外面的场景
    void hideOutShowIn(void);protected:    virtual void sceneOrder();private:    void setNewScene(float dt);};

写个最简单得淡入淡出场景切换效果为例,场景在1S内过渡到另一个场景

CCTransitionFade * transitionScene = CCTransitionFade::initWithDuration(1, gameScene);
CCDirector::sharedDirector()->replaceScene(transitionScene);

自带场景切换效果汇总

// 涡轮效果
class CC_DLL CCTransitionRotoZoom : public CCTransitionScene

// 跳动进入
class CC_DLL CCTransitionJumpZoom : public CCTransitionScene

// 从左/右/上/下侧进入
class CC_DLL CCTransitionMoveInL : public CCTransitionScene, public CCTransitionEaseScene
class CC_DLL CCTransitionMoveInR : public CCTransitionMoveInL
class CC_DLL CCTransitionMoveInT : public CCTransitionMoveInL
class CC_DLL CCTransitionMoveInB : public CCTransitionMoveInL

// 从左/右/上/下侧滑入
class CC_DLL CCTransitionSlideInL : public CCTransitionScene, public CCTransitionEaseScene
class CC_DLL CCTransitionSlideInR : public CCTransitionSlideInL
class CC_DLL CCTransitionSlideInT : public CCTransitionSlideInL
class CC_DLL CCTransitionSlideInB : public CCTransitionSlideInL

// 交替进入
class CC_DLL CCTransitionShrinkGrow : public CCTransitionScene , public CCTransitionEaseScene

// 左右翻转进入
class CC_DLL CCTransitionFlipX : public CCTransitionSceneOriented

// 上下翻转进入
class CC_DLL CCTransitionFlipY : public CCTransitionSceneOriented

// 左上右下轴翻入
class CC_DLL CCTransitionFlipAngular : public CCTransitionSceneOriented

// 左右放大缩小效果翻入
class CC_DLL CCTransitionZoomFlipX : public CCTransitionSceneOriented

// 上下放大缩小效果翻入
class CC_DLL CCTransitionZoomFlipY : public CCTransitionSceneOriented

// 左上右下放大缩小效果翻入
class CC_DLL CCTransitionZoomFlipAngular : public CCTransitionSceneOriented

// 相变暗,再渐入
class CC_DLL CCTransitionFade : public CCTransitionScene

// 渐变进入
class CC_DLL CCTransitionCrossFade : public CCTransitionScene

// 小方格消失进入
class CC_DLL CCTransitionTurnOffTiles : public CCTransitionScene ,public CCTransitionEaseScene

// 竖条切换进入
class CC_DLL CCTransitionSplitCols : public CCTransitionScene , public CCTransitionEaseScene

// 横条切换进入
class CC_DLL CCTransitionSplitRows : public CCTransitionSplitCols

// 小方格右上角显示进入
class CC_DLL CCTransitionFadeTR : public CCTransitionScene , public CCTransitionEaseScene

// 小方格左下角显示进入
class CC_DLL CCTransitionFadeBL : public CCTransitionFadeTR

// 横条向上显示进入
class CC_DLL CCTransitionFadeUp : public CCTransitionFadeTR

// 横条向下显示进入
class CC_DLL CCTransitionFadeDown : public CCTransitionFadeTR

在之后的笔记中,我们将讲到CCAction,场景切换动画的原理我们也将在学习完CCAction后学习。

好了,这一节就讲到这了,下一节我们一起学习下CCLayer吧~

Cocos2d-x学习笔记(四)CCScene分析

时间: 2024-10-11 18:27:21

Cocos2d-x学习笔记(四)CCScene分析的相关文章

NLTK学习笔记(四):自然语言处理的一些算法研究

自然语言处理中算法设计有两大部分:分而治之 和 转化 思想.一个是将大问题简化为小问题,另一个是将问题抽象化,向向已知转化.前者的例子:归并排序:后者的例子:判断相邻元素是否相同(与排序). 这次总结的自然语言中常用的一些基本算法,算是入个门了. 递归 使用递归速度上会受影响,但是便于理解算法深层嵌套对象.而一些函数式编程语言会将尾递归优化为迭代. 如果要计算n个词有多少种组合方式?按照阶乘定义:n! = n*(n-1)*...*1 def func(wordlist): length = le

Time, Delays, and Deferred Work <LDD3> 学习笔记 + jiffies.h 分析

Time, Delays, and Deferred Work Dealing with time involves the following tasks, in order of increasing complexity: ? Measuring time lapses and comparing times ? Knowing the current time ? Delaying operation for a specified amount of time ? Scheduling

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果 点击英文  变成英文状态点chinese就会变成中文                          源码的下载地址在文章的最下边 多语言用的是资源文件建

代码管理工具 --- git的学习笔记四《重新整理git(1)》

1.创建版本库 mkdir  创建目录 cd  地址,到该地址下 pwd 显示当前目录 1.创建目录 $ mkdir startGit $ cd startGit $ pwd 显示当前目录 或者cd到桌面,然后再创建目录 2.初始化版本库 $ git init 初始化仓库 提示信息:Initialized empty Git repository in /Users/xingzai/Desktop/startGit/.git/ 建立一个空的git仓库在/Users/xingzai/Desktop

Linux学习笔记四:Linux的文件搜索命令

1.文件搜索命令  which 语法:which [命令名称] 范例:$which ls  列出ls命令所在目录 [[email protected] ~]$ which ls alias ls='ls --color=auto' /bin/ls 另外一个命令:whereis [名称名称],也可以列出命令所在目录. [[email protected] ~]$ whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/ma

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

Swift学习笔记四:数组和字典

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten

cocos2dx游戏开发学习笔记3-lua面向对象分析

在lua中,可以通过元表来实现类.对象.继承等.与元表相关的方法有setmetatable().__index.getmetatable().__newindex. 具体什么是元表在这里就不细说了,网上很多介绍,这里主要讲与cocos2dx相关联的部分. 在lua-binding库中extern.lua里,有如下方法: --Create an class. function class(classname, super) local superType = type(super) local c

Android学习笔记四:添加Source

问题描述 Source not foundThe JAR file D:\.....\sdk\platforms\android-20\android.jar has no source attachment. 问题原因及解决办法 1. 使用SDK Manager下载最新版本的Sources for Android SDK 一般文件下载目录默认在SDK下的sources文件中即 \adt-bundle-windows-x86_64-20130522\sdk\sources\android-20

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期