最近开始了ios的新项目, 一些关于cocos2d-x的学习, 这里记录点个人的理解和体会, 希望对大家有用。
cocos2d-x中的菜单项想必大家应该用的都比较熟了, 最近项目中刚好需要用到多语言支持和字库问题, 所以有这样的一个需求要做文字与图片背景的叠加,作为一个CCMenuItem响应事件。 类似这样的按钮
找了下cocos2d-x没找到合适的(如果有多谢大家指出来), 这里自己封装了个。
class CCMenuItemImageFont : public CCMenuItemSprite
{
public:
CCMenuItemImageFont(){};
~CCMenuItemImageFont(){};
static CCMenuItemImageFont* itemWithTarget(const char* text, const char* fontFile, const char * menubg, CCObject* target, SEL_MenuHandler selector);
};
/** 通过BMFont和CCSprite创建菜单项
// text : 显示文本内容
// fontFile : BMFont 字库文件路径
// menubg : 菜单背景图片(暂未做背景拉伸,大家自由发挥)
// target,selector 回调函数
*/
CCMenuItemImageFont* CCMenuItemImageFont::itemWithTarget(const char* text, const char* fontFile, const char * menubg, CCObject* target, SEL_MenuHandler selector)
{
//为了代码可读性, 未做安全检测
CCMenuItemImageFont *imagFont = new CCMenuItemImageFont();
CCSprite *sprite = CCSprite::spriteWithSpriteFrameName(menubg);
CCLabelBMFont *font = CCLabelBMFont::labelWithString(text, fontFile);
CCSize size = sprite->getContentSize();
//初始化一块texture区域, 大小为背景图片尺寸, 这里可以考虑缩放适应字的宽度。
CCRenderTexture *texture = CCRenderTexture::renderTextureWithWidthAndHeight(size.width , size.height,kCCTexture2DPixelFormat_RGBA8888);
//这里不清楚的可以详细看下CCRenderTexture.h里面的定义
texture->begin();
//must setposition before call visit
sprite->setPosition(ccp(size.width/2 , size.height/2));
sprite->visit();
font->setPosition(ccp(size.width/2 , size.height/2));
font->visit();
texture->end();
//这里可能有点争议, CCRenderTexture本身会addchild()当前sprite, 所以要先移除掉, 然后再add菜单。
texture->removeChild(texture->getSprite(), false);
imagFont->initFromNormalSprite(texture->getSprite(), NULL, NULL, target, selector);
return imagFont;
}
这里只是粗糙的实现了下 ,没有考虑字体的宽度,响应事件等等。 第一次发正式博文, 如果不妥谢谢指正。
不知道咋整的, 代码竟然这颜色~~~