cocos2dX 它CCScene创建原则和切换模式

简介:

今天, 让我们来看看现场CCScene创建原则和切换模式, 


首先, 个什么样子:




我们先来看看效果:

啥也没有:



诸位少侠莫急, 且待我一一解释( 旁白: 你今天又是在发什么疯啊)


创建一个继承于CCLayer的HelloWorld,然后通过HelloWorld这个Layer中提供一个产生CCScene的指针的静态函数,获取场景的指针,加载场景

我们先具体的看看每一个函数做了什么


CCScene* HelloWorld::scene()

创建了一个场景

依据HelloWorld创建了一个层

将层加入到场景里面

返回场景指针


bool HelloWorld::init()

推断父类是否初始化成功, 假设不成功, 结束初始化操作


总的来说, CCScene相当于一个容器, 尽管继承自CCNode, 可是什么也没干, 没有在它的基础上加入成员变量和方法, 仅仅是重构了init, 把层加入到场景中


所以我们要在init函数里面进行各种操作, 然后使用addChild加入到层上面, 我们再让CCDirector调用runWithScene(), 播放这个场景, 我们加入的精灵这些才干在屏幕上显示出来




好了, 我们来看看今天最重要一部分, 场景切换

先来看看场景切换有多少特效:

[1]:CCTransitionCrossFade::create(时间,目标场景);

   //慢慢淡化到还有一场景

[2]:CCTransitionFade::create(时间,目标场景);

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

[3]:CCTransitionFadeBL::create(时间,目标场景);

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

[4]:CCTransitionFadeDown::create(时间,目标场景);

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

[5]:CCTransitionFadeTR::create(时间,目标场景);

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

[6]:CCTransitionFadeUp::create(时间,目标场景);

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

[7]:CCTransitionFlipAngular::create(时间,目标场景,样式 );

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

   //样式(能够不写):

   //kCCTransitionOrientationLeftOver(左向右翻转)

   //kCCTransitionOrientationRightOver(右向左翻转)

[8]:CCTransitionFlipX::create(时间,目标场景,样式);

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

   //样式(能够不写):

   //kCCTransitionOrientationLeftOver(左向右翻转)

   //kCCTransitionOrientationRightOver(右向左翻转)

[9]:CCTransitionFlipY::create(时间,目标场景);

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

   //样式(能够不写):

   //kCCTransitionOrientationUpOver(下向上翻转)

   //kCCTransitionOrientationDownOver(上向下翻转)

[10]:CCTransitionJumpZoom::create(时间,目标场景);

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

[11]:CCTransitionMoveInB::create(时间,目标场景);

   //还有一场景由总体从以下出现

[12]:CCTransitionMoveInL::create(时间,目标场景);

   //还有一场景由总体从左面出现

[13]:CCTransitionMoveInT::create(时间,目标场景);

   //还有一场景由总体从上面出现

[14]:CCTransitionMoveInR::create(时间,目标场景);

   //还有一场景由总体从右面出现

[15]:CCTransitionPageTurn::create(时间,目标场景,bool);

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

[16]:CCTransitionProgressHorizontal::create(时间,目标场景);

   //本场景从左到右消失同一时候还有一场景出现

[17]:CCTransitionProgressInOut::create(时间,目标场景);

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

[18]:CCTransitionProgressOutIn::create(时间,目标场景);

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

[19]:CCTransitionProgressRadialCCW::create(时间,目标场景);

   //本场景逆时针消失到还有一场景

[20]:CCTransitionProgressRadialCW::create(时间,目标场景);

   //本场景顺时针消失到还有一场景

[21]:CCTransitionProgressVertical::create(时间,目标场景);

   //本场景从上到下消失同一时候还有一场景出现

[22]:CCTransitionRotoZoom::create(时间,目标场景);

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

[23]:CCTransitionShrinkGrow::create(时间,目标场景);

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

[24]:CCTransitionSlideInB::create(时间,目标场景);

   //本场景向上滑动到还有一场景

[25]:CCTransitionSlideInL::create(时间,目标场景);

   //本场景向右滑动到还有一场景

[26]:CCTransitionSlideInR::create(时间,目标场景);

   //本场景向左滑动到还有一场景

[27]:CCTransitionSlideInT::create(时间,目标场景);

   //本场景向下滑动到还有一场景

[28]:CCTransitionSplitCols::create(时间,目标场景);

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

[29]:CCTransitionSplitRows::create(时间,目标场景);

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

[30]:CCTransitionTurnOffTiles::create(时间,目标场景);

   //本场景小方块消失到还有一场景

[31]:CCTransitionZoomFlipAngular::create(时间,目标场景,样式);

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

   //样式(能够不写):

   //kCCTransitionOrientationLeftOver(左向右翻转)

   //kCCTransitionOrientationRightOver(右向左翻转)

[32]:CCTransitionZoomFlipX::create(时间,目标场景,样式);

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

   //样式(能够不写):

   //kCCTransitionOrientationLeftOver(左向右翻转)

   //kCCTransitionOrientationRightOver(右向左翻转)

[33]:CCTransitionZoomFlipY::create(时间,目标场景,样式);

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

   //样式(能够不写):

   //kCCTransitionOrientationUpOver(下向上翻转)

   //kCCTransitionOrientationDownOver(上向下翻转)

嗯, 这里借用 孤狼 大神整理的, 感谢哈, 嘿嘿, 我人比較懒

好了, 我们先来创建一个新的场景

