Cocos2d-x 2.0 TestCpp框架源码分析

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

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


@H_502_3@

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

@H_502_3@

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

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

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

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

tests.h:示例总头文件@H_502_3@

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

@H_502_3@

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

@H_502_3@

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

@H_502_3@

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

@H_502_3@

@H_502_3@

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

copy

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

@H_502_3@

@H_502_3@

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

copy
    #ifndef_TEST_BASIC_H_@H_502_3@@H_502_3@@H_502_3@
  1. #define_TEST_BASIC_H_@H_502_3@@H_502_3@@H_502_3@
  2. //Cocos2d头文件@H_502_3@@H_502_3@@H_502_3@
  3. #include"cocos2d.h"@H_502_3@@H_502_3@@H_502_3@
  4. //使用Cocos2d命名空间@H_502_3@@H_502_3@@H_502_3@
  5. using@H_502_3@@H_502_3@namespace@H_502_3@std;@H_502_3@@H_502_3@
  6. class@H_502_3@TestScene:@H_502_3@public@H_502_3@CCScene@H_502_3@@H_502_3@
  7. public@H_502_3@:@H_502_3@@H_502_3@
  8. //构造@H_502_3@@H_502_3@@H_502_3@
  9. TestScene(bool@H_502_3@bPortrait=@H_502_3@false@H_502_3@);@H_502_3@@H_502_3@
  10. //场景被加载时的回调函数@H_502_3@@H_502_3@@H_502_3@
  11. virtual@H_502_3@@H_502_3@void@H_502_3@onEnter();@H_502_3@@H_502_3@
  12. //自定义的虚函数,用于运行场景。@H_502_3@@H_502_3@@H_502_3@
  13. void@H_502_3@runThisTest()=0;@H_502_3@@H_502_3@
  14. //返回主界面的菜单按钮响应回调函数。@H_502_3@@H_502_3@@H_502_3@
  15. void@H_502_3@MainMenuCallback(CCObject*pSender);@H_502_3@@H_502_3@
  16. };@H_502_3@
  17. #endif@H_502_3@@H_502_3@@H_502_3@

cpp文件:@H_502_3@


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

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

copy
    #ifndef_CONTROLLER_H_@H_502_3@@H_502_3@@H_502_3@
  1. #define_CONTROLLER_H_@H_502_3@@H_502_3@@H_502_3@
  2. class@H_502_3@TestController:@H_502_3@public@H_502_3@CCLayer@H_502_3@@H_502_3@
  3. public@H_502_3@:@H_502_3@@H_502_3@
  4. //构造@H_502_3@@H_502_3@@H_502_3@
  5. TestController();@H_502_3@
  6. //析构@H_502_3@@H_502_3@@H_502_3@
  7. ~TestController();@H_502_3@
  8. //菜单项响应回调函数@H_502_3@@H_502_3@@H_502_3@
  9. void@H_502_3@menuCallback(CCObject*pSender);@H_502_3@@H_502_3@
  10. //关闭程序响应回调函数@H_502_3@@H_502_3@@H_502_3@
  11. void@H_502_3@closeCallback(CCObject*pSender);@H_502_3@@H_502_3@
  12. //按下触点响应函数。@H_502_3@@H_502_3@@H_502_3@
  13. void@H_502_3@ccTouchesBegan(CCSet*pTouches,CCEvent*pEvent);@H_502_3@@H_502_3@
  14. //按下状态移动触点响应函数。@H_502_3@@H_502_3@@H_502_3@
  15. void@H_502_3@ccTouchesMoved(CCSet*pTouches,153); background-color:inherit">private@H_502_3@:@H_502_3@@H_502_3@
  16. //接下状态移动触点的开始位置@H_502_3@@H_502_3@@H_502_3@
  17. CCPointm_tBeginPos;@H_502_3@
  18. //主菜单@H_502_3@@H_502_3@@H_502_3@
  19. CCMenu*m_pItemMenu;@H_502_3@
  20. };@H_502_3@
  21. #endif@H_502_3@@H_502_3@@H_502_3@
