初学试试看cocos2dx的TestCPP框架(8)---AtlasTestScene(LabelTest)

来源:互联网 发布:h5软件 编辑:程序博客网 时间:2024/05/16 08:22

十四、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 ccVertex3FTex2FColor4Btypedef 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 防止自动释放内存,产生野指针。

void CCNode::removeFromParentAndCleanup(bool cleanup); 从父节点里面移除。

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

原创粉丝点击