Cocos2d-x 2.0 TestCpp框架源码分析

前端之家收集整理的这篇文章主要介绍了Cocos2d-x 2.0 TestCpp框架源码分析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

好的引擎,会提供一系列完整的功能示例,Cocos2d-x之所以能得到很多人的喜爱,其重要的原因是它提供了丰富而易学的示例。在cocos2d-2.0-x-2.0.2中这些示例被放在一个名叫TestCpp的工程中,为了更好的学习Cocos2d-x的功能示例,我们今天来学习一下这个工程的框架结构。


在VS的解决方案里展开TestCpp工程,其下有43个示例目录,除此之前还有几个文件

AppDelegate.h/cpp : 程序控制类AppDelegate 。

controller.h/cpp:示例场景管理类TestController,用于显示所有示例的菜单

testBasic.h/cpp:示例场景基类TestScene,用于返回到主界面场景。

testResource.h:文件资源名称字符串定义头文件

tests.h:示例总头文件

main.h/cpp:主函数及头文件

所有的示例都是写在单独的由TestScene派生场景类中,在这些场景中加入一些由CCLayer派生的示例对象来实现相应功能的展示。

与HelloWorld一样,我们需要在main.cpp中创建AppDelegate实例,并设置窗口大小,启动游戏程序。

  1. #include"main.h"
  2. #include"AppDelegate.h"
  3. #include"CCEGLView.h"
  4. USING_NS_CC;
  5. //WIN32程序主函数
  6. intAPIENTRY_tWinMain(HINSTANCEhInstance,
  7. HINSTANCEhPrevInstance,
  8. LPTSTRlpCmdLine,87); background-color:inherit">intnCmdShow)
  9. {
  10. UNREFERENCED_PARAMETER(hPrevInstance);
  11. UNREFERENCED_PARAMETER(lpCmdLine);
  12. //实例化一个Cocos2d-x程序对象
  13. AppDelegateapp;
  14. //创建OpenGL视窗并设置窗口大小
  15. CCEGLView*eglView=CCEGLView::sharedOpenGLView();
  16. eglView->setFrameSize(480,320);
  17. //运行程序对象
  18. returnCCApplication::sharedApplication()->run();
  19. }

在AppDelegate.cpp中的boolAppDelegate::applicationDid。FinishLaunching()函数中创建场景并运行场景

copy

    boolAppDelegate::applicationDidFinishLaunching()
  1. //取得当前显示设备指针并设置其OpenGL视窗
  2. CCDirector*pDirector=CCDirector::sharedDirector();
  3. pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
  4. //取得当前运行硬件平台
  5. TargetPlatformtarget=getTargetPlatform();
  6. //如果是IPAD
  7. if(target==kTargetIpad)
  8. //如果能启动高清屏,使用高精度资源,否则使用一般精度资源
  9. if(pDirector->enableRetinaDisplay(true))
  10. {
  11. CCFileUtils::sharedFileUtils()->setResourceDirectory("ipadhd");
  12. }
  13. else
  14. CCFileUtils::sharedFileUtils()->setResourceDirectory("ipad");
  15. }
  16. //如果是Iphone
  17. elseif(target==kTargetIphone)
  18. //如果能启动高清屏,使用高精度资源
  19. true))
  20. CCFileUtils::sharedFileUtils()->setResourceDirectory("hd");
  21. //设置FPS信息显示
  22. pDirector->setDisplayStats(true);
  23. //设置帧间隔时间
  24. pDirector->setAnimationInterval(1.0/60);
  25. //在这里创建一个场景
  26. CCScene*pScene=CCScene::create();
  27. //实例化一个TestController,它是一个CCLayer。
  28. CCLayer*pLayer=newTestController();
  29. //设置由内存管理器来进行自动回收,不必手动DELETE
  30. pLayer->autorelease();
  31. //将它放置到场景中
  32. pScene->addChild(pLayer);
  33. //运行这个新创建的场景。
  34. pDirector->runWithScene(pScene);
  35. returntrue;
  36. }

下面我们来看一下testBase.h/cpp,这里面有一个所有示例都要用到的场景基类TestScene。

copy
    #ifndef_TEST_BASIC_H_
  1. #define_TEST_BASIC_H_
  2. //Cocos2d头文件
  3. #include"cocos2d.h"
  4. //使用Cocos2d命名空间
  5. usingnamespacestd;
  6. classTestScene:publicCCScene
  7. public:
  8. //构造
  9. TestScene(boolbPortrait=false);
  10. //场景被加载时的回调函数
  11. virtualvoidonEnter();
  12. //自定义的虚函数,用于运行场景。
  13. voidrunThisTest()=0;
  14. //返回主界面的菜单按钮响应回调函数
  15. voidMainMenuCallback(CCObject*pSender);
  16. };
  17. #endif

