Cocos2d-x之Scene
| 版权声明:本文为博主原创文章,未经博主允许不得转载。
Scene场景也是cocos2dx中必不可少的元素,游戏中通常我们需要构建不同的场景(至少一个),游戏里关卡、版块的切换也就是一个一个场景的切换,就像在电影中变换舞台和场地一样。场景的一个重要的作用就是流程控制的作用,我们可以通过Director的一系列方法控制游戏中不同的场景的自由切换。下面是Director控制场景的常用方法:
runWithScene( Scene *scene )
/*启动游戏,并运行scene场景。本方法在主程序第一次启动主场景的时候调用。如果已有正在运行的场景则不能调用该方法;会调用pushScene-->startAnimation。*/
pushScene( Scene *scene )
/*将当前运行中的场景暂停并压入到代码执行场景栈中,再将传入的scene设置为当前运行场景,只有存在正在运行的场景时才调用该方法;*/
replaceScene( Scene *scene )
/*直接使用传入的scene替换当前场景来切换画面,当前场景被释放。这是切换场景时最常用的方法。*/
popScene()
/*释放当前场景,再从代码执行场景中弹出栈顶的场景,并将其设置为当前运行场景。如果栈为空,直接结束应用。和PushScene结对使用 */
end()
//释放和终止执行场景,同时退出应用
pause()
//暂停当前运行场景中的所有计时器和动作,场景仍然会显示在屏幕上
resume()
//恢复当前运行场景的所有计时器和动作,场景仍然会显示在屏幕上
同时场景是层的容器,包含了所有需要显示的游戏元素。通常,当我们需要完成一个场景时候,会创建一个Scene的子类,并在子类中实现我们需要的功能。比如,我们可以在子类的初始化中载入游戏资源,为场景添加层,启动音乐播放 等等。
Scene来是Node的一个子类。和Node相比,Scene只是添加了一个特性,它拥有自己的锚点,位置在运行窗口屏幕的正中央。除此之外,再也没有额外的功能,只是一个抽象的概念
新建,运行一个场景的方法:
使用AppDelegate类中的applicationDidFinishLaunching函数中调用上一步定义的方法,并使用导演类的runWithScene方法运行场景,如下
Scene* MyGame::createScene()
{
//新建场景的实例
auto scene = Scene::create();
//定义布景层
auto layer = MyGame::create();
//将布景层加入场景
scene->addChild(layer);
//返回场景类
return scene;
}
// create a scene. it's an autorelease object
auto scene = MyGame::createScene(); // run
director->runWithScene(scene);
场景的切换:
首先我们建立一个要切换新的Scene:
StartGame.h
#ifndef _START_GAME_SCENE_H_
#define _START_GAME_SCENE_H_
#include "cocos2d.h" class MyGameBegin : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void startMenuItemback(cocos2d::Ref* pSender);
CREATE_FUNC(MyGameBegin);
};
#endif //_START_GAME_SCENE_H_
StartGame.cpp
#include "Startgame.h"
USING_NS_CC; Scene* MyGameBegin::createScene()
{
auto startScene = Scene::create();
auto startLayer = MyGameBegin::create();
startScene->addChild(startLayer);
return startScene;
}
bool MyGameBegin::init()
{
if (!Layer::init())
{
return false;
}
Size startSize = Director::getInstance()->getVisibleSize();
Vec2 startOrigin = Director::getInstance()->getVisibleOrigin();
auto startSprite = Sprite::create("bg2.png");
startSprite->setPosition(Vec2(startSize.width / 2 + startOrigin.x, startOrigin.y + startSize.height / 2));
float xs = startSize.width / startSprite->getContentSize().width;
float ys = startSize.height / startSprite->getContentSize().height;
startSprite->setScale(xs, ys);
this->addChild(startSprite); return true;
}
MyGameScene.h
#ifndef _MYGAME_SCENE_H_
#define _MYGAME_SCENE_H_
#include "cocos2d.h" class MyGame : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void startMenuItemback(cocos2d::Ref* pSender); //start的回调函数,在这里切换场景
void helpMenuItemback(cocos2d::Ref* pSender); //点击start的回调函数
void exitMenuItemback(cocos2d::Ref* pSender); //点击start的回调函数
CREATE_FUNC(MyGame);
};
#endif // _MYGAME_SCENE_H_
MyGameScene.cpp
#include "MyGameScene.h"
#include "StartGame.h" //要包含切换场景的头文件
USING_NS_CC; Scene* MyGame::createScene()
{
auto scene = Scene::create();
auto layer = MyGame::create();
scene->addChild(layer);
return scene;
} bool MyGame::init()
{
if (!Layer::init())
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin(); //设置Sprite
auto bg = Sprite::create("bg1.png");
bg->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y)); //下面是将图片调节到与窗口同比例的缩放;图片 / 窗口
float xs = visibleSize.width / bg->getContentSize().width;
float ys = visibleSize.height / bg->getContentSize().height;
bg->setScale(xs, ys);
this->addChild(bg,0); auto mouse = Sprite::create("mouse.png");
mouse->setPosition(Vec2(visibleSize.width / 3 + origin.x, visibleSize.height / 4 + origin.y));
mouse->setScale(0.5, 0.5);
this->addChild(mouse, 1); auto hammer = Sprite::create("hammer.png");
hammer->setPosition(Vec2(visibleSize.width / 2.5 + origin.x, visibleSize.height / 2 + origin.y));
hammer->setScale(0.7, 0.7);
this->addChild(hammer); //设置Label
auto label = Label::createWithTTF("Whac-a-mole", "fonts/Marker Felt.ttf", 38);
label->setPosition(Vec2(origin.x + visibleSize.width / 2,
origin.y + visibleSize.height - label->getContentSize().height));
this->addChild(label,1); //设置一个菜单项,
auto start = MenuItemFont::create("Start", CC_CALLBACK_1(MyGame::startMenuItemback, this));
start->setPosition(Vec2(origin.x + visibleSize.width / 2,
(origin.y + visibleSize.height - (visibleSize.height / 2)))); auto menu1 = Menu::create(start, NULL);
menu1->setPosition(Vec2(0,0));
this->addChild(menu1); auto help = MenuItemFont::create("Help", CC_CALLBACK_1(MyGame::helpMenuItemback, this));
help->setPosition(Vec2(origin.x + visibleSize.width / 2,
(origin.y + visibleSize.height - (visibleSize.height / 2) - (Help->getContentSize().height*1.5))));
auto menu2 = Menu::create(help, NULL);
menu2->setPosition(Vec2(0, 0));
this->addChild(menu2); auto exit = MenuItemFont::create("Exit", CC_CALLBACK_1(MyGame::exitMenuItemback, this));
exit->setPosition(Vec2(origin.x + visibleSize.width / 2,
(origin.y + visibleSize.height - (visibleSize.height / 2) - ((Exit->getContentSize().height*1.5) * 2))));
auto menu3 = Menu::create(exit, NULL);
menu3->setPosition(Vec2(0, 0));
this->addChild(menu3); return true;
} //replaceScene()切换场景,在回调函数中切换场景
void MyGame::startMenuItemback(Ref* pSender)
{
//这里写回调函数的操作
Director::getInstance()->replaceScene(TransitionJumpZoom::create(2, MyGameBegin::createScene()));
} void MyGame::helpMenuItemback(Ref* pSender)
{
//这里写回调函数的操作
} void MyGame::exitMenuItemback(Ref* pSender)
{
//这里写回调函数的操作
Director::getInstance()->end(); //exit(0);也可以
}
效果图:
开始点击进入游戏:start

