好的引擎,会提供一系列完整的功能示例,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实例,并设置窗口大小,启动游戏程序。
[cpp] view plain copy #include"main.h" #include"AppDelegate.h" #include"CCEGLVIEw.h" USING_NS_CC; //WIN32程序主函数 intAPIENTRY_tWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPTSTRlpCmdline,87); background-color:inherit">intnCmdshow) { UNREFERENCED_ParaMETER(hPrevInstance); UNREFERENCED_ParaMETER(lpCmdline); //实例化一个Cocos2d-x程序对象 AppDelegateapp; //创建OpenGL视窗并设置窗口大小 CCEGLVIEw*eglVIEw=CCEGLVIEw::sharedOpenGLVIEw(); eglVIEw->setFrameSize(480,320); //运行程序对象 returnCCApplication::sharedApplication()->run(); }
在AppDelegate.cpp中的boolAppDelegate::applicationDID。FinishLaunching()函数中创建场景并运行场景
copy 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_ #define_TEST_BASIC_H_ //Cocos2d头文件 #include"cocos2d.h" //使用Cocos2d命名空间 usingnamespacestd; classTestScene:publicCCScene public: //构造 TestScene(boolbPortrait=false); //场景被加载时的回调函数 virtualvoIDonEnter(); //自定义的虚函数,用于运行场景。 voIDrunThistest()=0; //返回主界面的菜单按钮响应回调函数。 voIDMainMenuCallback(CCObject*pSender); }; #endifcpp文件:
在TestScene中,提供了一个可以被点击的标签MainMenu,从字面意思就知道点击它可以返回主菜单界面,这个主菜单在哪呢?就是TestController。
copy #ifndef_CONTRolLER_H_ #define_CONTRolLER_H_ classTestController:publiccclayer public: //构造 TestController(); //析构 ~TestController(); //菜单项响应回调函数 voIDmenuCallback(CCObject*pSender); //关闭程序响应回调函数 voIDcloseCallback(CCObject*pSender); //按下触点响应函数。 voIDcctouchesBegan(CCSet*ptouches,CCEvent*pEvent); //按下状态移动触点响应函数。 voIDcctouchesMoved(CCSet*ptouches,153); background-color:inherit">private: //接下状态移动触点的开始位置 CCPointm_tBeginPos; //主菜单 Ccmenu*m_pItemmenu; }; #endif 进入Cpp看一下: copy #include"controller.h" #include"testResource.h" #include"tests.h" //菜单项的行间距,设40点 #defineliNE_SPACE40 //创建一个当前触点位置变量,初始化为左下角位置。 staticCCPoints_tCurPos=CCPointZero; //创建指定的示例场景 staticTestScene*CreateTestScene(intnIDx) //先清空一下显示设备使用的数据 CCDirector::sharedDirector()->purgeCachedData(); //定义TestScene指针用于接收创建的示例场景 TestScene*pScene=NulL; //跟据参数来创建相应的TestScene派生类对象。 switch(nIDx) caseTEST_ACTIONS://动画处理 pScene=newActionsTestScene();break; caseTEST_TransitionS://场景切换 newTransitionsTestScene();caseTEST_PROGRESS_ACTIONS://进度动画控制 newProgressActionsTestScene();caseTEST_EFFECTS://特效演示 newEffectTestScene();caseTEST_CliCK_AND_MOVE://拖动演示 newClickAndMoveTestScene();caseTEST_ROTATE_WORLD://旋转cclayer newRotateWorldTestScene();caseTEST_PARTICLE://粒子系统 newParticleTestScene();caseTEST_EASE_ACTIONS://多样化运动动画 newActionsEaseTestScene();caseTEST_MOTION_STREAK://拖尾动画效果 newMotionStreakTestScene();caseTEST_DRAW_PRIMITIVES://基本图形绘制 newDrawPrimitivesTestScene();caseTEST_COCOSNODE://结点控制 newCocosNodeTestScene();caseTEST_touches://触屏处理 newPongScene();caseTEST_MENU://菜单处理 newMenuTestScene();caseTEST_ACTION_MANAGER://动画管理 newActionManagerTestScene();caseTEST_LAYER://cclayer功能展示 newLayerTestScene();caseTEST_SCENE://CCScene功能展示 newSceneTestScene();caseTEST_ParaLLAX://视角控制 newParallaxTestScene();caseTEST_TILE_MAP://基于格子的地图 newTileMapTestScene();caseTEST_INTERVAL://时间控制 newIntervalTestScene();caseTEST_CHIPMUNKACCELtouch://ChipMunk物理引擎与多点触屏 #if(CC_TARGET_PLATFORM!=CC_PLATFORM_MARMALADE) pScene=newChipmunkAcceltouchTestScene();break; #else #ifdefMARMALADEUSECHIPMUNK #if(MARMALADEUSECHIPMUNK==1) newChipmunkAcceltouchTestScene(); #endif #endif caseTEST_LABEL://文字标签 newAtlasTestScene();caseTEST_TEXT_input://输入处理 newTextinputTestScene();caseTEST_SPRITE://精灵功能展示 newSpriteTestScene();caseTEST_SCHEDulER://动画的时间调度 newSchedulerTestScene();caseTEST_RENDERTEXTURE://渲染到纹理 newRenderTextureScene();caseTEST_TEXTURE2D://纹理功能展示 newTextureTestScene();caseTEST_Box2D://Box2D物理引擎展示 newBox2DTestScene();caseTEST_Box2Dbed://Box2D物理引擎展示[物体的固定与连接] newBox2dTestbedScene();caseTEST_EFFECT_ADVANCE://高级屏幕效果 newEffectAdvanceScene();caseTEST_ACCELERomrTER://加速度 newAccelerometerTestScene(); #if(CC_TARGET_PLATFORM!=CC_PLATFORM_BADA) caseTEST_KEYPAD://键区处理 newKeypadTestScene();caseTEST_COCOSDENSHION://声效控制 newCocosDenshionTestScene();caseTEST_PERFORMANCE://性能测试 newPerformanceTestScene();caseTEST_ZWOPTEX://ZWOPTEX动国 newZwoptexTestScene();//badadon'tsupportlibcurl caseTEST_CURL://网络通信基本演示 newCurlTestScene();caseTEST_USERDEFAulT://用户日志保存示例 newUserDefaultTestScene();caseTEST_BUGS://BUG示例 newBUGsTestScene();caseTEST_FontS://字体演示 newFontTestScene();caseTEST_CURRENT_LANGUAGE://获取当前语言 newCurrentLanguageTestScene(); #if(CC_TARGET_PLATFORM!=CC_PLATFORM_MARMALADE) caseTEST_TEXTURECACHE:pScene=newTextureCacheTestScene();caseTEST_EXTENSIONS: {//更多扩展实例 newExtensionsTestScene(); caseTEST_SHADER://使用Shader的渲染演示 newShaderTestScene(); caseTEST_MUTItouch://多点触屏 newMutitouchTestScene(); default: //返回创建的场景 returnpScene; TestController::TestController() :m_tBeginPos(CCPointZero) //加入一个关闭菜单按钮 CcmenuItemImage*pCloseItem=CcmenuItemImage::create(s_pPathClose,s_pPathClose,menu_selector(TestController::closeCallback)); //创建一个菜单放置关闭按钮 Ccmenu*pMenu=Ccmenu::create(pCloseItem,NulL); CCSizes=CCDirector::sharedDirector()->getWinSize(); //设置这个菜单位置 pCloseItem->setposition(CCPointMake(s.wIDth-30,s.height-30)); //新建一个测试项菜单,将所有代表测试场景的菜单标签项加入菜单 m_pItemmenu=Ccmenu::create(); // for(inti=0;i<TESTS_COUNT;++i) //#if(CC_TARGET_PLATFORM==CC_PLATFORM_MARMALADE) //cclabelBMFont*label=cclabelBMFont::create(g_aTestnames[i].c_str(),"Fonts/arial16.fnt"); //#else cclabelTTF*label=cclabelTTF::create(g_aTestnames[i].c_str(),"Arial",24); CcmenuItemLabel*pMenuItem=CcmenuItemLabel::create(label,menu_selector(TestController::menuCallback)); //将代表测试场景的菜单标签加入菜单中,以i+10000的值做为Z值。 m_pItemmenu->addChild(pMenuItem,i+10000); //设置代表测试场景的菜单标签在测试项菜单层的位置 pMenuItem->setposition(CCPointMake(s.wIDth/2,(s.height-(i+1)*liNE_SPACE))); //设置测试项菜单的大小 m_pItemmenu->setContentSize(CCSizeMake(s.wIDth,(TESTS_COUNT+1)*(liNE_SPACE))); //设置测试项菜单的位置 m_pItemmenu->setposition(s_tCurPos); //将测试项菜单放入当前cclayer addChild(m_pItemmenu); //设置开启触屏事件响应 settouchEnabled(true); //将关闭按钮项菜单放入当前cclayer addChild(pMenu,1); TestController::~TestController() //点击菜单项的事件响应函数 voIDTestController::menuCallback(CCObject*pSender) //取得菜单项 CcmenuItem*pMenuItem=(CcmenuItem*)(pSender); //取得Z值,减10000算出是第几个菜单项 intnIDx=pMenuItem->getZOrder()-10000; //创建相应的场景 TestScene*pScene=CreateTestScene(nIDx); if(pScene) //运行当前测试场景 pScene->runThistest(); //runThisTest中会对其引用计数加1变为2,这里做一次引用计数减1 *** 作,以保证后面再释放场景时可以正常的释放。 pScene->release(); //点击关闭按钮时的响应处理 voIDTestController::closeCallback(CCObject*pSender) //退出程序 CCDirector::sharedDirector()->end(); #if(CC_TARGET_PLATFORM==CC_PLATFORM_IOS) exit(0); //触点按下时的响应处理 voIDTestController::cctouchesBegan(CCSet*ptouches,CCEvent*pEvent) //获取第一个触点位置 CCSetIteratorit=ptouches->begin(); CCtouch*touch=(CCtouch*)(*it); //将位置保存到变量m_tBeginPos中。 m_tBeginPos=touch->getLocation(); //触点 voIDTestController::cctouchesMoved(CCSet*ptouches,CCEvent*pEvent) //获取第一个触点位置 CCSetIteratorit=ptouches->begin(); CCtouch*touch=(CCtouch*)(*it); //取得这个位置与上一帧移动的Y值之差,即在纵方向的偏移。 CCPointtouchLocation=touch->getLocation(); floatnMoveY=touchLocation.y-m_tBeginPos.y; //计算菜单在纵方向上也移动相应值后的新位置。 CCPointcurPos=m_pItemmenu->getposition(); CCPointnextPos=ccp(curPos.x,curPos.y+nMoveY); //这里对新位置的有效范围做个限定 CCSizewinSize=CCDirector::sharedDirector()->getWinSize(); if(nextPos.y<0.0f) m_pItemmenu->setposition(CCPointZero); return; if(nextPos.y>((TESTS_COUNT+1)*liNE_SPACE-winSize.height)) m_pItemmenu->setposition(ccp(0,((TESTS_COUNT+1)*liNE_SPACE-winSize.height))); //更新菜单到新位置 m_pItemmenu->setposition(nextPos); //记录当前位置为旧位置。 m_tBeginPos=touchLocation; s_tCurPos=nextPos; }总结:示例框架展示了一个菜单,每个菜单项代表了一个示例工程,菜单项的Z值是递增排列的。点击菜单项响应TestController::menuCallback函数,此函数通过减去Z值基数可以取得菜单项的索引,并通过CreateTestScene(nIDx);来创建出相应的示例场景。本示例框架还演示了如何在纵方向上拖动一个菜单。
总结
以上是内存溢出为你收集整理的Cocos2d-x 2.0 TestCpp框架源码分析全部内容,希望文章能够帮你解决Cocos2d-x 2.0 TestCpp框架源码分析所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)