cocos2d-x Tests学习:整体架构

文章标签: cocos2d-x,cocos2d-x tests
2014-10-28 0:15:52     33 人阅读    

首先讲一下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;求的


原文地址:http://www.itmmd.com/201410/69.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

cocos2d-x Tests教程:ActionsTest 详解   上一篇
下一篇  silverlight教程 silverlight 数据绑定

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!