Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1071321
  • 博文数量: 403
  • 博客积分: 10272
  • 博客等级: 上将
  • 技术积分: 4407
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:22
文章分类

全部博文(403)

文章存档

2012年(403)

分类: 嵌入式

2012-04-03 22:11:08

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

阅读(1442) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~