2012-4-4 09:22| 发布者: benben| 查看: 768| 评论: 0
摘要: 首先讲一下Cocos2d-x的整个生命周期:程序入口为cocos2d::CCApplication::run()。这里的CCApplication是单态,mian中的调用以下代码:AppDelegateapp;returncocos2d::CCApplication::sharedApplication().run(); run ...
首先讲一下Cocos2d-x的整个生命周期:
程序入口为cocos2d::CCApplication::run()。
这里的CCApplication是单态,mian中的调用以下代码:
AppDelegate app;
return cocos2d::CCApplication::sharedApplication().run();
run()方法启动了程序的主线程,并且执行
if (! initInstance() || ! applicationDidFinishLaunching())
{ return 0; }
initInstance()方法根据不同平台和分辨率初始化程序窗口,applicationDidFinishLaunching()方法创建了一个scene和一个layer,并且用CCDirector将这个scene设为我们的场景:
CCScene * pScene = CCScene::node();
CCLayer * pLayer = new TestController(); pLayer->autorelease(); pScene->addChild(pLayer); pDirector->runWithScene(pScene);
这里值得注意在HelloWorld中,或者说在我们新创建的项目中是这样的:
CCScene *pScene = HelloWorld::scene();
pDirector->runWithScene(pScene);
然后在scene()方法里调用
HelloWorld *layer = HelloWorld::node();
来初始化layer,当然不要忘了把layer addChild(layer)到scene。
推荐使用第二中吧,因为tests实例应该仅仅是为了方便才这么做的。
然后当我们点击其中一个菜单时,TestController::menuCallback回调函数就会被调用。
void TestController::menuCallback(CCObject * pSender)
{ // get the userdata, it's the index of the menu item clicked CCMenuItem* pMenuItem = (CCMenuItem *)(pSender); int nIdx = pMenuItem->getZOrder() - 10000; //getZOrder()方法得到的是我们把pMenuItem添加到CCMenu的第几层,为了方便以后创建CCLayer,没什么特别的用处。 // create the test scene and run it TestScene* pScene = CreateTestScene(nIdx); //这个方法就是创建我们的test实例了。 if (pScene) { pScene->runThisTest();//每一个test都有一个这个方法 pScene->release(); } }
当点击屏幕时,会调用ccTouchesBegan方法
void TestController::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{ CCSetIterator it = pTouches->begin(); CCTouch* touch = (CCTouch*)(*it); m_tBeginPos = touch->locationInView( touch->view() ); m_tBeginPos = CCDirector::sharedDirector()->convertToGL( m_tBeginPos );//屏幕的原点在左上,OpenGL的在左下,所以要转化 }
上下滑动时,会调用ccTouchesMoved void TestController::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
CCSetIterator it = pTouches->begin(); CCTouch* touch = (CCTouch*)(*it); CCPoint touchLocation = touch->locationInView( touch->view() ); touchLocation = CCDirector::sharedDirector()->convertToGL( touchLocation ); float nMoveY = touchLocation.y - m_tBeginPos.y; CCPoint curPos = m_pItemMenu->getPosition(); CCPoint nextPos = ccp(curPos.x, curPos.y + nMoveY); CCSize winSize = 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))); return; } m_pItemMenu->setPosition(nextPos); m_tBeginPos = touchLocation; s_tCurPos = nextPos; } 这里没什么特别的,主要就是通过 m_pItemMenu->setPosition(ccp())来滑动界面,滑动的距离通过 float nMoveY = touchLocation.y - m_tBeginPos.y;求的 |