【Cocos2d-X开发学习笔记】第08期:渲染框架之文本类的使用

本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010   

 

 

一、文本渲染类

 

    在游戏中,文字占有很重要的位置,游戏的介绍、游戏中的提示和对话等都需要用到文字。Cocos2D-X在文字渲染

方面提供了非常灵活的机制,既可以直接使用系统文字,也可以直接渲染字体,文本渲染类的继承关系如下图所示。

      该图展示了引擎用于处理文字的三个类:CCLabelAtlas、CCLabelBMFont、CCLabelTTF。这三个类都是通过不

同的方式来显示文字的。从图中可以看出,它们都继承于CCLabelProtocol协议。从类的名字中,能够发现一个共同

的单词“CCLabel”。在Cocos2D-X引擎中,CCLabel表示了一个文字标签的概念。我们可以将其看作是专门用于显示

文字的对象。

      另外,因为它们都有一个共同的父类CCNode,所以如果从绘制组成来说这三个类都是引擎绘制框架中的一员。

文字标签与之前介绍的图层或者精灵等都属于显示游戏内容的对象。在实际的游戏开发中,我们可以按照需要来选择

一种或多种方式显示文字。

 

 

二、TTF类型标签(CCLabelTTF

 

      TTF字体格式算得上是使用最为广泛的文字显示格式了,引擎中提供了对此格式字体的支持。TTF(True Type

Fonts)格式,比如在Windows操作系统当中,文字的显示就是通过TTF格式的字体。这是一种在计算机领域中通用

的字体格式。

      CCLabelTTF就是Cocos2D-X引擎中使用TTF字体的文字标签。下图展示了它的继承关系。

      通过此图可以看到,此类的另一个父类就是CCSprite。这说明我们完全可以将CCLabelTTF的对象当作精灵对象

来使用。它可以执行各种动作以及变化效果。此类标签对象的优缺点有以下几点。

<1> 任何一种TTF字体都包含了某种语言当中所有的字母以及符号,我们可以随意调整字体的大小、颜色以及样式。

<2> 因为TTF标准得到了普及,所以在很多的操作系统中已经提供了多种字体,我们无需任何的编辑,就可以直接使用。

<3> 创建和更新的过程将会比较缓慢。这是由于字体包含的内容较多,并且初始化时需要创建纹理图片。

 

1、项目示例

 

首先新建Cocos2D-X项目,在HelloWorldScene.cppc文件的init函数中修改如下所示代码。

[cpp]  view plain copy
  1. bool HelloWorld::init()  
  2. {  
  3.     bool bRet = false;  
  4.     do   
  5.     {  
  6.         CC_BREAK_IF(! CCLayer::init());  
  7.   
  8.         // Create a "close" menu item with close icon, it's an auto release object.  
  9.         CCMenuItemImage *pCloseItem = CCMenuItemImage::create(  
  10.             "CloseNormal.png",  
  11.             "CloseSelected.png",  
  12.             this,  
  13.             menu_selector(HelloWorld::menuCloseCallback));  
  14.         CC_BREAK_IF(! pCloseItem);  
  15.   
  16.         // Place the menu item bottom-right conner.  
  17.         pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));  
  18.   
  19.         // Create a menu with the "close" menu item, it's an auto release object.  
  20.         CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);  
  21.         pMenu->setPosition(CCPointZero);  
  22.         CC_BREAK_IF(! pMenu);  
  23.   
  24.         // Add the menu to HelloWorld layer as a child layer.  
  25.         this->addChild(pMenu, 1);  
  26.   
  27.         CCSize s = CCDirector::sharedDirector()->getWinSize();  
  28.   
  29.         CCSize blockSize = CCSizeMake(s.width/3, 200);  
  30.         float fontSize = 26;  
  31.   
  32.         //创建文字标签对象  
  33.         CCLabelTTF *left = CCLabelTTF::create("alignment left""A Damn Mess.ttf", fontSize,  
  34.                                           blockSize, kCCTextAlignmentLeft, kCCVerticalTextAlignmentCenter);  
  35.         CCLabelTTF *center = CCLabelTTF::create("alignment center""Abberancy.ttf", fontSize,  
  36.                                             blockSize, kCCTextAlignmentCenter, kCCVerticalTextAlignmentCenter);  
  37.         CCLabelTTF *right = CCLabelTTF::create("alignment right""Abduction.ttf", fontSize,  
  38.                                            blockSize, kCCTextAlignmentRight, kCCVerticalTextAlignmentCenter);  
  39.   
  40.         CCLayerColor *leftColor = CCLayerColor::create(ccc4(100, 100, 100, 255), blockSize.width, blockSize.height);  
  41.         CCLayerColor *centerColor = CCLayerColor::create(ccc4(200, 100, 100, 255), blockSize.width, blockSize.height);  
  42.         CCLayerColor *rightColor = CCLayerColor::create(ccc4(100, 100, 200, 255), blockSize.width, blockSize.height);  
  43.   
  44.         //设置标签锚点属性  
  45.         leftColor->ignoreAnchorPointForPosition(false);  
  46.         centerColor->ignoreAnchorPointForPosition(false);  
  47.         rightColor->ignoreAnchorPointForPosition(false);  
  48.   
  49.         //设置标签锚点  
  50.         left->setAnchorPoint(ccp(0,0.5));  
  51.         leftColor->setAnchorPoint(ccp(0,0.5));  
  52.         center->setAnchorPoint(ccp(0,0.5));  
  53.         centerColor->setAnchorPoint(ccp(0,0.5));  
  54.         right->setAnchorPoint(ccp(0,0.5));  
  55.         rightColor->setAnchorPoint(ccp(0,0.5));  
  56.   
  57.         //设置标签位置  
  58.         left->setPosition(ccp(0,s.height/2));  
  59.         leftColor->setPosition(left->getPosition());  
  60.         center->setPosition(ccp(blockSize.width, s.height/2));  
  61.         centerColor->setPosition(center->getPosition());  
  62.         right->setPosition(ccp(blockSize.width*2, s.height/2));  
  63.         rightColor->setPosition(right->getPosition());  
  64.   
  65.         //添加至显示  
  66.         this->addChild(leftColor, -1);  
  67.         this->addChild(left, 0);  
  68.         this->addChild(rightColor, -1);  
  69.         this->addChild(right, 0);  
  70.         this->addChild(centerColor, -1);  
  71.         this->addChild(center, 0);  
  72.   
  73.         bRet = true;  
  74.     } while (0);  
  75.   
  76.     return bRet;  
  77. }  

 

       我们先来看看创建函数中参数最多的一个,下面来介绍其中每个参数的含义。
       
