cocos2d-x Tests讲解一:Tests的整体架构

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;求的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值