十四、Atlas1类里面有个成语变量CCTextureAtlas* m_textureAtlas,先用CCTextureAtlas::create创建,然后用UpdateQuad更新。
m_textureAtlas = CCTextureAtlas::create(s_AtlasTest, 3); m_textureAtlas->retain();
CCSize s = CCDirector::sharedDirector()->getWinSize();
//
// Notice: u,v tex coordinates are inverted
//
ccV3F_C4B_T2F_Quad quads[] =
{
{
{{0,0,0},ccc4(0,0,255,255),{0.0f,1.0f},}, // bottom left
{{s.width,0,0},ccc4(0,0,255,0),{1.0f,1.0f},}, // bottom right
{{0,s.height,0},ccc4(0,0,255,0),{0.0f,0.0f},}, // top left
{{s.width,s.height,0},{0,0,255,255},{1.0f,0.0f},}, // top right
},
{
{{40,40,0},ccc4(255,255,255,255),{0.0f,0.2f},}, // bottom left
{{120,80,0},ccc4(255,0,0,255),{0.5f,0.2f},}, // bottom right
{{40,160,0},ccc4(255,255,255,255),{0.0f,0.0f},}, // top left
{{160,160,0},ccc4(0,255,0,255),{0.5f,0.0f},}, // top right
},
{
{{s.width/2,40,0},ccc4(255,0,0,255),{0.0f,1.0f},}, // bottom left
{{s.width,40,0},ccc4(0,255,0,255),{1.0f,1.0f},}, // bottom right
{{s.width/2-50,200,0},ccc4(0,0,255,255),{0.0f,0.0f},}, // top left
{{s.width,100,0},ccc4(255,255,0,255),{1.0f,0.0f},}, // top right
},
};
for( int i=0;i<3;i++)
{
m_textureAtlas->updateQuad(&quads[i], i);
}
这里说说_ccV3F_C4B_T2F_Quad的结构,他由4个ccV3F_C4B_T2F组成。
//! 4 ccVertex3FTex2FColor4B
typedef struct _ccV3F_C4B_T2F_Quad
{
//! top left
ccV3F_C4B_T2F tl;
//! bottom left
ccV3F_C4B_T2F bl;
//! top right
ccV3F_C4B_T2F tr;
//! bottom right
ccV3F_C4B_T2F br;
} ccV3F_C4B_T2F_Quad;
typedef struct _ccV3F_C4B_T2F
{
//! vertices (3F)
ccVertex3F vertices; // 12 bytes
// char __padding__[4];
//! colors (4B)
ccColor4B colors; // 4 bytes
// char __padding2__[4];
// tex coords (2F)
ccTex2F texCoords; // 8 bytes
} ccV3F_C4B_T2F;
每一个_ccV3F_C4B_T2F由3部分构成,分别是顶点(通俗说就是屏幕上的位置),颜色,纹理坐标(通俗说就是读进来图片的位置,通常在0-1之间)。比如要取左上角1/4的图案,就是。注意顺序ABCD.
这个类重载了draw,然后再里面drawQuads就行了。具体纹理坐标说明看参考资料。
十五、这个类里面有5个新函数。分别是
CCLabelTTF* CCLabelTTF::create(const char *string, const char *fontName, float fontSize,
const CCSize &dimensions, CCTextAlignment hAlignment,
CCVerticalTextAlignment vAlignment)
参数分别为,设置内容, 字体名字,字体大小,块大小,水平对齐,垂直对齐。
alignItemsVerticallyWithPadding 设置间隔距离。
retain 防止自动释放内存,产生野指针。
CCString::createWithFormat("Alignment %s %s", vertical, horizontal)->getCString();这是CCString格式化字符串的函数,getCString返回const char*;
十六、这个类里面仅需注意"需要转义\"和CCLabelTTF第四个参数不够大的时候,会有部分文字没法显示。
十七、十八、分别测试在CCLabelTTF和CCLableBMFont里面使用中文,仅需注意的是文件使用utf8格式。
十九、BitmapFontMultiLineAlignment这个类里面重载了
void BitmapFontMultiLineAlignment::ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
void BitmapFontMultiLineAlignment::ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
void BitmapFontMultiLineAlignment::ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
第一次接触到的比较常用的代码就是判断点击是否在这个标签上。
void BitmapFontMultiLineAlignment::ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
{
CCTouch *touch = (CCTouch *)pTouches->anyObject();
CCPoint location = touch->getLocationInView();
if (this->m_pArrowsShouldRetain->boundingBox().containsPoint(location))
{
m_drag = true;
this->m_pArrowsBarShouldRetain->setVisible(true);
}
}
还有一个就是更改字符串宽度。
this->m_pLabelShouldRetain->setWidth(labelWidth);
二十、利用CCLabelTTF 的setColor设置红色的Label,然后用CCFadeOut、CCFadeIn配合CCSequence创建出CCFiniteTimeAction。最后利用CCRepeatForever构成永久循环。
二十一、注意一下 CCLabelBMFont *label2 = CCLabelBMFont::create("And this is Geneva", "fonts/geneva-32.fnt", kCCLabelAutomaticWidth, kCCTextAlignmentLeft, ccp(0, 128));最后一个参数是(ccp(0, 128);
二十二、CCDictionary的方法直接从文件中读取数据。createWithContentOfFile("xxx.xml");大概代码如下。
CCDictionary *strings = CCDictionary::createWithContentsOfFile("fonts/strings.xml");
const char *chinese = ((CCString*)strings->objectForKey("chinese1"))->m_sString.c_str();
const char *japanese = ((CCString*)strings->objectForKey("japanese"))->m_sString.c_str();
const char *spanish = ((CCString*)strings->objectForKey("spanish"))->m_sString.c_str();
二十三、后期再设置CCLabelBMFont
CCLabelBMFont* bmFont = new CCLabelBMFont();
bmFont->init();
bmFont->autorelease();
bmFont->setFntFile("fonts/helvetica-32.fnt");
bmFont->setString("It is working!");
二十四、后期设置CCLabelTTF
CCLabelTTF* font = new CCLabelTTF();
font->init();
font->autorelease();
font->setFontName("Marker Felt");
font->setFontSize(48);
font->setString("It is working!");
二十五、测试一下全部的英文字符显示。
二十六、测试对齐方式kCCTextAlignmentLeft、kCCTextAlignmentCenter、kCCTextAlignmentRight。类似
CCLabelTTF* ttf0 = CCLabelTTF::create("Alignment 0\nnew line", "Helvetica", 12,
CCSizeMake(256, 32), kCCTextAlignmentLeft);
二十七、重写了draw函数。然后在里面获取label1的大小。
CCSize lableSize = label1->getContentSize();
//设置矩阵的坐标
CCPoint vertices[] =
{
..........
};
ccDrawPloy(vertices, 4, true);
参考资料:
Android OpenGL es 纹理坐标设定与贴图规则:http://blog.csdn.net/cjkwin/article/details/6016224