第一个参数是将要显示的文字内容,它是一个字符串对象指针。第二个参数则是所用字体的名称。第三个参数为

字体的大小,然后是字体显示标签的尺寸。我们需要为当前将要显示的文字内容选择一个合适的尺寸大小。过大就会

浪费内存空间,过小则不能显示完整的内容。最后的两个参数,表示了文字绘制时的对齐方式。不同的对齐方式,将

会导致绘制的文字内容产生位置的变化。这一点,我们可以从实力项目的运行结果中看出。引擎当中,总共存在三种

字体对齐的方式,分别为左对齐、居中对齐、右对齐。示例代码中展示了三种对齐方式。

 

2、示例效果图

 

 

三、Atlas标签类(CCLabelAtlas

 

     Atlas标签类的父类是CCAtlasNode,这是一个纹理图集的类。此与之前介绍的CCLabelTTF类相比,它有了更大

的灵活性,同时,还占用了更少的资源。下图展示了此类的继承关系。

       从继承关系来看,Atlas标签类是CCAtlasNode的子类。这是一个纹理图集类。它可以将纹理图片按照矩形区域分

隔显示。Atlas标签类的创建速度是要远远超过TTF标签类。这两种字体的技术原理十分类似。只不过TTF标签会创建

一张绘制着文字的图片,而Atlas则不会创建任何的纹理图片。从这一点就能体现出它们之间运行效率的差异。Atlas标

签类只会使用源纹理图片进行绘制。

      另外,CCLabelAtlas类中的每一个字母或者符号都是独特的。它们可以有灵活可变的样式以及尺寸。这是因为用

于显示文字的纹理图片是由美术人员制作完成的。

     最后一点,就是CCLabelAtlas类中的字母或者符号也是可以由开发者定制的。就拿英文举例,并不是每一个CCLabelAtlas类的对象都必须包含26个英文字母。按照开发者的意愿,也可以是只有10个字母的字体。

 

1、项目示例

 

首先新建Cocos2D-X项目,在HelloWorldScene.cppc文件的init函数中修改如下所示代码。

[cpp]  view plain copy
  1. bool HelloWorld::init()  
  2. {  
  3.     bool bRet = false;  
  4.     do   
  5.     {    
  6.         CC_BREAK_IF(! CCLayer::init());  
  7.        
  8.         // Create a "close" menu item with close icon, it's an auto release object.  
  9.         CCMenuItemImage *pCloseItem = CCMenuItemImage::create(  
  10.             "CloseNormal.png",  
  11.             "CloseSelected.png",  
  12.             this,  
  13.             menu_selector(HelloWorld::menuCloseCallback));  
  14.         CC_BREAK_IF(! pCloseItem);  
  15.   
  16.         // Place the menu item bottom-right conner.  
  17.         pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));  
  18.   
  19.         // Create a menu with the "close" menu item, it's an auto release object.  
  20.         CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);  
  21.         pMenu->setPosition(CCPointZero);  
  22.         CC_BREAK_IF(! pMenu);  
  23.   
  24.         // Add the menu to HelloWorld layer as a child layer.  
  25.         this->addChild(pMenu, 1);  
  26.   
  27.         //创建Atlas标签对象  
  28.         CCLabelAtlas* label1 = CCLabelAtlas::create("123 Test""fonts/tuffy_bold_italic-charmap.plist");  
  29.         //添加显示  
  30.         addChild(label1, 0);  
  31.         //设置位置  
  32.         label1->setPosition(ccp(10,100));  
  33.         //设置透明度  
  34.         label1->setOpacity(200);  
  35.   
  36.         CCLabelAtlas *label2 = CCLabelAtlas::create("0123456789""fonts/tuffy_bold_italic-charmap.plist");  
  37.         addChild(label2, 0);  
  38.         label2->setPosition(ccp(10,200));  
  39.         label2->setOpacity(32);  
  40.         label2->setColor( ccRED );  
  41.   
  42.         bRet = true;  
  43.     } while (0);  
  44.   
  45.     return bRet;  
  46. }  

