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

11 篇文章 0 订阅

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值