进入Cpp看一下:
copy
    #include"controller.h"@H_502_3@@H_502_3@@H_502_3@
  1. #include"testResource.h"@H_502_3@@H_502_3@@H_502_3@
  2. #include"tests.h"@H_502_3@@H_502_3@@H_502_3@
  3. //菜单项的行间距,设40点@H_502_3@@H_502_3@@H_502_3@
  4. #defineLINE_SPACE40@H_502_3@@H_502_3@@H_502_3@
  5. //创建一个当前触点位置变量,初始化为左下角位置。@H_502_3@@H_502_3@@H_502_3@
  6. static@H_502_3@CCPoints_tCurPos=CCPointZero;@H_502_3@@H_502_3@
  7. //创建指定的示例场景@H_502_3@@H_502_3@@H_502_3@
  8. static@H_502_3@TestScene*CreateTestScene(@H_502_3@int@H_502_3@nIdx)@H_502_3@@H_502_3@
  9. //先清空一下显示设备使用的数据@H_502_3@@H_502_3@@H_502_3@
  10. CCDirector::sharedDirector()->purgeCachedData();@H_502_3@
  11. //定义TestScene指针用于接收创建的示例场景@H_502_3@@H_502_3@@H_502_3@
  12. TestScene*pScene=NULL;@H_502_3@
  13. //跟据参数来创建相应的TestScene派生类对象。@H_502_3@@H_502_3@@H_502_3@
  14. switch@H_502_3@(nIdx)@H_502_3@@H_502_3@
  15. case@H_502_3@TEST_ACTIONS:@H_502_3@//动画处理@H_502_3@@H_502_3@@H_502_3@
  16. pScene=new@H_502_3@ActionsTestScene();@H_502_3@break@H_502_3@;@H_502_3@@H_502_3@
  17. case@H_502_3@TEST_TRANSITIONS:@H_502_3@//场景切换@H_502_3@@H_502_3@@H_502_3@
  18. new@H_502_3@TransitionsTestScene();@H_502_3@case@H_502_3@TEST_PROGRESS_ACTIONS:@H_502_3@//进度动画控制@H_502_3@@H_502_3@@H_502_3@
  19. new@H_502_3@ProgressActionsTestScene();@H_502_3@case@H_502_3@TEST_EFFECTS:@H_502_3@//特效演示@H_502_3@@H_502_3@@H_502_3@
  20. new@H_502_3@EffectTestScene();@H_502_3@case@H_502_3@TEST_CLICK_AND_MOVE:@H_502_3@//拖动演示@H_502_3@@H_502_3@@H_502_3@
  21. new@H_502_3@ClickAndMoveTestScene();@H_502_3@case@H_502_3@TEST_ROTATE_WORLD:@H_502_3@//旋转CCLayer@H_502_3@@H_502_3@@H_502_3@
  22. new@H_502_3@RotateWorldTestScene();@H_502_3@case@H_502_3@TEST_PARTICLE:@H_502_3@//粒子系统@H_502_3@@H_502_3@@H_502_3@
  23. new@H_502_3@ParticleTestScene();@H_502_3@case@H_502_3@TEST_EASE_ACTIONS:@H_502_3@//多样化运动动画@H_502_3@@H_502_3@@H_502_3@
  24. new@H_502_3@ActionsEaseTestScene();@H_502_3@case@H_502_3@TEST_MOTION_STREAK:@H_502_3@//拖尾动画效果@H_502_3@@H_502_3@@H_502_3@
  25. new@H_502_3@MotionStreakTestScene();@H_502_3@case@H_502_3@TEST_DRAW_PRIMITIVES:@H_502_3@//基本图形绘制@H_502_3@@H_502_3@@H_502_3@
  26. new@H_502_3@DrawPrimitivesTestScene();@H_502_3@case@H_502_3@TEST_COCOSNODE:@H_502_3@//结点控制@H_502_3@@H_502_3@@H_502_3@
  27. new@H_502_3@CocosNodeTestScene();@H_502_3@case@H_502_3@TEST_TOUCHES:@H_502_3@//触屏处理@H_502_3@@H_502_3@@H_502_3@
  28. new@H_502_3@PongScene();@H_502_3@case@H_502_3@TEST_MENU:@H_502_3@//菜单处理@H_502_3@@H_502_3@@H_502_3@
  29. new@H_502_3@MenuTestScene();@H_502_3@case@H_502_3@TEST_ACTION_MANAGER:@H_502_3@//动画管理@H_502_3@@H_502_3@@H_502_3@
  30. new@H_502_3@ActionManagerTestScene();@H_502_3@case@H_502_3@TEST_LAYER:@H_502_3@//CCLayer功能展示@H_502_3@@H_502_3@@H_502_3@
  31. new@H_502_3@LayerTestScene();@H_502_3@case@H_502_3@TEST_SCENE:@H_502_3@//CCScene功能展示@H_502_3@@H_502_3@@H_502_3@
  32. new@H_502_3@SceneTestScene();@H_502_3@case@H_502_3@TEST_PARALLAX:@H_502_3@//视角控制@H_502_3@@H_502_3@@H_502_3@
  33. new@H_502_3@ParallaxTestScene();@H_502_3@case@H_502_3@TEST_TILE_MAP:@H_502_3@//基于格子的地图@H_502_3@@H_502_3@@H_502_3@
  34. new@H_502_3@TileMapTestScene();@H_502_3@case@H_502_3@TEST_INTERVAL:@H_502_3@//时间控制@H_502_3@@H_502_3@@H_502_3@
  35. new@H_502_3@IntervalTestScene();@H_502_3@case@H_502_3@TEST_CHIPMUNKACCELTOUCH:@H_502_3@//ChipMunk物理引擎与多点触屏@H_502_3@@H_502_3@@H_502_3@
  36. #if(CC_TARGET_PLATFORM!=CC_PLATFORM_MARMALADE)@H_502_3@@H_502_3@@H_502_3@
  37. pScene=new@H_502_3@ChipmunkAccelTouchTestScene();@H_502_3@break@H_502_3@;@H_502_3@@H_502_3@
  38. #else@H_502_3@@H_502_3@@H_502_3@
  39. #ifdefMARMALADEUSECHIPMUNK@H_502_3@@H_502_3@@H_502_3@
  40. #if(MARMALADEUSECHIPMUNK==1)@H_502_3@@H_502_3@@H_502_3@
  41. new@H_502_3@ChipmunkAccelTouchTestScene();@H_502_3@@H_502_3@
  42. #endif@H_502_3@@H_502_3@@H_502_3@
  43. #endif@H_502_3@@H_502_3@@H_502_3@
  44. case@H_502_3@TEST_LABEL:@H_502_3@//文字标签@H_502_3@@H_502_3@@H_502_3@
  45. new@H_502_3@AtlasTestScene();@H_502_3@case@H_502_3@TEST_TEXT_INPUT:@H_502_3@//输入处理@H_502_3@@H_502_3@@H_502_3@
  46. new@H_502_3@TextInputTestScene();@H_502_3@case@H_502_3@TEST_SPRITE:@H_502_3@//精灵功能展示@H_502_3@@H_502_3@@H_502_3@
  47. new@H_502_3@SpriteTestScene();@H_502_3@case@H_502_3@TEST_SCHEDULER:@H_502_3@//动画的时间调度@H_502_3@@H_502_3@@H_502_3@
  48. new@H_502_3@SchedulerTestScene();@H_502_3@case@H_502_3@TEST_RENDERTEXTURE:@H_502_3@//渲染到纹理@H_502_3@@H_502_3@@H_502_3@
  49. new@H_502_3@RenderTextureScene();@H_502_3@case@H_502_3@TEST_TEXTURE2D:@H_502_3@//纹理功能展示@H_502_3@@H_502_3@@H_502_3@
  50. new@H_502_3@TextureTestScene();@H_502_3@case@H_502_3@TEST_Box2D:@H_502_3@//Box2D物理引擎展示@H_502_3@@H_502_3@@H_502_3@
  51. new@H_502_3@Box2DTestScene();@H_502_3@case@H_502_3@TEST_Box2DBED:@H_502_3@//Box2D物理引擎展示[物体的固定与连接]@H_502_3@@H_502_3@@H_502_3@
  52. new@H_502_3@Box2dTestBedScene();@H_502_3@case@H_502_3@TEST_EFFECT_ADVANCE:@H_502_3@//高级屏幕效果@H_502_3@@H_502_3@@H_502_3@
  53. new@H_502_3@EffectAdvanceScene();@H_502_3@case@H_502_3@TEST_ACCELEROMRTER:@H_502_3@//加速度@H_502_3@@H_502_3@@H_502_3@
  54. new@H_502_3@AccelerometerTestScene();@H_502_3@ #if(CC_TARGET_PLATFORM!=CC_PLATFORM_BADA)@H_502_3@@H_502_3@@H_502_3@
  55. case@H_502_3@TEST_KEYPAD:@H_502_3@//键区处理@H_502_3@@H_502_3@@H_502_3@
  56. new@H_502_3@KeypadTestScene();@H_502_3@case@H_502_3@TEST_COCOSDENSHION:@H_502_3@//声效控制@H_502_3@@H_502_3@@H_502_3@
  57. new@H_502_3@CocosDenshionTestScene();@H_502_3@case@H_502_3@TEST_PERFORMANCE:@H_502_3@//性能测试@H_502_3@@H_502_3@@H_502_3@
  58. new@H_502_3@PerformanceTestScene();@H_502_3@case@H_502_3@TEST_ZWOPTEX:@H_502_3@//ZWOPTEX动国@H_502_3@@H_502_3@@H_502_3@
  59. new@H_502_3@ZwoptexTestScene();@H_502_3@//badadon'tsupportlibcurl@H_502_3@@H_502_3@@H_502_3@
  60. case@H_502_3@TEST_CURL:@H_502_3@//网络通信基本演示@H_502_3@@H_502_3@@H_502_3@
  61. new@H_502_3@CurlTestScene();@H_502_3@case@H_502_3@TEST_USERDEFAULT:@H_502_3@//用户日志保存示例@H_502_3@@H_502_3@@H_502_3@
  62. new@H_502_3@UserDefaultTestScene();@H_502_3@case@H_502_3@TEST_BUGS:@H_502_3@//BUG示例@H_502_3@@H_502_3@@H_502_3@
  63. new@H_502_3@BugsTestScene();@H_502_3@case@H_502_3@TEST_FONTS:@H_502_3@//字体演示@H_502_3@@H_502_3@@H_502_3@
  64. new@H_502_3@FontTestScene();@H_502_3@case@H_502_3@TEST_CURRENT_LANGUAGE:@H_502_3@//获取当前语言@H_502_3@@H_502_3@@H_502_3@
  65. new@H_502_3@CurrentLanguageTestScene();@H_502_3@ #if(CC_TARGET_PLATFORM!=CC_PLATFORM_MARMALADE)@H_502_3@@H_502_3@@H_502_3@
  66. case@H_502_3@TEST_TEXTURECACHE:pScene=@H_502_3@new@H_502_3@TextureCacheTestScene();@H_502_3@case@H_502_3@TEST_EXTENSIONS:@H_502_3@@H_502_3@
  67. {//更多扩展实例@H_502_3@@H_502_3@@H_502_3@
  68. new@H_502_3@ExtensionsTestScene();@H_502_3@@H_502_3@
  69. case@H_502_3@TEST_SHADER:@H_502_3@//使用Shader的渲染演示@H_502_3@@H_502_3@@H_502_3@
  70. new@H_502_3@ShaderTestScene();@H_502_3@@H_502_3@
  71. case@H_502_3@TEST_MUTITOUCH:@H_502_3@//多点触屏@H_502_3@@H_502_3@@H_502_3@
  72. new@H_502_3@MutiTouchTestScene();@H_502_3@@H_502_3@
  73. default@H_502_3@:@H_502_3@@H_502_3@
  74. //返回创建的场景@H_502_3@@H_502_3@@H_502_3@
  75. return@H_502_3@pScene;@H_502_3@@H_502_3@
  76. TestController::TestController()@H_502_3@
  77. :m_tBeginPos(CCPointZero)@H_502_3@
  78. //加入一个关闭菜单按钮@H_502_3@@H_502_3@@H_502_3@
  79. CCMenuItemImage*pCloseItem=CCMenuItemImage::create(s_pPathClose,s_pPathClose,menu_selector(TestController::closeCallback));@H_502_3@@H_502_3@
  80. //创建一个菜单放置关闭按钮@H_502_3@@H_502_3@@H_502_3@
  81. CCMenu*pMenu=CCMenu::create(pCloseItem,NULL);@H_502_3@
  82. CCSizes=CCDirector::sharedDirector()->getWinSize();@H_502_3@
  83. //设置这个菜单位置@H_502_3@@H_502_3@@H_502_3@
  84. pCloseItem->setPosition(CCPointMake(s.width-30,s.height-30));@H_502_3@
  85. //新建一个测试项菜单,将所有代表测试场景的菜单标签项加入菜单@H_502_3@@H_502_3@@H_502_3@
  86. m_pItemMenu=CCMenu::create();@H_502_3@
  87. //@H_502_3@@H_502_3@@H_502_3@
  88. for@H_502_3@(@H_502_3@int@H_502_3@i=0;i<TESTS_COUNT;++i)@H_502_3@@H_502_3@
  89. //#if(CC_TARGET_PLATFORM==CC_PLATFORM_MARMALADE)@H_502_3@@H_502_3@@H_502_3@
  90. //CCLabelBMFont*label=CCLabelBMFont::create(g_aTestNames[i].c_str(),"fonts/arial16.fnt");@H_502_3@@H_502_3@@H_502_3@
  91. //#else@H_502_3@@H_502_3@@H_502_3@
  92. CCLabelTTF*label=CCLabelTTF::create(g_aTestNames[i].c_str(),"Arial"@H_502_3@,24);@H_502_3@@H_502_3@
  93. CCMenuItemLabel*pMenuItem=CCMenuItemLabel::create(label,menu_selector(TestController::menuCallback));@H_502_3@@H_502_3@
  94. //将代表测试场景的菜单标签加入菜单中,以i+10000的值做为Z值。@H_502_3@@H_502_3@@H_502_3@
  95. m_pItemMenu->addChild(pMenuItem,i+10000);@H_502_3@
  96. //设置代表测试场景的菜单标签在测试项菜单层的位置@H_502_3@@H_502_3@@H_502_3@
  97. pMenuItem->setPosition(CCPointMake(s.width/2,(s.height-(i+1)*LINE_SPACE)));@H_502_3@
  98. //设置测试项菜单的大小@H_502_3@@H_502_3@@H_502_3@
  99. m_pItemMenu->setContentSize(CCSizeMake(s.width,(TESTS_COUNT+1)*(LINE_SPACE)));@H_502_3@
  100. //设置测试项菜单的位置@H_502_3@@H_502_3@@H_502_3@
  101. m_pItemMenu->setPosition(s_tCurPos);@H_502_3@
  102. //将测试项菜单放入当前CCLayer@H_502_3@@H_502_3@@H_502_3@
  103. addChild(m_pItemMenu);@H_502_3@
  104. //设置开启触屏事件响应@H_502_3@@H_502_3@@H_502_3@
  105. setTouchEnabled(true@H_502_3@);@H_502_3@@H_502_3@
  106. //将关闭按钮项菜单放入当前CCLayer@H_502_3@@H_502_3@@H_502_3@
  107. addChild(pMenu,1);@H_502_3@
  108. TestController::~TestController()@H_502_3@
  109. //点击菜单项的事件响应函数@H_502_3@@H_502_3@@H_502_3@
  110. void@H_502_3@TestController::menuCallback(CCObject*pSender)@H_502_3@@H_502_3@
  111. //取得菜单项@H_502_3@@H_502_3@@H_502_3@
  112. CCMenuItem*pMenuItem=(CCMenuItem*)(pSender);@H_502_3@
  113. //取得Z值,减10000算出是第几个菜单项@H_502_3@@H_502_3@@H_502_3@
  114. int@H_502_3@nIdx=pMenuItem->getZOrder()-10000;@H_502_3@@H_502_3@
  115. //创建相应的场景@H_502_3@@H_502_3@@H_502_3@
  116. TestScene*pScene=CreateTestScene(nIdx);@H_502_3@
  117. if@H_502_3@(pScene)@H_502_3@@H_502_3@
  118. //运行当前测试场景@H_502_3@@H_502_3@@H_502_3@
  119. pScene->runThisTest();@H_502_3@
  120. //runThisTest中会对其引用计数加1变为2,这里做一次引用计数减1操作,以保证后面再释放场景时可以正常的释放。@H_502_3@@H_502_3@@H_502_3@
  121. pScene->release();@H_502_3@
  122. //点击关闭按钮时的响应处理@H_502_3@@H_502_3@@H_502_3@
  123. void@H_502_3@TestController::closeCallback(CCObject*pSender)@H_502_3@@H_502_3@
  124. //退出程序@H_502_3@@H_502_3@@H_502_3@
  125. CCDirector::sharedDirector()->end();@H_502_3@
  126. #if(CC_TARGET_PLATFORM==CC_PLATFORM_IOS)@H_502_3@@H_502_3@@H_502_3@
  127. exit(0);@H_502_3@
  128. //触点按下时的响应处理@H_502_3@@H_502_3@@H_502_3@
  129. void@H_502_3@TestController::ccTouchesBegan(CCSet*pTouches,CCEvent*pEvent)@H_502_3@@H_502_3@
  130. //获取第一个触点位置@H_502_3@@H_502_3@@H_502_3@
  131. CCSetIteratorit=pTouches->begin();@H_502_3@
  132. CCTouch*touch=(CCTouch*)(*it);@H_502_3@
  133. //将位置保存到变量m_tBeginPos中。@H_502_3@@H_502_3@@H_502_3@
  134. m_tBeginPos=touch->getLocation();@H_502_3@
  135. //触点@H_502_3@@H_502_3@@H_502_3@
  136. void@H_502_3@TestController::ccTouchesMoved(CCSet*pTouches,CCEvent*pEvent)@H_502_3@@H_502_3@
  137. //获取第一个触点位置@H_502_3@@H_502_3@@H_502_3@
  138. CCSetIteratorit=pTouches->begin();@H_502_3@
  139. CCTouch*touch=(CCTouch*)(*it);@H_502_3@
  140. //取得这个位置与上一帧移动的Y值之差,即在纵方向的偏移。@H_502_3@@H_502_3@@H_502_3@
  141. CCPointtouchLocation=touch->getLocation();@H_502_3@
  142. float@H_502_3@nMoveY=touchLocation.y-m_tBeginPos.y;@H_502_3@@H_502_3@
  143. //计算菜单在纵方向上也移动相应值后的新位置。@H_502_3@@H_502_3@@H_502_3@
  144. CCPointcurPos=m_pItemMenu->getPosition();@H_502_3@
  145. CCPointnextPos=ccp(curPos.x,curPos.y+nMoveY);@H_502_3@
  146. //这里对新位置的有效范围做个限定@H_502_3@@H_502_3@@H_502_3@
  147. CCSizewinSize=CCDirector::sharedDirector()->getWinSize();@H_502_3@
  148. if@H_502_3@(nextPos.y<0.0f)@H_502_3@@H_502_3@
  149. m_pItemMenu->setPosition(CCPointZero);@H_502_3@
  150. return@H_502_3@;@H_502_3@@H_502_3@
  151. if@H_502_3@(nextPos.y>((TESTS_COUNT+1)*LINE_SPACE-winSize.height))@H_502_3@@H_502_3@
  152. m_pItemMenu->setPosition(ccp(0,((TESTS_COUNT+1)*LINE_SPACE-winSize.height)));@H_502_3@
  153. //更新菜单到新位置@H_502_3@@H_502_3@@H_502_3@
  154. m_pItemMenu->setPosition(nextPos);@H_502_3@
  155. //记录当前位置为旧位置。@H_502_3@@H_502_3@@H_502_3@
  156. m_tBeginPos=touchLocation;@H_502_3@
  157. s_tCurPos=nextPos;@H_502_3@
  158. }@H_502_3@

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


@H_502_3@

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