注意:很多时候会报plist,png文件路径的的错误,当报这样的错误的时候就把这两个个文件在Resources下面增一个路径。比如fonts/tuffy_bold_italic-charmap.plist,一定要记得用反斜杠。

 

2、示例效果图

 


 

四、BMFont标签类(CCLabelBMFont

 

     BMFont标签类是引擎当中最快速最自由的字体类。不过,这也意味着它是使用起来最麻烦的字体。想在游戏中使

用CCLabelBMFont类来绘制文字,开发者至少要有一个编辑器。下图展示了此类的继承关系。

       

图中展示了BMFont标签类继承自类CCSpriteBatchNode。让我们来看看BMFont标签类的特点。

<1> 需要一个图片编辑器,用于编辑字体的纹理图集。

<2> 具备了很快的创建以及更新速度。

<3> 自由度非常高,每一个字母或者符号都是单独的精灵。

<4>  自制的字体方式,开发者可以自定义其中的字母以及符号,甚至可以包含阴影、外框以及花纹。

 

1、项目示例

 

首先新建Cocos2D-X项目,在HelloWorldScene.cppc文件的init函数中修改如下所示代码。

[cpp]  view plain copy
  1. bool HelloWorld::init()  
  2. {  
  3.     bool bRet = false;  
  4.     do   
  5.     {  
  6.         CC_BREAK_IF(! CCLayer::init());      
  7.   
  8.         // Create a "close" menu item with close icon, it's an auto release object.  
  9.         CCMenuItemImage *pCloseItem = CCMenuItemImage::create(  
  10.             "CloseNormal.png",  
  11.             "CloseSelected.png",  
  12.             this,  
  13.             menu_selector(HelloWorld::menuCloseCallback));  
  14.         CC_BREAK_IF(! pCloseItem);  
  15.   
  16.         // Place the menu item bottom-right conner.  
  17.         pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));  
  18.   
  19.         // Create a menu with the "close" menu item, it's an auto release object.  
  20.         CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);  
  21.         pMenu->setPosition(CCPointZero);  
  22.         CC_BREAK_IF(! pMenu);  
  23.   
  24.         // Add the menu to HelloWorld layer as a child layer.  
  25.         this->addChild(pMenu, 1);  
  26.   
  27.         //创建一个颜色图层  
  28.         CCLayerColor* col = CCLayerColor::create( ccc4(128,128,128,255) );  
  29.         addChild(col, -10);  
  30.       
  31.         //使用字体资源文件,来创建一个CCLabelBMFont对象  
  32.         CCLabelBMFont* label1 = CCLabelBMFont::create("Test",  "bitmapFontTest2.fnt");  
  33.       
  34.         //设置字体锚点并添加至显示  
  35.         label1->setAnchorPoint( ccp(0,0) );  
  36.         addChild(label1, 0);  
  37.   
  38.          CCLabelBMFont *label2 = CCLabelBMFont::create("Test""bitmapFontTest2.fnt");  
  39.         // testing anchors  
  40.         label2->setAnchorPoint( ccp(0.5f, 0.5f) );  
  41.         label2->setColor( ccRED );  
  42.         addChild(label2, 0);  
  43.       
  44.         CCLabelBMFont* label3 = CCLabelBMFont::create("Test""bitmapFontTest2.fnt");  
  45.         // testing anchors  
  46.         label3->setAnchorPoint( ccp(1,1) );  
  47.         addChild(label3, 0);  
  48.         
  49.         CCSize s = CCDirector::sharedDirector()->getWinSize();  
  50.   
  51.         //设置位置  
  52.         label1->setPosition( ccp(s.width/2 - 50, s.height/2) );  
  53.         label2->setPosition(ccp(s.width/2, s.height/2) );  
  54.         label3->setPosition(ccp(s.width/2 + 50, s.height/2) );  
  55.   
  56.         bRet = true;  
  57.     } while (0);  
  58.   
  59.     return bRet;  
  60. }  

      创建的函数只有两个参数,用法非常简单。第一个参数为将要绘制的文字内容,第二个就是通过编辑器之多的字

体资源文件。因为引擎为BMFont标签类提供了最大的灵活度,BMFont类的对象中每一个字母或者符号都是一个独立

的精灵对象。所以我们可以轻易地就让一个字母跳动、旋转、变形、变色以及改变透明度。

      另外,得益于父类精灵图集的特性,BMFont标签类还是速度最快的。

 

2、示例效果图

 

 

 

 

源码下载地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值