cpp文件:


copy
    #include"testBasic.h"
  1. #include"controller.h"
  2. //构造函数
  3. TestScene::TestScene(boolbPortrait)
  4. CCScene::init();
  5. //场景被加载时的回调函数
  6. voidTestScene::onEnter()
  7. CCScene::onEnter();
  8. //#if(CC_TARGET_PLATFORM==CC_PLATFORM_MARMALADE)
  9. //CCLabelBMFont*label=CCLabelBMFont::create("MainMenu","fonts/arial16.fnt");
  10. //#else
  11. //创建一个文字标签显示“MainMenu”字符串
  12. CCLabelTTF*label=CCLabelTTF::create("MainMenu","Arial",20);
  13. //#endif
  14. //增加一个菜单标签,设定其被按下时的回调函数,用于返回到主界面
  15. CCMenuItemLabel*pMenuItem=CCMenuItemLabel::create(label,this,menu_selector(TestScene::MainMenuCallback));
  16. //将菜单标签加入创建的菜单中,并设置相应位置。
  17. CCMenu*pMenu=CCMenu::create(pMenuItem,NULL);
  18. CCSizes=CCDirector::sharedDirector()->getWinSize();
  19. pMenu->setPosition(CCPointZero);
  20. pMenuItem->setPosition(CCPointMake(s.width-50,25));
  21. //将菜单放入场景中。
  22. addChild(pMenu,1);
  23. //菜单标签被按下时的响应函数
  24. voidTestScene::MainMenuCallback(CCObject*pSender)
  25. //新创建一个场景。
  26. CCScene*pScene=CCScene::create();
  27. //新创建一个TestController对象
  28. CCLayer*pLayer=newTestController();
  29. //将它放入新创建的场景中并运行。
  30. CCDirector::sharedDirector()->replaceScene(pScene);
  31. }

在TestScene中,提供了一个可以被点击的标签MainMenu,从字面意思就知道点击它可以返回主菜单界面,这个主菜单在哪呢?就是TestController。

copy
    #ifndef_CONTROLLER_H_
  1. #define_CONTROLLER_H_
  2. classTestController:publicCCLayer
  3. public:
  4. //构造
  5. TestController();
  6. //析构
  7. ~TestController();
  8. //菜单项响应回调函数
  9. voidmenuCallback(CCObject*pSender);
  10. //关闭程序响应回调函数
  11. voidcloseCallback(CCObject*pSender);
  12. //按下触点响应函数
  13. voidccTouchesBegan(CCSet*pTouches,CCEvent*pEvent);
  14. //按下状态移动触点响应函数
  15. voidccTouchesMoved(CCSet*pTouches,153); background-color:inherit">private:
  16. //接下状态移动触点的开始位置
  17. CCPointm_tBeginPos;
  18. //主菜单
  19. CCMenu*m_pItemMenu;
  20. };
  21. #endif
