IOS cocos2d学习笔记-<三>AnchorPoint锚点和CCLabelBMFont


(本文写作基于千锋3g学院提供的第三季讲授视频编写,更多资料和资源下载地址请看笔记扉页:传送门


周日偷了一下懒,“我又回来啦!”

根据第三视频第三讲,里面用到了一些关于位置标签的知识,欧阳老师的讲解已经非常的到位了我在这里骚骚作一下补充:

(一)锚点

其实也没有老师说的那么难理解,锚点嘛,什么有锚?船,船的锚丢下之后,所有的动作都跑不出这个锚点了。我们知道一个精灵就是一张图片,而图片是一个矩形点阵,进行各种动作是需要有一个基准的。

譬如,我们要指定这个精灵在屏幕上的位置position,我们给一个坐标cpp(240, 160),如果没有锚点,这精灵就囧了,究竟是让我的头在这个点上还是让我的脚在这个点上?

而锚点就帮我们解决了这个问题,通过我们的设置,要它的肚脐眼作为锚点,那么每次给这个精灵的position一个坐标,它都会知道,它的肚脐眼应该在这个坐标上了。

同样在缩放(Scale)的功能上也有相同的效用,锚点用于指定基于这个点进行缩放,理解上面的位置特点之后,这个是比较好理解的。

这里有一个关键是:缺省值为cpp(0.5 ,0.5),缺省值的意思就是默认值,多数情况下是不用特意设定的。


(二)CCLabelBMFont

在敲这个类的时候,细心的你会发现CCLabel有三种,分别是CCLabelTTF, CCLabelBMFont 和 CCLabelAtlas。一下引用一片文章来介绍一下这三种字体的区别:

原文:http://blog.sina.com.cn/s/blog_9e82217d01014l4z.html


CCLabelTTF

   TTF(TrueTypeFont)是一种字库名称,是Apple公司和Microsoft公司共同推出的字体文件格式,随着windows的流行,已经变成最常用的一种字体文件表示方式。

           CCLabelTTF 每次调用 setString (即改变文字)的时候,一个新的OpenGL纹理将会被创建.。这意味着setString 和创建一个新的标签一样慢。

           所以,当你需要频繁的更新它们的时候,尽可能的不用去使用标签对象。  而应该使用CCLabelAtlas或者是CCLabelBMFont 

OK, 看下它的使用方法 

CCLabelTTF *label = CCLabelTTF::labelWithString("the string", "Marker Felt", 21);

    this->addChild(label);

    label->setPosition(ccp(100, 100));

    label->setString("change string");//修改文字的方法


           这个类使用的是系统中的字体,不需要额外往项目文件中添加字体文件。但如果你有自定义的字体也可以加到项目中,如果无法使用,可以查看一下ccConfig.h中的CC_FONT_LABEL_SUPPORT是否enable了。  

 

CCLabelBMFont

        CCLabelBMFont  相当于每次改变只改变了图片坐标,而CCLabelTTF要重新渲染.这个类使用之前,需要添加好字体文件,包括一个图片文件 (**.png) 和一个 字体坐标文件 (**.fnt)。

         在 cocos2d-x的示例项目中有现成的,可以先拿过来练习一下,找的时候注意两个文件的 名称是相同的,只是扩展名不同。

CCLabelIBMFont *label = CCLabelIBMFont::labelWithString("the string", "konqa32-hd.fnt");

this->addChild(label);

label->setPosition(ccp(100, 100));

label->setString("change string");

下面是 konqa32-hd.png文件的截图

cocos2d-x <wbr>中添加显示文字的三种方式(CCLabelTTF <wbr>、CCLabelBMFont <wbr>和CCLabelAtlas)

    .fnt 文件定义了 图像文件的名称,以及每个字符对应的位置信息。

   这个没办法指定字体的字号,但可以用  scale  属性进行缩放来调整大小。就当它是sprite。

 

CCLabelAtlas        

        如果你用cocos2d-x项目模板创建过项目,那么你已经看过它的效果了,就是左下角显示帧率的数字。

        因为帧率一直在变,使用CCLabelTTF的话效率太低,因为只是数字所以也犯不上使用 CCLabelBMFont 加载那么大的文字图像,所以使用这个比较合适。

CCLabelAtlas *label = CCLabelAtlas::labelWithString("12", "fps_images.png", 12, 18, ".");

this->addChild(label);

label->setPosition(ccp(100, 100));

label->setString("34");

       在项目文件中,在resourse group里你可以找一下一个叫 fps_images.png的这个图像文件,文件如下:

        cocos2d-x <wbr>中添加显示文字的三种方式(CCLabelTTF <wbr>、CCLabelBMFont <wbr>和CCLabelAtlas)

       所以,这个只能显示上面这个12个字符,abcd什么的就不行了。

       解释一下参数,

       12 就是字符,

       fps_images.png就是字符的图像文件(这个只要图像文件就可以了),

       12 是每个字符的宽度,

       18 是每个字符的高度,这个不能设错,否则显示的时候可能就不对了。

       最后一个是起始字符,它是使用这个其实字符来对应字符和图像关系的。

因为这篇文章看得见图,也就选这个了。

文章的大意如下:

TTF 使用较少内存,但每次改动文本都需要重载一次纹理

BMFont 使用更多内存,但每此改动文本的速度很快,而且支持不同图片格式的文字

Atlas 则只用在纯数字标点的文字上。


此处特别说明一下CCLabelAtlas的初始化方法labelWithString,原文对方法的说明不太详尽,也有些模糊,经过本人亲测,遇到各种奇葩的结果:

以“fps_images.png”图像作为测试格式

首先,第一第二个参数大家都明白,分别是显示的字符串以及使用的格式名称,这个不用多解释;

第二,宽高,这貌似需要设置一个固定值,而且任何情况下都不能改变,一旦改变,就会遇到让人瞪目的结果,我设置的是16, 24,其他设置均有奇葩症状。

第三,这个起始字符只有在输入 ’.‘  这个值时,你的字符串才会显示正常。我稍微查过一下相关的文章,貌似是与ascii有关的。然后我手贱换了一种文字格式,显示出来的文字我就凌乱了。

总之,这个慢慢再研究。我们用得比较多的还是TTF和BMFont这两种,希望有大神看见能赐教赐教。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值