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

@H_301_215@boolAppDelegate::applicationDidFinishLaunching()
  • //取得当前显示设备指针并设置其OpenGL视窗
  • CCDirector*pDirector=CCDirector::sharedDirector();
  • pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
  • //取得当前运行硬件平台
  • TargetPlatformtarget=getTargetPlatform();
  • //如果是IPAD
  • if(target==kTargetIpad)
  • //如果能启动高清屏,使用高精度资源,否则使用一般精度资源
  • if(pDirector->enableRetinaDisplay(true))
  • {
  • CCFileUtils::sharedFileUtils()->setResourceDirectory("ipadhd");
  • }
  • else
  • CCFileUtils::sharedFileUtils()->setResourceDirectory("ipad");
  • }
  • //如果是Iphone
  • elseif(target==kTargetIphone)
  • //如果能启动高清屏,使用高精度资源
  • true))
  • CCFileUtils::sharedFileUtils()->setResourceDirectory("hd");
  • //设置FPS信息显示
  • pDirector->setDisplayStats(true);
  • //设置帧间隔时间
  • pDirector->setAnimationInterval(1.0/60);
  • //在这里创建一个场景
  • CCScene*pScene=CCScene::create();
  • //实例化一个TestController,它是一个CCLayer。
  • CCLayer*pLayer=newTestController();
  • //设置由内存管理器来进行自动回收,不必手动DELETE
  • pLayer->autorelease();
  • //将它放置到场景中
  • pScene->addChild(pLayer);
  • //运行这个新创建的场景。
  • pDirector->runWithScene(pScene);
  • returntrue;
  • }

  • 下面我们来看一下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相关文章