cocos2d-x 场景切换

转自:http://blog.csdn.net/xiaoxiangp/article/details/7684726

对于场景的理解:以前移植MTK游戏的时候,有一个词叫状态,比如主菜单叫 状态1,设置界面叫状态2,当主菜单选择设置的时候就切换至状态2 。现在,状态就是场景的意思啦!


在这里我引用一下小满的博客内容:


“小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man

1.几个重要概念

cocos2d引擎中,有几个概念,分别是导演,场景,布景和人物角色。

导演(CCDirector)在cocos2d-x引擎中,导演类是游戏的组织者和领导者,导演制定规则让游戏内的场景,布景,和人物角色有序的运行

摄像机(CCCamera),每个节点都需要使用摄像机,当节点发生缩放,旋转,和位置变化时,都需要覆盖摄像机,让这个节点通过摄像机重新渲染。

场景(CCScene)在游戏里,场景就是关卡,关卡有人物和背景构成

布景(CCLayer)从概念上说,布景就是场景里的背景,其实就是层次的概念,这种概念在kjava时代就有,就是手动的把游戏中的场景分层(也有靠地图编辑器实现这一功能的)

人物(CCSprite),这就很明显了,当然包括主角和敌人,和npc,以我个人的理解,也包括游戏中的动态大图素及机关等

动作(CCAction),就是人物(CCSprite)拥有的动作 


按照我的理解就是:写一个游戏就像是导演一出戏,首先我需要一个导演~


然后我需要主菜单场景设置场景关于场景游戏进行场景,也就是多个场景


游戏中这个场景呢,不知道大家玩过《冒险岛》这个游戏没有,这个游戏就有很多层,背景层啦。障碍物层啦,任务怪物层啦,等等。分层的概念一出来,思路都清晰了许多所以每个场景能有多个层


然后每个层中都有很多的《个体》这是抽象的说法,具体一点比如怪物层。每个怪物都是一个单独的个体,我们还能叫他<精灵>游戏中不可能只有一个怪物吧~所以每个层都能有多个个体。


然后每个个体都有自己的特性吧~比如会跳舞,攻击之类的、我们叫这一现象为动作~每个个体都能有很多很多的动作呢....



现在,我们继续说场景的切换,cocos2d中支持很多种特效的状态切换。先上代码。咱们慢慢分析!

一下是Helloworld的一个场景的创建函数



[cpp] view plaincopy


  1. CCScene* HelloWorld::scene()  
  2. {  
  3.     CCScene * scene = NULL;  
  4.     do   
  5.     {  
  6.         // 'scene' is an autorelease object  
  7.         scene = CCScene::node();这里是创建一个场景  
  8.         CC_BREAK_IF(! scene);  
  9.   
  10.         // 'layer' is an autorelease object  
  11.         HelloWorld *layer = HelloWorld::node();这里是创建了一个层  
  12.         CC_BREAK_IF(! layer);  
  13.   
  14.         // add layer as a child to scene  
  15.         scene->addChild(layer);然后添加层到场景中,显示场景中的这个层~,当然可以是多个层哦~  
  16.     } while (0);  
  17.   
  18.     // return the scene  
  19.     return scene;  
  20. }  

上面代码就是创建了Helloworld这个场景,然后创建了一个层。再把这个层添加到场景中去



还记得我在init()函数中添加按钮的代码么...当我们添加了一按钮后,我们就可以修改它相对于的响应函数:



[cpp] view plaincopy


  1. CCMenuItemImage *pCloseItem2 = CCMenuItemImage::itemFromNormalImage(  
  2.             "play1.png",  
  3.             "play2.png",  
  4.             this,  
  5.             menu_selector(HelloWorld::menuTestCallback));这个HelloWorld::menuTestCallback是个函数的名字这个函数需要我们自己写一个。  
  6.         CC_BREAK_IF(! pCloseItem2);  
  7.         pCloseItem2->setPosition(ccp(s.width/2, s.height-100));设置按钮位置  
  8.   
  9.         CCMenu* pMenu = CCMenu::menuWithItems(pCloseItem2, NULL);设置菜单项  
  10.         pMenu->setPosition(CCPointZero);  
  11.         CC_BREAK_IF(! pMenu);  
  12.   
  13.         this->addChild(pMenu, 1);添加菜单...后面的那个1表示的是层次。最小的层在表面  



上面是init()中的代码。主要就是创建了一个按钮,然后放入菜单中。然后添加菜单进入场景中...下面是关键的切换特效实现代码...



