首先讲一下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) |