切换的过程中的过渡效果:TransitionJumpZoom::create(time,Scene)

>>场景切换效果函数汇总
TransitionCrossFade::create(time,Scene);
慢慢淡化到另一场景 TransitionFade::create(time,Scene);
本场景变暗消失后另一场景慢慢出现 TransitionFadeBL::create(time,Scene);
本场景右上角到左下角方块消失到另一场景 TransitionFadeDown::create(time,Scene);
本场景从上到下横条消失到另一场景 TransitionFadeTR::create(time,Scene);
本场景左下角到右上角方块消失到另一场景 TransitionFadeUp::create(time,Scene);
本场景从下到上横条消失到另一场景 TransitionFlipAngular::create(time,Scene,style );
本场景翻转消失到另一场景(斜上方) TransitionFlipX::create(time,Scene,style);
本场景翻转消失到另一场景(X轴) TransitionFlipY::create(time,Scene);
本场景翻转消失到另一场景(Y轴) TransitionJumpZoom::create(time,Scene);
本场景跳动消失后另一场景跳动出现 TransitionMoveInB::create(time,Scene);
另一场景由整体从下面出现 TransitionMoveInL::create(time,Scene);
另一场景由整体从左面出现 TransitionMoveInT::create(time,Scene);
另一场景由整体从上面出现 TransitionMoveInR::create(time,Scene);
另一场景由整体从右面出现 TransitionPageTurn::create(time,Scene,bool);
翻页切换,bool为true是向前翻。 TransitionProgressHorizontal::create(time,Scene);
本场景从左到右消失同时另一场景出现 TransitionProgressInOut::create(time,Scene);
本场景从中间到四周消失同时另一场景出现 TransitionProgressOutIn::create(time,Scene);
本场景从四周到中间消失同时另一场景出现 TransitionProgressRadialCCW::create(time,Scene);
本场景逆时针消失到另一场景 TransitionProgressRadialCW::create(time,Scene);
本场景顺时针消失到另一场景 TransitionProgressVertical::create(time,Scene);
本场景从上到下消失同时另一场景出现 TransitionRotoZoom::create(time,Scene);
本场景旋转消失后另一场景旋转出现 TransitionShrinkGrow::create(time,Scene);
本场景缩小切换到另一场景放大 TransitionSlideInB::create(time,Scene);
本场景向上滑动到另一场景 TransitionSlideInL::create(time,Scene);
本场景向右滑动到另一场景 TransitionSlideInR::create(time,Scene);
本场景向左滑动到另一场景 TransitionSlideInT::create(time,Scene);
本场景向下滑动到另一场景 TransitionSplitCols::create(time,Scene);
本场景三矩形上下消失后另一场景三矩形上下 TransitionSplitRows::create(time,Scene);
本场景三矩形左右消失后另一场景三矩形左右 TransitionTurnOffTiles::create(time,Scene);
本场景小方块消失到另一场景 TransitionZoomFlipAngular::create(time,Scene,style);
本场景翻转消失到另一场景(斜上方) TransitionZoomFlipX::create(time,Scene,style);
本场景翻转消失到另一场景(X轴) TransitionZoomFlipY::create(time,Scene,style);
本场景翻转消失到另一场景(Y轴 )
切换成功:

Cocos2d-x之Scene的更多相关文章
- 创建一个cocos2d-x工程添加一个自定义Scene并显示
#include "cocos2d.h" class RunScene :public cocos2d::CCLayer { public: virtual bool init() ...
- cocos2dx 实现flappybird
前两天在博客园看到网友实现的一个网页版的flappy bird,挂在360游戏平台,玩了一会儿得分超低,就很想自己做一个.刚好这两天炫舞的活都清了,就弄一下玩玩. 效果图 布局类GameScene.h ...
- 创建自定义的Cocos2d-x场景
操作步骤 1.创建cocos2d-x工程 2.新建 Scene1.cpp Scene1.h Scene1.h代码 #ifndef __SCENE1_H__#define __SCENE1_H__ #i ...
- 【24点游戏】cocos2dx 源码
1. 4个数字 24点判断 double Calc(double a, double b, string oper) { double result = 0; const char *p = ope ...
- CCTableView 简单样例
非常像android中的listview #pragma once; #include "cocos2d.h" using namespace cocos2d; //使用CCTab ...
- cocos2d-x的A*寻路
如果你还不熟悉A*寻路,请先看下这篇文章http://blog.csdn.net/dssdss123/article/details/11494065 一.先介绍几个函数和结构: 1.virtual ...
- cocos2d-x学习日志(10) --射击游戏(喵星战争)
转载请标明:转载自[小枫栏目],博文链接:http://blog.csdn.net/rexuefengye/article/details/10553487 一.纵版射击游戏的特点 纵版射击游戏是一种 ...
- 笔记:利用 Cocos2dx 3.2 与 Box2D制作一个跑酷游戏(上)
最近写lua写得没有力气了,所以想让脑袋放松一下,刚好看到有人在用swift做游戏: Swift游戏实战-跑酷熊猫 于是脑子一短路,就想到了利用这些素材来做一个游戏. 本来不想记笔记的,但是由于选择物 ...
- 【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现
CSDN的markdown编辑器是吃屎了么! !.什么玩意.!写了一半写不了东西还全没了,搞个毛线! 本节课的视频教程地址是:第七课在此 假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊成 ...
- cocos2d-x游戏引擎核心之十——网络通信
一.建立基本的http通信并得到返回信息 1.创建cocos2dx工程 2.项目引用外部库 如果要使用cocos2dx的CCHttpClient来进行网络访问,则需要引入cocos2dx的相关库,详细 ...
随机推荐
- Html5 学习笔记 【PC固定布局】 实战6 咨询页面
最终效果: Html页面代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta char ...
- 【awk】 判断是不是纯ascii串
筛选出纯ascii串: awk '{ l = length($0); for (i = l; i > 0; i--) { if (substr($0,i,1) > "\177&q ...
- 一些关于SEO优化的笔记
高级搜索指令: 双引号:“xxx” 代表完全匹配的搜索 减号:-(减号前面必须是空格,后面必须没有空格)代表搜索不包含减号后面的词的页面 filetype:用于搜索特定文件格式(百度支持的文件类型:P ...
- Python 学习笔记12 函数模块
函数的优点之一,使用它们可将代码块与主程序分离.通过给函数指定描述性的名称.可以让主程序非常好理解.但是如果将过多的函数和主程序放置在一起,会让文件显得非常凌乱.太多的代码混杂在一起,不方便管理.我们 ...
- spark streaming 笔记
spark streaming项目 学习笔记 为什么要flume+kafka? 生成数据有高峰与低峰,如果直接高峰数据过来flume+spark/storm,实时处理容易处理不过来,扛不住压力.而选用 ...
- python文件的读写总结
读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...
- Hibernate4教程二:基本配置
可编程的配置方式一: 如果在配置cfg.xml的时候,不想在里面配置hbm.xml怎么办呢?可在程序里使用可编程的配置方式,也就是使用程序来指定在cfg.xml里面的配置信息,不推荐这种方式.如下: ...
- 使用jquery.validate组件进行前端数据验证并实现异步提交前验证检查
学习如鹏网掌上组的项目开发,使用到了前端验证,视频里使用的ValidateForm验证框架,但是我使用的Hui的框架中使用的是jquery.validate验证框架 所以自行学习jquery.vali ...
- jq 常识复记01-- 数组操作
删除数组指定的某个元素 js删除数组中某一项或几项的几种方法 https://www.jb51.net/article/154737.htm 首先可以给JS的数组对象定义一个函数,用于查找指定的元素在 ...
- 使用canvas时, 如何用相对单位(rem, rpx)来适配不同机型
使用canvas的api时, 使用的都是绝对数值, 如: 方法传参是坐标位置,不带单位,如ctx.translate(10,10); 那么此时, 我就需要将rem或rpx 转换成 px; 首先, 获取 ...