在用Cocos2DX引擎开发游戏的过程中,我们经常需要弹出一个对话框或者提示框,通知玩家一些必要的信息。这时候我们就需要考虑怎样设计和封装一个这样的弹出对话框。首先,这样的弹出框一般都是“模态窗口”,即在没有对当前弹出的对话框进行确认的时候,不能继续往下操作。@H_301_5@
@H_301_5@
2、定制按钮个数@H_301_5@
3、窗口的大小可变@H_301_5@
@H_301_5@
5、onEnter动态创建弹出层@H_301_5@
封装@H_301_5@
//PopupLayer.h@H_301_5@
#include "cocos2d.h"@H_301_5@
#include "cocos-ext.h"@H_301_5@
USING_NS_CC;@H_301_5@
USING_NS_CC_EXT;@H_301_5@
class PopupLayer : public CCLayer{@H_301_5@
public:@H_301_5@
PopupLayer();@H_301_5@
~PopupLayer();@H_301_5@
virtual bool init();@H_301_5@
//需要重写触摸注册函数,重新给定触摸级别@H_301_5@
virtual void registerWithTouchDispatc //重写触摸函数,返回true,屏蔽其它层,达到“模态”效果@H_301_5@
bool ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent);@H_301_5@
//静态创建函数,创建一个弹出层,设置背景图片@H_301_5@
static PopupLayer* create(const char* backgroundImage);@H_301_5@
void setTitle(const char* title,int fontsize = 20);@H_301_5@
void setContentText(const char* text,int fontsize=20,int padding=50,int paddingTop=100);@H_301_5@
//设置上层对象和上层回调函数,用于回调时传递CCNode参数@H_301_5@
void setCallBackFunc(CCObject* target,SEL_CallFuncN callfun);@H_301_5@
//添加menuItem按钮,封装了一个函数,传入些必要的参数@H_301_5@
bool addButton(const char* normalImage,const char* selectedImage,const char* title,int tag=0);@H_301_5@
//为了在显示层时的属性生效,选择在onEnter里动态生成@H_301_5@
virtual void onEnter();@H_301_5@
virtual void onExit();@H_301_5@
CREATE_FUNC(PopupLayer);@H_301_5@
private:@H_301_5@
void buttonCallBack(CCObject* pSender);@H_301_5@
int m_contentPadding;@H_301_5@
int m_contentPaddingTop;@H_301_5@
CCObject* m_callbackListener;@H_301_5@
SEL_CallFuncN m_callback;@H_301_5@
//定义了CCMenu*类型变量m_pMenu,并且直接定义默认的set/get方法@H_301_5@
CC_SYNTHESIZE_RETAIN(CCMenu*,m_pMenu,MenuButton);@H_301_5@
CC_SYNTHESIZE_RETAIN(CCSprite*,m_sfBackGround,SpriteBackGround);@H_301_5@
CC_SYNTHESIZE_RETAIN(CCScale9Sprite*,m_s9BackGround,Sprite9BackGround);@H_301_5@
CC_SYNTHESIZE_RETAIN(CCLabelTTF*,m_ltTitle,LabelTitle);@H_301_5@
CC_SYNTHESIZE_RETAIN(CCLabelTTF*,m_ltContentText,LabelContentText);@H_301_5@
};@H_301_5@
//PopupLayer.cpp@H_301_5@
#include "PopupLayer.h"@H_301_5@
USING_NS_CC;@H_301_5@
PopupLayer::PopupLayer()@H_301_5@
{@H_301_5@
m_contentPadding = 0;@H_301_5@
m_contentPaddingTop = 0;@H_301_5@
m_pMenu = NULL;@H_301_5@
m_callbackListener = NULL;@H_301_5@
m_callback = NULL;@H_301_5@
m_sfBackGround = NULL;@H_301_5@
m_s9BackGround = NULL;@H_301_5@
m_ltContentText = NULL;@H_301_5@
m_ltTitle = NULL;@H_301_5@
CC_SAFE_RELEASE(m_pMenu);@H_301_5@
CC_SAFE_RELEASE(m_sfBackGround);@H_301_5@
CC_SAFE_RELEASE(m_s9BackGround);@H_301_5@
CC_SAFE_RELEASE(m_ltContentText);@H_301_5@
CC_SAFE_RELEASE(m_ltTitle);@H_301_5@
return false;@H_301_5@
}@H_301_5@
this->setContentSize(CCSizeZero);@H_301_5@
//初始化需要的Menu@H_301_5@
CCMenu* menu = CCMenu::create();@H_301_5@
menu->setPosition(CCPointZero);@H_301_5@
setTouchEnabled(true); return true;@H_301_5@
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-128,true);@H_301_5@
}@H_301_5@
//触摸函数ccTouchBegan,返回true@H_301_5@
bool PopupLayer::ccTouchBegan( CCTouch *pTouch,CCEvent *pEvent )@H_301_218@{@H_301_5@
return true;@H_301_5@
}@H_301_5@
//创建一个弹出层,给背景精灵变量赋值@H_301_5@
PopupLayer* PopupLayer::create( const char* backgroundImage )@H_301_218@{@H_301_5@
PopupLayer* popup = PopupLayer::create();@H_301_5@
popup->setSpriteBackGround(CCSprite::create(backgroundImage));@H_301_5@
popup->setSprite9BackGround(CCScale9Sprite::create(backgroundImage));@H_301_5@
return popup;@H_301_5@
}@H_301_5@
void PopupLayer::setTitle( const char* title,int fontsize )@H_301_218@{@H_301_5@
CCLabelTTF* ltfTitle = CCLabelTTF::create(title,"Arial",fontsize);@H_301_5@
ltfTitle->setColor(ccc3(0,0));@H_301_5@
setLabelTitle(ltfTitle);@H_301_5@
}@H_301_5@
//给文本变量赋值@H_301_5@
void PopupLayer::setContentText( const char* text,int fontsize,int padding,int paddingTop )@H_301_218@{@H_301_5@
CCLabelTTF* content = CCLabelTTF::create(text,fontsize);@H_301_5@
content->setColor(ccc3(0,0));@H_301_5@
setLabelContentText(content);@H_301_5@
m_contentPadding = padding;@H_301_5@
m_contentPaddingTop = paddingTop;@H_301_5@
}@H_301_5@
void PopupLayer::setCallBackFunc( CCObject* target,SEL_CallFuncN callfun )@H_301_218@{@H_301_5@
m_callbackListener = target;@H_301_5@
m_callback = callfun;@H_301_5@
}@H_301_5@
bool PopupLayer::addButton( const char* normalImage,int tag )@H_301_218@{@H_301_5@
CCSize winSize = CCDirector::sharedDirector()->getWinSize();@H_301_5@
CCPoint center = ccp(winSize.width/2,winSize.height/2);@H_301_5@
CCMenuItemImage* menuImage = CCMenuItemImage::create(@H_301_5@
normalImage,selectedImage,this,menu_selector(PopupLayer::buttonCallBack));@H_301_5@
menuImage->setTag(tag);@H_301_5@
menuImage->setPosition(center);@H_301_5@
CCSize menuSize = menuImage->getContentSize();@H_301_5@
CCLabelTTF* ttf = CCLabelTTF::create(title,15);@H_301_5@
ttf->setColor(ccc3(0,0));@H_301_5@
ttf->setPosition(ccp(menuSize.width/2,menuSize.height/2));@H_301_5@
menuImage->addChild(ttf);@H_301_5@
getMenuButton()->addChild(menuImage);@H_301_5@
return true;@H_301_5@
}@H_301_5@
//销毁弹出框,传递参数node给下层@H_301_5@
void PopupLayer::buttonCallBack( CCObject* pSender )@H_301_218@{@H_301_5@
CCNode* node = dynamic_cast(pSender);@H_301_5@
CCLog("touch tag: %d",node->getTag());@H_301_5@
if (m_callback && m_callbackListener)@H_301_5@
{@H_301_5@
(m_callbackListener->*m_callback)(node);@H_301_5@
}@H_301_5@
this->removeFromParentAndClean CCLayer::onEnter();@H_301_5@
CCSize winSize = CCDirector::sharedDirector()->getWinSize();@H_301_5@
CCPoint center = ccp(winSize.width/2,winSize.height/2);@H_301_5@
CCSize contentSize;@H_301_5@
// 设定好参数,在运行时加载@H_301_5@
getSpriteBackGround()->setPosition(center);@H_301_5@
this->addChild(getSpriteBackGround(),0);@H_301_5@
contentSize = getSpriteBackGround()->getTexture()->getContentSize();@H_301_5@
}@H_301_5@
else{@H_301_5@
CCScale9Sprite* background = getSprite9BackGround();@H_301_5@
background->setContentSize(getContentSize());@H_301_5@
background->setPosition(center);@H_301_5@
this->addChild(background,0);@H_301_5@
contentSize = getContentSize();@H_301_5@
}@H_301_5@
this->addChild(getMenuButton());@H_301_5@
float btnWidth = contentSize.width / (getMenuButton()->getChildrenCount()+1);@H_301_5@
CCArray* array = getMenuButton()->getChildren();@H_301_5@
CCObject* pObj = NULL;@H_301_5@
int i = 0;@H_301_5@
CCARRAY_FOREACH(array,pObj){@H_301_5@
CCNode* node = dynamic_cast(pObj);@H_301_5@
node->setPosition(ccp(winSize.width/2 - contentSize.width/2 + btnWidth*(i+1), i++;@H_301_5@
}@H_301_5@
getLabelTitle()->setPosition(ccpAdd(center,ccp(0,contentSize.height/2 - 25.0f)));@H_301_5@
this->addChild(getLabelTitle());@H_301_5@
}@H_301_5@
CCLabelTTF* ltf = getLabelContentText();@H_301_5@
ltf->setPosition(center);@H_301_5@
ltf->setDimensions(CCSizeMake(contentSize.width - m_contentPadding*2,contentSize.height - m_contentPaddingTop));@H_301_5@
ltf->setHorizontalAlignment(kCCTextAlignmentLeft);@H_301_5@
this->addChild(ltf);@H_301_5@
}@H_301_5@
CCSequence *popupActions = CCSequence::create(@H_301_5@
CCScaleTo::create(0.0,0.0), CCScaleTo::create(0.06,1.05),@H_301_5@
CCScaleTo::create(0.08,0.95),1.0),NULL);@H_301_5@
this->runAction(popupActions);@H_301_5@
CCLayer::onExit();@H_301_5@
}@H_301_5@
PopupLayer* popup = PopupLayer::create("popupBackGround.png");@H_301_5@
// ContentSize是可选的设置,可以不设置,如果设置则把它当做9图缩放@H_301_5@
//popup->setContentSize(CCSizeMake(400,360));@H_301_5@
popup->setTitle("Message");@H_301_5@
popup->setContentText("Most people... blunder round this city.",20,50,150);@H_301_5@
// 设置回调函数,回调传回一个CCNode以获取tag判断点击的按钮@H_301_5@
// 这只是作为一种封装实现,如果使用delegate那就能够更灵活的控制参数了@H_301_5@
popup->setCallBackFunc(this,callfuncN_selector(HelloWorld::buttonCallBack));@H_301_5@
popup->addButton("button.png","button.png","Ok",0);@H_301_5@
popup->addButton("button.png","Cancel",1);@H_301_5@
this->addChild(popup);@H_301_5@
测试截图:@H_301_5@
@H_301_5@
在这里我们使用动态组建的方式,即在前面用一些变量来保存对话框所需的信息,
然后在 onEnter 中,读取这些信息,以实时添加至界面之中。
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
@H_301_5@
原文链接:https://www.f2er.com/cocos2dx/347025.html