进入Cpp看一下:
copy
    #include"controller.h"
  1. #include"testResource.h"
  2. #include"tests.h"
  3. //菜单项的行间距,设40点
  4. #defineLINE_SPACE40
  5. //创建一个当前触点位置变量,初始化为左下角位置。
  6. staticCCPoints_tCurPos=CCPointZero;
  7. //创建指定的示例场景
  8. staticTestScene*CreateTestScene(intnIdx)
  9. //先清空一下显示设备使用的数据
  10. CCDirector::sharedDirector()->purgeCachedData();
  11. //定义TestScene指针用于接收创建的示例场景
  12. TestScene*pScene=NULL;
  13. //跟据参数来创建相应的TestScene派生类对象。
  14. switch(nIdx)
  15. caseTEST_ACTIONS://动画处理
  16. pScene=newActionsTestScene();break;
  17. caseTEST_TRANSITIONS://场景切换
  18. newTransitionsTestScene();caseTEST_PROGRESS_ACTIONS://进度动画控制
  19. newProgressActionsTestScene();caseTEST_EFFECTS://特效演示
  20. newEffectTestScene();caseTEST_CLICK_AND_MOVE://拖动演示
  21. newClickAndMoveTestScene();caseTEST_ROTATE_WORLD://旋转CCLayer
  22. newRotateWorldTestScene();caseTEST_PARTICLE://粒子系统
  23. newParticleTestScene();caseTEST_EASE_ACTIONS://多样化运动动画
  24. newActionsEaseTestScene();caseTEST_MOTION_STREAK://拖尾动画效果
  25. newMotionStreakTestScene();caseTEST_DRAW_PRIMITIVES://基本图形绘制
  26. newDrawPrimitivesTestScene();caseTEST_COCOSNODE://结点控制
  27. newCocosNodeTestScene();caseTEST_TOUCHES://触屏处理
  28. newPongScene();caseTEST_MENU://菜单处理
  29. newMenuTestScene();caseTEST_ACTION_MANAGER://动画管理
  30. newActionManagerTestScene();caseTEST_LAYER://CCLayer功能展示
  31. newLayerTestScene();caseTEST_SCENE://CCScene功能展示
  32. newSceneTestScene();caseTEST_PARALLAX://视角控制
  33. newParallaxTestScene();caseTEST_TILE_MAP://基于格子的地图
  34. newTileMapTestScene();caseTEST_INTERVAL://时间控制
  35. newIntervalTestScene();caseTEST_CHIPMUNKACCELTOUCH://ChipMunk物理引擎与多点触屏
  36. #if(CC_TARGET_PLATFORM!=CC_PLATFORM_MARMALADE)
  37. pScene=newChipmunkAccelTouchTestScene();break;
  38. #else
  39. #ifdefMARMALADEUSECHIPMUNK
  40. #if(MARMALADEUSECHIPMUNK==1)
  41. newChipmunkAccelTouchTestScene();
  42. #endif
  43. #endif
  44. caseTEST_LABEL://文字标签
  45. newAtlasTestScene();caseTEST_TEXT_INPUT://输入处理
  46. newTextInputTestScene();caseTEST_SPRITE://精灵功能展示
  47. newSpriteTestScene();caseTEST_SCHEDULER://动画的时间调度
  48. newSchedulerTestScene();caseTEST_RENDERTEXTURE://渲染到纹理
  49. newRenderTextureScene();caseTEST_TEXTURE2D://纹理功能展示
  50. newTextureTestScene();caseTEST_Box2D://Box2D物理引擎展示
  51. newBox2DTestScene();caseTEST_Box2DBED://Box2D物理引擎展示[物体的固定与连接]
  52. newBox2dTestBedScene();caseTEST_EFFECT_ADVANCE://高级屏幕效果
  53. newEffectAdvanceScene();caseTEST_ACCELEROMRTER://加速度
  54. newAccelerometerTestScene(); #if(CC_TARGET_PLATFORM!=CC_PLATFORM_BADA)
  55. caseTEST_KEYPAD://键区处理
  56. newKeypadTestScene();caseTEST_COCOSDENSHION://声效控制
  57. newCocosDenshionTestScene();caseTEST_PERFORMANCE://性能测试
  58. newPerformanceTestScene();caseTEST_ZWOPTEX://ZWOPTEX动国
  59. newZwoptexTestScene();//badadon'tsupportlibcurl
  60. caseTEST_CURL://网络通信基本演示
  61. newCurlTestScene();caseTEST_USERDEFAULT://用户日志保存示例
  62. newUserDefaultTestScene();caseTEST_BUGS://BUG示例
  63. newBugsTestScene();caseTEST_FONTS://字体演示
  64. newFontTestScene();caseTEST_CURRENT_LANGUAGE://获取当前语言
  65. newCurrentLanguageTestScene(); #if(CC_TARGET_PLATFORM!=CC_PLATFORM_MARMALADE)
  66. caseTEST_TEXTURECACHE:pScene=newTextureCacheTestScene();caseTEST_EXTENSIONS:
  67. {//更多扩展实例
  68. newExtensionsTestScene();
  69. caseTEST_SHADER://使用Shader的渲染演示
  70. newShaderTestScene();
  71. caseTEST_MUTITOUCH://多点触屏
  72. newMutiTouchTestScene();
  73. default:
  74. //返回创建的场景
  75. returnpScene;
  76. TestController::TestController()
  77. :m_tBeginPos(CCPointZero)
  78. //加入一个关闭菜单按钮
  79. CCMenuItemImage*pCloseItem=CCMenuItemImage::create(s_pPathClose,s_pPathClose,menu_selector(TestController::closeCallback));
  80. //创建一个菜单放置关闭按钮
  81. CCMenu*pMenu=CCMenu::create(pCloseItem,NULL);
  82. CCSizes=CCDirector::sharedDirector()->getWinSize();
  83. //设置这个菜单位置
  84. pCloseItem->setPosition(CCPointMake(s.width-30,s.height-30));
  85. //新建一个测试项菜单,将所有代表测试场景的菜单标签项加入菜单
  86. m_pItemMenu=CCMenu::create();
  87. //
  88. for(inti=0;i<TESTS_COUNT;++i)
  89. //#if(CC_TARGET_PLATFORM==CC_PLATFORM_MARMALADE)
  90. //CCLabelBMFont*label=CCLabelBMFont::create(g_aTestNames[i].c_str(),"fonts/arial16.fnt");
  91. //#else
  92. CCLabelTTF*label=CCLabelTTF::create(g_aTestNames[i].c_str(),"Arial",24);
  93. CCMenuItemLabel*pMenuItem=CCMenuItemLabel::create(label,menu_selector(TestController::menuCallback));
  94. //将代表测试场景的菜单标签加入菜单中,以i+10000的值做为Z值。
  95. m_pItemMenu->addChild(pMenuItem,i+10000);
  96. //设置代表测试场景的菜单标签在测试项菜单层的位置
  97. pMenuItem->setPosition(CCPointMake(s.width/2,(s.height-(i+1)*LINE_SPACE)));
  98. //设置测试项菜单的大小
  99. m_pItemMenu->setContentSize(CCSizeMake(s.width,(TESTS_COUNT+1)*(LINE_SPACE)));
  100. //设置测试项菜单的位置
  101. m_pItemMenu->setPosition(s_tCurPos);
  102. //将测试项菜单放入当前CCLayer
  103. addChild(m_pItemMenu);
  104. //设置开启触屏事件响应
  105. setTouchEnabled(true);
  106. //将关闭按钮项菜单放入当前CCLayer
  107. addChild(pMenu,1);
  108. TestController::~TestController()
  109. //点击菜单项的事件响应函数
  110. voidTestController::menuCallback(CCObject*pSender)
  111. //取得菜单
  112. CCMenuItem*pMenuItem=(CCMenuItem*)(pSender);
  113. //取得Z值,减10000算出是第几个菜单
  114. intnIdx=pMenuItem->getZOrder()-10000;
  115. //创建相应的场景
  116. TestScene*pScene=CreateTestScene(nIdx);
  117. if(pScene)
  118. //运行当前测试场景
  119. pScene->runThisTest();
  120. //runThisTest中会对其引用计数加1变为2,这里做一次引用计数减1操作,以保证后面再释放场景时可以正常的释放。
  121. pScene->release();
  122. //点击关闭按钮时的响应处理
  123. voidTestController::closeCallback(CCObject*pSender)
  124. //退出程序
  125. CCDirector::sharedDirector()->end();
  126. #if(CC_TARGET_PLATFORM==CC_PLATFORM_IOS)
  127. exit(0);
  128. //触点按下时的响应处理
  129. voidTestController::ccTouchesBegan(CCSet*pTouches,CCEvent*pEvent)
  130. //获取第一个触点位置
  131. CCSetIteratorit=pTouches->begin();
  132. CCTouch*touch=(CCTouch*)(*it);
  133. //将位置保存到变量m_tBeginPos中。
  134. m_tBeginPos=touch->getLocation();
  135. //触点
  136. voidTestController::ccTouchesMoved(CCSet*pTouches,CCEvent*pEvent)
  137. //获取第一个触点位置
  138. CCSetIteratorit=pTouches->begin();
  139. CCTouch*touch=(CCTouch*)(*it);
  140. //取得这个位置与上一帧移动的Y值之差,即在纵方向的偏移。
  141. CCPointtouchLocation=touch->getLocation();
  142. floatnMoveY=touchLocation.y-m_tBeginPos.y;
  143. //计算菜单在纵方向上也移动相应值后的新位置。
  144. CCPointcurPos=m_pItemMenu->getPosition();
  145. CCPointnextPos=ccp(curPos.x,curPos.y+nMoveY);
  146. //这里对新位置的有效范围做个限定
  147. CCSizewinSize=CCDirector::sharedDirector()->getWinSize();
  148. if(nextPos.y<0.0f)
  149. m_pItemMenu->setPosition(CCPointZero);
  150. return;
  151. if(nextPos.y>((TESTS_COUNT+1)*LINE_SPACE-winSize.height))
  152. m_pItemMenu->setPosition(ccp(0,((TESTS_COUNT+1)*LINE_SPACE-winSize.height)));
  153. //更新菜单到新位置
  154. m_pItemMenu->setPosition(nextPos);
  155. //记录当前位置为旧位置。
  156. m_tBeginPos=touchLocation;
  157. s_tCurPos=nextPos;
  158. }

总结:示例框架展示了一个菜单,每个菜单项代表了一个示例工程,菜单项的Z值是递增排列的。点击菜单项响应TestController::menuCallback函数,此函数通过减去Z值基数可以取得菜单项的索引,并通过CreateTestScene(nIdx);来创建出相应的示例场景。本示例框架还演示了如何在纵方向上拖动一个菜单


猜你在找的Cocos2d-x相关文章