本章主要讲controller.h/cpp文件的分析,该文件主要用于演示样例场景管理类TestController,用于显示全部演示样例的菜单。
//controller.cpp #include "controller.h" #include "testResource.h" #include "tests.h" #define LINE_SPACE 40 static CCPoint s_tCurPos = CCPointZero;//设置当前位置为屏幕左下角 static TestScene* CreateTestScene(int nIdx) //静态函数,创建TestScene,nldx与test.h中的枚举变量做比較。确定新建的场景。 { CCDirector::sharedDirector()->purgeCachedData(); TestScene* pScene = NULL; switch (nIdx) //依据传入的nldx,通过switch函数创建对应的场景 { case TEST_ACTIONS: pScene = new ActionsTestScene(); break; case TEST_TRANSITIONS: pScene = new TransitionsTestScene(); break; case TEST_PROGRESS_ACTIONS: pScene = new ProgressActionsTestScene(); break; case TEST_EFFECTS: pScene = new EffectTestScene(); break; case TEST_CLICK_AND_MOVE: pScene = new ClickAndMoveTestScene(); break; case TEST_ROTATE_WORLD: pScene = new RotateWorldTestScene(); break; case TEST_PARTICLE: pScene = new ParticleTestScene(); break; case TEST_EASE_ACTIONS: pScene = new ActionsEaseTestScene(); break; case TEST_MOTION_STREAK: pScene = new MotionStreakTestScene(); break; case TEST_DRAW_PRIMITIVES: pScene = new DrawPrimitivesTestScene(); break; case TEST_COCOSNODE: pScene = new CocosNodeTestScene(); break; case TEST_TOUCHES: pScene = new PongScene(); break; case TEST_MENU: pScene = new MenuTestScene(); break; case TEST_ACTION_MANAGER: pScene = new ActionManagerTestScene(); break; case TEST_LAYER: pScene = new LayerTestScene(); break; case TEST_SCENE: pScene = new SceneTestScene(); break; case TEST_PARALLAX: pScene = new ParallaxTestScene(); break; case TEST_TILE_MAP: pScene = new TileMapTestScene(); break; case TEST_INTERVAL: pScene = new IntervalTestScene(); break; case TEST_LABEL: pScene = new AtlasTestScene(); break; case TEST_TEXT_INPUT: pScene = new TextInputTestScene(); break; case TEST_SPRITE: pScene = new SpriteTestScene(); break; case TEST_SCHEDULER: pScene = new SchedulerTestScene(); break; case TEST_RENDERTEXTURE: pScene = new RenderTextureScene(); break; case TEST_TEXTURE2D: pScene = new TextureTestScene(); break; #if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE) //注意 case TEST_CHIPMUNK: pScene = new ChipmunkAccelTouchTestScene(); break; #endif case TEST_BOX2D: pScene = new Box2DTestScene(); break; case TEST_BOX2DBED: pScene = new Box2dTestBedScene(); break; case TEST_EFFECT_ADVANCE: pScene = new EffectAdvanceScene(); break; case TEST_ACCELEROMRTER: pScene = new AccelerometerTestScene(); break; #if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA) //注意 case TEST_KEYPAD: pScene = new KeypadTestScene(); break; #endif case TEST_COCOSDENSHION: pScene = new CocosDenshionTestScene(); break; case TEST_PERFORMANCE: pScene = new PerformanceTestScene(); break; case TEST_ZWOPTEX: pScene = new ZwoptexTestScene(); break; // bada don't support libcurl #if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA && CC_TARGET_PLATFORM != CC_PLATFORM_NACL && CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE) case TEST_CURL: pScene = new CurlTestScene(); break; #endif case TEST_USERDEFAULT: pScene = new UserDefaultTestScene(); break; case TEST_BUGS: pScene = new BugsTestScene(); break; case TEST_FONTS: pScene = new FontTestScene(); break; case TEST_CURRENT_LANGUAGE: pScene = new CurrentLanguageTestScene(); break; #if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE) case TEST_TEXTURECACHE: pScene = new TextureCacheTestScene(); break; #endif case TEST_EXTENSIONS: pScene = new ExtensionsTestScene(); break; case TEST_SHADER: pScene = new ShaderTestScene(); break; case TEST_MUTITOUCH: pScene = new MutiTouchTestScene(); break; #if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE) case TEST_CLIPPINGNODE: pScene = new ClippingNodeTestScene(); break; #endif case TEST_FILEUTILS: pScene = new FileUtilsTestScene(); break; case TEST_SPINE: pScene = new SpineTestScene(); break; default: break; } return pScene; } TestController::TestController() : m_tBeginPos(CCPointZero) //构造函数 { // add close menu 创建菜单图片,s_pPathClose为testResource.h中的宏定义。menu_selector为TestController的closeCallback函数,相似Qt的信号与槽 CCMenuItemImage *pCloseItem = CCMenuItemImage::create(s_pPathClose, s_pPathClose, this, menu_selector(TestController::closeCallback) ); CCMenu* pMenu =CCMenu::create(pCloseItem, NULL); //创建菜单,用上面创建的CCMenuItemImage pMenu->setPosition( CCPointZero );//设置菜单位置 pCloseItem->setPosition(ccp( VisibleRect::right().x - 30, VisibleRect::top().y - 30)); //设置pCloseItem的位置 //距离右边30,上边30 // add menu items for tests m_pItemMenu = CCMenu::create(); //m_pItemMenu为 CCMenu*指针变量,用于存储46个演示样例的标题 for (int i = 0; i < TESTS_COUNT; ++i) //TESTS_COUNT为test.h中的枚举变量成员,最后一个成员。 { // #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); //g_aTestNames是一个string数组 // #endif CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(TestController::menuCallback)); m_pItemMenu->addChild(pMenuItem, i + 10000); //zOrder指定元素先后顺序,为i+10000 pMenuItem->setPosition( ccp( VisibleRect::center().x, (VisibleRect::top().y - (i + 1) * LINE_SPACE) )); //LINE_SPACE是该cpp文件的宏定义,为40 } m_pItemMenu->setContentSize(CCSizeMake(VisibleRect::getVisibleRect().size.width, (TESTS_COUNT + 1) * (LINE_SPACE))); m_pItemMenu->setPosition(s_tCurPos); //设置该m_pItemMenu位置 addChild(m_pItemMenu); //加入到层 setTouchEnabled(true); //设置触摸功能 addChild(pMenu, 1); //加入关闭菜单到层 } TestController::~TestController() //析构函数 { } void TestController::menuCallback(CCObject * pSender) //參数为与label连接的节点 { // get the userdata, it's the index of the menu item clicked CCMenuItem* pMenuItem = (CCMenuItem *)(pSender); int nIdx = pMenuItem->getZOrder() - 10000; //获得节点的zOrder值,由于创建时是i+10000,此处减去10000; // create the test scene and run it 依据nldx值传递到CreateTestScene函数中,创建对应的场景 TestScene* pScene = CreateTestScene(nIdx); //CreateTestScene为static函数,为整个类共同拥有 if (pScene) { pScene->runThisTest(); //创建成功执行该场景 pScene->release(); //通过回收池释放场景内存 } } void TestController::closeCallback(CCObject * pSender) //pCloseItem调用的关闭函数 { CCDirector::sharedDirector()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0); #endif } void TestController::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) { CCSetIterator it = pTouches->begin(); CCTouch* touch = (CCTouch*)(*it); m_tBeginPos = touch->getLocation(); } void TestController::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) { CCSetIterator it = pTouches->begin(); CCTouch* touch = (CCTouch*)(*it); CCPoint touchLocation = touch->getLocation(); float nMoveY = touchLocation.y - m_tBeginPos.y; CCPoint curPos = m_pItemMenu->getPosition(); CCPoint nextPos = ccp(curPos.x, curPos.y + nMoveY); if (nextPos.y < 0.0f) { m_pItemMenu->setPosition(CCPointZero); return; } if (nextPos.y > ((TESTS_COUNT + 1)* LINE_SPACE - VisibleRect::getVisibleRect().size.height)) { m_pItemMenu->setPosition(ccp(0, ((TESTS_COUNT + 1)* LINE_SPACE - VisibleRect::getVisibleRect().size.height))); return; } m_pItemMenu->setPosition(nextPos); m_tBeginPos = touchLocation; s_tCurPos = nextPos; }//controller.h
#ifndef _CONTROLLER_H_ #define _CONTROLLER_H_ #include "cocos2d.h" USING_NS_CC; class TestController : public CCLayer //创建全部演示样例的菜单。继承自CCLayer层 { public: TestController(); ~TestController(); void menuCallback(CCObject * pSender); //返回主菜单函数 void closeCallback(CCObject * pSender); //关闭应用程序函数 virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); //重写该函数 virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); //重写该函数 private: CCPoint m_tBeginPos; //起始位置 CCMenu* m_pItemMenu; //菜单 }; #endif