[cpp] view plaincopy


  1. void HelloWorld::menuTestCallback(CCObject* pSender)  
  2. {  
  3.     CCScene *scene = HelloWorld::scene();注意这里的Scene(),这个是切换至什么场景,我这里写的就是本身这个场景,所以切来切去就是自己一个场景..哈哈,不过咱们看的是切换的过度特效嘛..  
  4.     CCDirector::sharedDirector()->replaceScene(CCTransitionJumpZoom::transitionWithDuration(1.2f,scene));  
  5. }  



正常的没有过度的场景切换,就是用CCDirector::sharedDirector()->replaceScene(scene);大家主要注意这个CCTransitionJumpZoom::,这个就是切换效果了!替换这个就能实现各种效果!具体有哪些效果呢,这里转载了小满的博客:transitionWithDuration(t, s)这两个参数,第一个是时间,格式为 1.2f类似的浮点数。第二个是需要切换至的场景,上面有介绍啦

小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man

CCTransitionJumpZoom::transitionWithDuration(t, s);//跳跃式,本场景先会缩小,然后跳跃进来

CCTransitionFade::transitionWithDuration(t, s);//淡出淡入,原场景淡出,新场景淡入

CCTransitionFade::transitionWithDuration(t, s, ccWHITE);//如果上一个的函数,带3个参数,则第三个参数就是淡出淡入的颜色

CCTransitionFlipX::transitionWithDuration(t, s, kOrientationLeftOver);//x轴左翻

CCTransitionFlipX::transitionWithDuration(t, s, kOrientationRightOver);//x轴右翻

CCTransitionFlipY::transitionWithDuration(t, s, kOrientationUpOver);//y轴上翻

CCTransitionFlipY::transitionWithDuration(t, s, kOrientationDownOver);//y轴下翻

CCTransitionFlipAngular::transitionWithDuration(t, s, kOrientationLeftOver);//有角度转的左翻

CCTransitionFlipAngular::transitionWithDuration(t, s, kOrientationRightOver);//有角度转的右翻

CCTransitionZoomFlipX::transitionWithDuration(t, s, kOrientationLeftOver);//带缩放效果x轴左翻

CCTransitionZoomFlipX::transitionWithDuration(t, s, kOrientationRightOver);//带缩放效果x轴右翻

CCTransitionZoomFlipY::transitionWithDuration(t, s, kOrientationUpOver);//带缩放效果y轴上翻

CCTransitionZoomFlipY::transitionWithDuration(t, s, kOrientationDownOver);//带缩放效果y轴下翻 

CCTransitionZoomFlipAngular::transitionWithDuration(t, s, kOrientationLeftOver);//带缩放效果/有角度转的左翻

CCTransitionZoomFlipAngular::transitionWithDuration(t, s, kOrientationRightOver);//带缩放效果有角度转的右翻

CCTransitionShrinkGrow::transitionWithDuration(t, s);//交错换

CCTransitionRotoZoom::transitionWithDuration(t, s);//转角换

CCTransitionMoveInL::transitionWithDuration(t, s);//新场景从左移入覆盖

CCTransitionMoveInR::transitionWithDuration(t, s);//新场景从右移入覆盖

CCTransitionMoveInT::transitionWithDuration(t, s);//新场景从上移入覆盖

CCTransitionMoveInB::transitionWithDuration(t, s);//新场景从下移入覆盖

CCTransitionSlideInL::transitionWithDuration(t, s);//场景从左移入推出原场景

CCTransitionSlideInR::transitionWithDuration(t, s);//场景从右移入推出原场景

CCTransitionSlideInT::transitionWithDuration(t, s);//场景从上移入推出原场景

CCTransitionSlideInB::transitionWithDuration(t, s);//场景从下移入推出原场景以下三个需要检测opengl版本是否支持

CCConfiguration::sharedConfiguration()->getGlesVersion() <= GLES_VER_1_0如果为真则为不支持

CCTransitionCrossFade::transitionWithDuration(t,s);//淡出淡入交叉,同时进行

CCTransitionRadialCCW::transitionWithDuration(t,s);//顺时针切入

CCTransitionRadialCW::transitionWithDuration(t,s);//逆时针切入以下两个需要先设置摄像机,使用

CCDirector::sharedDirector()->setDepthTest(true);

CCTransitionPageTurn::transitionWithDuration(t, s, false);//翻页,前翻

CCTransitionPageTurn::transitionWithDuration(t, s, true);//翻页,后翻

CCTransitionFadeTR::transitionWithDuration(t, s);//向右上波浪

