对于场景的理解:以前移植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的一个场景的创建函数
CCScene* HelloWorld::scene() { CCScene * scene = NULL; do { // 'scene' is an autorelease object scene = CCScene::node();这里是创建一个场景 CC_BREAK_IF(! scene); // 'layer' is an autorelease object HelloWorld *layer = HelloWorld::node();这里是创建了一个层 CC_BREAK_IF(! layer); // add layer as a child to scene scene->addChild(layer);然后添加层到场景中,显示场景中的这个层~,当然可以是多个层哦~ } while (0); // return the scene return scene; }上面代码就是创建了Helloworld这个场景,然后创建了一个层。再把这个层添加到场景中去
还记得我在init()函数中添加按钮的代码么...当我们添加了一按钮后,我们就可以修改它相对于的响应函数:
CCMenuItemImage *pCloseItem2 = CCMenuItemImage::itemFromNormalImage( "play1.png", "play2.png", this, menu_selector(HelloWorld::menuTestCallback));这个HelloWorld::menuTestCallback是个函数的名字这个函数需要我们自己写一个。 CC_BREAK_IF(! pCloseItem2); pCloseItem2->setPosition(ccp(s.width/2, s.height-100));设置按钮位置 CCMenu* pMenu = CCMenu::menuWithItems(pCloseItem2, NULL);设置菜单项 pMenu->setPosition(CCPointZero); CC_BREAK_IF(! pMenu); this->addChild(pMenu, 1);添加菜单...后面的那个1表示的是层次。最小的层在表面
void HelloWorld::menuTestCallback(CCObject* pSender) { CCScene *scene = HelloWorld::scene();注意这里的Scene(),这个是切换至什么场景,我这里写的就是本身这个场景,所以切来切去就是自己一个场景..哈哈,不过咱们看的是切换的过度特效嘛.. CCDirector::sharedDirector()->replaceScene(CCTransitionJumpZoom::transitionWithDuration(1.2f,scene)); }
正常的没有过度的场景切换,就是用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