到目前为止,我们讨论了多个场景和多个层的应用。现在我们来讨论关卡。
大家应该对关卡的概念都很熟悉,所以我不在这里做解释了。设计关卡的难点是决定用什么样的方式来设计基于关卡的游戏。
在Cocos2d-x中个关卡都使用一个场景,或者在同一个场景里设置多个层作为关卡。选择哪种方式取决于关卡在你游戏中的作用。
No.1 每一个关卡都使用一个场景
最直接的方法是每一个关卡都使用一个单独的场景。你可以为每一个关卡创建一个新的场景类(Scene class),或者通过把关卡号码或其它与关卡相关的信息传递给一个通用的关卡场景类(LevelScene class)用于加载正确的关卡数据。
这个方法很适合每个关卡之间没有多大关系,关卡可以清晰地分开的情况。你可能需要保存玩家的得分和当前剩余的生命数,除此之外不需要再保存其它的信息了。这种情况下的用户界面可能是静态的,或者最多只有一个暂停按钮。 |
No.2 同一个场景里设置多个层作为关卡
如果你有一个复杂的用户界面,并且在关卡转换时不允许重置游戏场景的话,你就需要在同一个场景里用不同的层来加载和显示不同的关卡。在转换关卡时,你可能会将游戏角色和其它的游戏物体保持在同一个位置。
你可能使用几个变量来保存当前的游戏状态信息和用户界面设置信息,比如说仓库里的物品。如果你使用多个场景作为关卡的话,在转换关卡的时候,你就需要做很多工作来保存和重置游戏设置,还有重置所有的视觉元素。 这个方式很适合物品寻找类或者冒险类游戏,因为玩家需要在不同的房间之间移动。特别是你想在替换关卡内容的过程中使用动画的情况下。 |
CCLayerMultiplex
CCLayerMultiplex类可被用于这种方式中。它可以同时包含多个节点,但是任意时间里只有一个节点是有效的。但是唯一的缺点是你不能在层之间使用过渡效果。因为任意时间里只能有一个层是可视的,所以任何过渡效果都是不可能发生的。
- CCLayerMultiplex *multiplex=CCLayerMultiplex::layerWithLayers(layer1,layer2,NULL);
- //切换到第二个Layer
- multiplex->switchTo(1);
- //切换到第二个Layer并且释放当前Layer 以后就不能切换到当前Layer
- multiplex->switchToAndReleaseMe(1);
CCLayerColor
CCLayerColor类可用于改变背景颜色
- CCLayerColor *layercolor=CCLayerColor::layerWithColor(ccc4(225,0,225,255));
- this->addChild(layercolor,0);
如果你熟悉OpenGL的话,你可能会觉得没有必要为了改变背景颜色而添加一个单独的层。你可以使用以下OpenGL代码得到相同的效果:
- glClearColor(255,0,255,255);
但是如果你在场景中使用了过渡效果的话,你最好先在游戏里测试一下上述OpenGL代码,因为glClearColor对场景过渡效果会产生不好的影响。 |
一些很酷的CCNode类
以下我会介绍四个基于CCNode可以满足特定要求的类。它们是:
CCProgressTimer,
CCParallaxNode,
CCMotionStreak。
CCProgressTimer进度条
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- middle = CCProgressTimer::create(CCSprite::create("time.png"));
- // setType 设置类型
- // kCCProgressTimerTypeRadial为弧形
- // kCCProgressTimerTypeBar为条形
- middle->setType(kCCProgressTimerTypeRadial);
- // setMidpoint 实现向左,向右,向上,向下或中间像两头移动的,
- // 你只要改变ccp(x,y)中x,y的值来实现
- // ccp(0,0)这表示从左到右的曾加,
- // ccp(1,0)表示从右到左的增加
- // ccp(0,1)表示从下到上的增加
- // ccp(0.5f,0)表示从中间向左向右两头增加,
- // 还有很多,看你怎么设置了
- middle->setMidpoint(ccp(0,0));
- //设置进度 0-100
- middle->setPercentage(proportion);
- middle->setPosition(ccp(size.width/2,size.height/2));
- addChild(middle);
- //进度条需要预约的更新方法来更新自身的状态
- scheduleUpdate();
进度条有一个缺点:它不会自己更新自己。你必须经常更新进度条的百分比数值来显示进度. |
Update方法代码:
- void MyScene::update(ccTime time) {
- proportion++;
- middle->setPercentage(proportion);
- if (proportion >= 100)
- proportion= 0;
- }
CCParallaxNode 视差视图
“视差”(Parallaxing)是2D游戏中通过让不同层上的图片用不同的速度移动,来创造视觉深度的方法。前景的图片移动的比背景图片要快。cocos2d-x有一个特殊的节点用于实现这个效果
- bool ParallaxScreen::init() {
- bool bRet = false;
- do {
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- node = CCParallaxNode::create();
- this->addChild(node);
- CCSprite *sprite1 = CCSprite::create("parallax/parallax1.png");
- CCSprite *sprite2 = CCSprite::create("parallax/parallax2.png");
- //设置速度
- CCPoint speed1 = CCPointMake(0.5,0.5);
- CCPoint speed2 = CCPointMake(0.1,0.1);
- node->addChild(sprite1, 1, speed1, CCPointMake(0,0));
- node->addChild(sprite2, 2, speed2, CCPointMake(0,size.width/2));
- this->scheduleUpdate();
- bRet = true;
- } while (0);
- return bRet;
- }
- void ParallaxScreen::update(ccTime time) {
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- CCPoint backgroundScrollVert = CCPointMake(1000,0);
- node->setPosition(
- ccpAdd(node->getPosition(), ccpMult(backgroundScrollVert, time)));
- if (node->getPosition().x > size.width*4) {
- node->setPosition(CCPointMake(0,node->getPosition().y));
- }
- }
CCMotionStreak(拖尾效果)
- bool Ribbon::init() {
- bool bRet = false;
- do {
- CCSize size=CCDirector::sharedDirector()->getWinSize();
- // 第一个参数用于决定元素消失的速度,它的值越小,元素消失的越快
- // 第二个参数是间隐片断的大小
- // 第三个参数是贴图的宽
- // 第四个参数是颜色值argb
- // 第五个参数是贴图的路径
- motion = CCMotionStreak::create(3, 3, 32, ccc3(255, 255, 0), "s1.png");
- motion->setPosition(CCPointMake(size.width/2,size.height/2));
- this->addChild(motion);
- this->setTouchEnabled(true);
- bRet = true;
- } while (0);
- return bRet;
- }
- void Ribbon::registerWithTouchDispatcher(){
- CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);
- }
- void Ribbon::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {
- CCLog("拖动");
- CCPoint point = pTouch->getLocation();
- // convertToGL: 转换成opengl坐标啊,(0,0)在左下方
- // convertToUI:转换成quartz坐标,(0,0)在左上方的.
- point=CCDirector::sharedDirector()->convertToUI(point);
- motion->setPosition(point);
- }
- //bool Ribbon::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
- // CCLog("触摸到屏幕");
- // return true;
- //}
相关推荐
《Cocos2d-x实战:C++卷(2版)源代码》这本书是关于使用Cocos2d-x游戏引擎进行游戏开发的专业指南。Cocos2d-x是一个开源的、跨平台的游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言...
《cocos2d-x 2.1.4:探索移动游戏开发的新篇章》 cocos2d-x 是一个跨平台的2D游戏开发框架,它为开发者提供了强大的工具和技术支持,使得游戏开发变得更为便捷。2.1.4 版本是这个框架的一个重要里程碑,它在前一...
2. 地图拼接:TMX或CSV格式的文件描述了游戏地图的结构,cocos2d-x的TiledMap类可以加载这些文件,动态拼接地图,实现滚动效果。 3. 触摸事件处理:跑酷游戏通常需要响应玩家的触摸操作,如滑动屏幕控制角色移动,...
《Cocos2d-x实战 Lua卷》是一本深入讲解Cocos2d-x游戏开发的书籍,专注于使用Lua脚本语言进行编程。Cocos2d-x是一个开源的游戏开发框架,广泛应用于2D游戏、教育应用和各种互动媒体项目。这本书的源码提供了丰富的...
cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...
《cocos2d-x 3.x游戏开发实战光盘》是一个深入探讨cocos2d-x 3.x游戏引擎开发的资源集合,旨在帮助开发者通过实际案例掌握这一强大的2D游戏开发工具。cocos2d-x是一款开源的游戏开发框架,基于C++,广泛应用于跨平台...
《开心斗地主》是一款基于Cocos2d-x框架开发的经典棋牌类游戏,适用于移动平台。Cocos2d-x是一个跨平台的2D游戏开发框架,由C++编写,支持iOS、Android、Windows等多个操作系统。它以其高效、易用的特点,深受游戏...
这个“Cocos2d-X游戏源码大合集.rar”文件显然包含了大约三十个使用Cocos2d-X开发的游戏实例源代码,对于学习和理解Cocos2d-X游戏开发的原理、技巧以及实践应用具有极大的价值。 1. **Cocos2d-X基础**: Cocos2d-X...
使用cocos2d-x编写的ui编辑器(界面编辑器),实现了ui的可视化编辑,支持sprite、button、label、scale9sprite等等,导出配置文件格式为json格式-Cocos2d-x prepared ui interface editor, ui visual editing ...
总的来说,这个cocos2d-x游戏实例将涵盖游戏开发的多个核心领域,包括UI设计、物理模拟、动画制作、事件处理、内存管理等,对于想要深入学习Cocos2d-x游戏开发的初学者来说,这是一个非常有价值的实践项目。...
3. **动作与动画**:Cocos2d-x 提供了一系列的动作类,如MoveTo、RotateTo等,可以方便地为游戏对象添加动态效果。同时,通过帧动画(Frame Animation)可以实现复杂的序列化动画效果。 4. **物理引擎**:Cocos2d-x...
然而,值得注意的是,随着时间的推移,cocos2d-x经历了多次更新和改进,新版本可能引入了更多的优化和新特性,如性能提升、新的UI系统、多线程支持等。因此,对于现代游戏开发,可能需要结合最新的cocos2d-x版本进行...
Cocos2d-x的`ui`模块提供了丰富的UI组件,如`Text`, `Button`等,可以在`Classes`目录下找到相关的UI布局和事件处理代码。 7. **性能优化**: 在源码中,可能会发现一些性能优化技巧,如缓存重复使用的对象,合理...
6. UI界面:cocos2d-x的UI组件如Label、Button、Panel等可以构建游戏的菜单、对话框等界面,实现玩家与游戏的交互。 7. 性能优化:在中期阶段,开发者还需要关注性能优化,如减少不必要的渲染,合理使用缓存,以及...
5. **UI界面设计**:使用Cocos2d-x的UI组件(如Menu、Label、Button等)配合Lua脚本创建游戏菜单、提示信息等界面元素,同时学习事件处理机制。 6. **动画与物理系统**:Cocos2d-x内置了强大的动画和物理引擎,如...
Cocos2d-lua是一款基于Cocos2d-x引擎的轻量级游戏开发框架,它将强大的C++底层引擎与灵活易用的Lua脚本语言相结合,为游戏开发者提供了一个高效、便捷的游戏开发平台。在“Cocos2d-x之Lua核心编程(第二版)_配套代码...
通过深入研究这个源码,开发者不仅可以学习Cocos2d-X框架的基本用法,还可以了解到如何构建一个完整的斗地主游戏,包括游戏规则的实现、UI设计、资源管理、性能优化等多个方面,对提升游戏开发技能大有裨益。
《Cocos2d-x实战 JS卷 Cocos2d-js开发》是一本专注于使用JavaScript进行Cocos2d-x游戏开发的专业书籍。随书源码包含了从第13章到第24章的示例代码,由于文件大小超出上传限制,源码被分为两个压缩包。在这些章节中,...
4. **用户界面(UI)**:游戏中的按钮、计分板等元素属于UI部分,cocos2d-x提供了UI组件,如Label、Button等,源代码将展示如何构建和管理UI元素。 5. **事件处理**:游戏中的玩家输入、碰撞事件都需要响应,cocos...