创建一个名叫scene2的类, 从HelloWorld把代码复制过来, 注意要把类名这些换过来哦

#ifndef __SCENE2_H__
#define __SCENE2_H__

#include "cocos2d.h"

class scene2 : public cocos2d::CCLayer
{
public:
	//初始化一个场景, 成功返回TRUE, 失败返回FALSE
	virtual bool init();  

	//创建一个场景, 返回类的实例指针, 说白了就是返回一个场景指针
	static cocos2d::CCScene* scene();

	//创建一个层
	CREATE_FUNC(scene2);
};

#endif // __SCENE2_H__

#include "scene2.h"

USING_NS_CC;

CCScene* scene2::scene()
{
	//创建场景对象, 而且返回它
	CCScene *scene = CCScene::create();

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

	//将层加入到场景中
	scene->addChild(layer);

	return scene;
}

bool scene2::init()
{
	if ( !CCLayer::init() )
	{
		return false;
	}

	return true;
}

这样, 一个新的场景就创建完毕了


我们在原来的场景上创建一张背景图片, 一个button, 额, 这个button我就用的是程序里面的关闭button, 函数内容一改, 嘿嘿, 你懂得( 旁白: 你这是没救了的节奏)

CCSprite* bg = CCSprite::create( "HelloWorld.png");
	bg->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2));
	addChild( bg);

	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);

关键的来了, 我们来改动一下关闭button的功能, 直接使用scene2的scene()函数创建了一个场景, 用导演类直接切换到我们新创建的场景

CCScene* myScene = scene2::scene();
	CCDirector::sharedDirector()->replaceScene( myScene);

当然, 我们得把scene2的头文件引进来

#include "scene2.h"

再来改动scene2依样画葫芦, 我们再把scene2实现了:

	CCLabelTTF* ttf = CCLabelTTF::create( "SCENE_2", "Arial", 40);
	ttf->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2));
	addChild( ttf);


	CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
		"CloseNormal.png",
		"CloseSelected.png",
		this,
		menu_selector(scene2::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);

改动关闭函数, 在这个切换场景的时候, 我们选择使用了一个滑动切换场景的特效:

void scene2::menuCloseCallback(CCObject* pSender)
{
	CCScene* myScene = HelloWorld::scene();
	CCTransitionScene* tx = CCTransitionMoveInB::create( 2, myScene);
	CCDirector::sharedDirector()->replaceScene( tx);
}



看看效果, 场景一切换到场景二:

直接一下就切换过去了, 没有不论什么效果


再看看场景二切换到场景一:

从以下把场景一拉上来的



行  今天我们在这里, 我希望你把所有这些特殊效果,看看有什么效果

版权声明:本文博客原创文章,博客,未经同意,不得转载。







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4745035.html,如需转载请自行联系原作者


相关文章
|
2月前
|
缓存 前端开发
ProFlow 流程编辑器框架问题之创建一个自定义节点如何解决
ProFlow 流程编辑器框架问题之创建一个自定义节点如何解决
28 1
|
2月前
|
Java 开发者
Jenv多版本JDK管理大揭秘:动态切换、轻松配置,一文让你彻底解锁!
【8月更文挑战第25天】Jenv是一款强大的Java版本管理工具,它使开发者能够在不同的项目中灵活使用多个JDK版本。通过环境变量管理和命令行操作实现版本切换。安装简便,配置快捷。只需几条命令即可添加、查看及切换JDK版本。示例展示了如何在项目中运用不同JDK版本编译与运行程序,极大提升了开发效率和灵活性。
114 0
|
2月前
|
Android开发 iOS开发
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
29 0
|
3月前
|
存储 开发工具 Android开发
代码协同模式使用问题之创建特性分支,如何解决
代码协同模式使用问题之创建特性分支,如何解决
|
3月前
|
JSON 测试技术 数据格式
软件复用问题之如果待复用的组件是需要新建的,应该如何解决
软件复用问题之如果待复用的组件是需要新建的,应该如何解决
定义一个事件需要单独新建一个文件吗?底层原理是什么?
定义一个事件需要单独新建一个文件吗?底层原理是什么?
|
iOS开发 Perl
iOS 同一个工程创建不同的多版本切换应用
iOS 同一个工程创建不同的多版本切换应用
iOS 同一个工程创建不同的多版本切换应用
VB源码升级后的几幅截图-VBIDE嵌入窗体、代码资源自动加入
用了整整两天的时间终于完成了功能上的升级,但多国语言版和数据库的加密还不知什么时间能做完,所以一时还不能发布,不过作为“内部人员”倒是可以先用为快:)
554 0
|
Web App开发
【自然框架】通用权限的视频演示(一):添加角色,权限到功能节点和按钮
写了几个关于权限的东东,好像大家都不大理解,也不太清楚我的权限到底能做什么,所以想来想去还是弄点视频吧,就是屏幕录像,这样大家看起来就方便了吧。      为了大家便于观看视频,我先说一下视频的步骤。
1174 0
|
测试技术 程序员 数据库
设计上的8/2原则,您实现了吗?实现后会是什么样子的呢?
最近做项目感觉很累很累,先自我分析一下吧。(但愿不要给大家一个“阴天”的感觉) 先明确一下我理解的“设计”的范围。一定要先说明一下,否则容易混淆。 一般做一个项目主要有以下几步。 1、到客户那里做调研,收集客户的需求; 2、根据需求和设计人员的经验设计功能模块; 3、设计实体类(或者数据库)。
695 0