1.首先了解下触摸分发机制(CCTouchDispatcher):
查找顺序:
applicationDidFinishLaunching——> pDirector->setOpenGLView(pEGLView)——> m_pTouchDispatcher->setDispatchEvents(true)——>CCTouchDispatcher
可以看到项目中,将多点触摸和单点触摸放到了一个代理中,我们使用触摸机制的时候,直接找代理即可实现
/** Adds a standard touch delegate to the dispatcher's list.
* See StandardTouchDelegate description.
* IMPORTANT: The delegate will be retained.
* @lua NA
*/
void addStandardDelegate(CCTouchDelegate *pDelegate, int nPriority);
/** Adds a targeted touch delegate to the dispatcher's list.
* See TargetedTouchDelegate description.
* IMPORTANT: The delegate will be retained.
* @lua NA
*/
void addTargetedDelegate(CCTouchDelegate *pDelegate, int nPriority, bool bSwallowsTouches);
现在先实现关于游戏的按钮,点击按钮后,显示游戏相关的信息,比如作者等等。这里同样采用防御式编程方式,可以场景切换可以使用栈的方式进行pushScene和pop。因为这里的关于场景画面节点不多,而且一般停留时间少。所以使用栈的方式切换加快时间。因为要显示大量文字,这里采用xml形式。创建一个字典来读取里面的信息。在这里没必要使用文字本地化。
//创建字典,读取xml信息
CCDictionary *pAboutInfo = CCDictionary::createWithContentsOfFile("about.xml");
CC_BREAK_IF(pAboutInfo==NULL);
for (int i=1;i<5;i++)
{
char szKeyName[_NAME_LEN_]={0};
sprintf(szKeyName,"people%d",i);
//读取xml for key
CCString *pStringRule =dynamic_cast<CCString*>(pAboutInfo->objectForKey(szKeyName));
CC_BREAK_IF(pStringRule==NULL);
char szName[128] = {0};
sprintf(szName,pStringRule->m_sString.c_str());
CCLabelTTF * pTroLabel = CCLabelTTF::create(szName,"Arial",80,CCSizeMake(800,80),kCCTextAlignmentLeft,kCCVerticalTextAlignmentTop);
CC_BREAK_IF(pTroLabel==NULL);
pTroLabel->setColor(ccc3(0.1f,0.1f,0.1f));
pTroLabel->setPosition(ccp(SCREEN_WIDTH/2+50.f,SCREEN_HIGHT - 120.f*i));
addChild(pTroLabel,enZOrderTital);
}
场景切换:
void MTAboutsceneLayer::menuReplaceCallback( CCObject* pSender )
{
do
{
CCDirector::sharedDirector()->popScene();
return;
} while (false);
CCLog("Fun CCCAboutsceneLayer::menuReplaceCallback Error!");
}
2.现在添加游戏退出的场景。
2.1 可以想到退出的时候,使用的背景是和当前背景一致的。所以直接在开始场景中添加一个layer就可以,但是,我们点击退出layer的时候,其他的layer是不能被触摸的。也就是点击退出按钮,出现的退出laye上r的触摸优先级最高。这里添加上单点触摸代理。然后实现触摸函数,就可以使用了
void CWXQutiLayer::onEnter()
{
CCLayer::onEnter();
//添加触摸代理, 独占触摸层
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -130, true);
}
void CWXQutiLayer::onExit()
{
CCLayer::onExit();
CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}
2.2 退出的时候,自然要保存当前的分数