CCTransitionFadeBL::transitionWithDuration(t, s);//向左下波浪

CCTransitionFadeUp::transitionWithDuration(t, s);//向上百叶窗

CCTransitionFadeDown::transitionWithDuration(t, s);//向下百叶窗

CCTransitionTurnOffTiles::transitionWithDuration(t, s);//随机小方块

CCTransitionSplitRows::transitionWithDuration(t, s);//按行切

CCTransitionSplitCols::transitionWithDuration(t, s);//按列切


大家赶紧试试吧..有问题留言讨论哦~谢谢by...xx

[cpp] view plaincopy


  1. <pre></pre>  
  2. <pre></pre>  
  3. <pre></pre>  
  4. <pre></pre>  
  5. <pre></pre>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一些常见的Cocos面试题: 1. 什么是Cocos2d-x?它的主要特点是什么? Cocos2d-x是一个跨平台的2D游戏引擎,支持iOS、Android、Windows、Mac等多个平台。它的主要特点包括易用性、高效性、灵活性、可扩展性和开源性。 2. Cocos Creator和Cocos2d-x有什么区别? Cocos Creator是基于Cocos2d-x引擎的图形化开发工具,它通过可视化编辑器和JavaScript脚本来创建2D游戏。而Cocos2d-x则是一个原生的2D游戏引擎,需要使用C++来编写游戏代码。 3. 什么是Cocos Studio? Cocos Studio是一个可视化的游戏UI编辑器,它可以让开发者轻松地创建游戏中的各种UI元素,包括按钮、标签、进度条等等。Cocos Studio还支持导出UI资源,方便在Cocos2d-x引擎中使用。 4. Cocos2d-x中的精灵(Sprite)是什么?如何创建和操作它? 精灵是Cocos2d-x中最基础的图像元素,可以用来表示游戏中的角色、背景、道具等等。创建精灵可以使用Sprite类的create()方法,例如: ``` auto sprite = Sprite::create("sprite.png"); ``` 要调整精灵的位置、大小、旋转角度等属性,可以使用精灵的setPosition()、setScale()、setRotation()等方法,例如: ``` sprite->setPosition(Vec2(100, 100)); sprite->setScale(0.5f); sprite->setRotation(45); ``` 5. Cocos2d-x中的场景(Scene)是什么?如何创建和切换场景场景Cocos2d-x中用来管理游戏中各种元素的容器,一个游戏通常由多个场景组成。创建场景可以使用Scene类的create()方法,例如: ``` auto scene = Scene::create(); ``` 要在场景中添加精灵或其他元素,可以使用场景的addChild()方法,例如: ``` scene->addChild(sprite); ``` 要切换场景,可以使用Director类的replaceScene()方法,例如: ``` auto newScene = NewScene::create(); Director::getInstance()->replaceScene(newScene); ``` 6. Cocos2d-x中的动作(Action)是什么?如何创建和使用动作? 动作是Cocos2d-x中用来控制精灵运动、变换等行为的机制。创建动作可以使用Action类的各种静态方法,例如: ``` auto moveBy = MoveBy::create(2.0f, Vec2(100, 0)); auto rotateBy = RotateBy::create(2.0f, 360); auto sequence = Sequence::create(moveBy, rotateBy, nullptr); ``` 这里创建了一个移动和旋转的动作序列,先是2秒内向右移动100像素,再在2秒内旋转360度。要让精灵执行动作,可以使用精灵的runAction()方法,例如: ``` sprite->runAction(sequence); ``` 7. Cocos2d-x中的碰撞检测(Collision Detection)是什么?如何实现? 碰撞检测是指在游戏中检测两个元素是否重叠或相交的技术。Cocos2d-x提供了一些碰撞检测相关的类,例如PhysicsBody、PhysicsContact等。要实现碰撞检测,需要为需要检测碰撞的元素添加PhysicsBody组件,例如: ``` auto physicsBody = PhysicsBody::createCircle(sprite->getContentSize().width / 2); sprite->addComponent(physicsBody); ``` 这里为精灵添加了一个圆形的物理体。然后可以通过设置碰撞回调函数来检测碰撞事件,例如: ``` auto contactListener = EventListenerPhysicsContact::create(); contactListener->onContactBegin = [](PhysicsContact& contact) { // 处理碰撞事件 return true; }; ``` 这里创建了一个碰撞监听器,并设置了碰撞开始回调函数。当两个元素发生碰撞时,就会触发这个回调函数,可以在里面进行相应的处理。最后将监听器添加到场景中即可。 以上是一些常见的Cocos面试题,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值