本篇博客讲解:
1.Ccocos2d-x中的字符串
2.使用标签
3.中文乱码问题

  • Ccocos2d-x中的字符串
    • 使用const char和stdstring
    • 使用cocos2d__String
      • 数据类型之间的转换
    • Win32平台下中文乱码问题
      • 解决方法一
      • 解决方法二
      • 解决方法三
  • 使用标签
    • LabelTTF
    • LabelAtlas
    • LabelBMFont
    • Cocos2d-x 3x标签类Label
    • 标签中文乱码问题
  • 源代码下载地址

Ccocos2d-x中的字符串

使用const char*和std::string

const char*是C风格的字符串
std::string是C++风格的字符串,它封装了const char*
初始化std::string对象:

std::string name = "jack";//直接赋值
std::string name = std::string("jack");//通过构造函数初始化

//创建对象通过静态方法创建,也就是在程序结束的时候,或者超过作用域的时候,自动释放,这就不需要我们来关心对象的释放

std::string 指针类型

std::string* namep = new std::string("jack");
//new 代表创建这个对象是动态创建的,是在程序运行过程中创建的,使用完成之后需要delete删除。
//返回值不是对象本身,而是指向对象的指针
...
delete namep;

把std::string 转化为const char*类型

const char* cstring = name.c_str();//静态方法创建
const char* cstring = namep->c_str();//namep为指针
std::string name = "jack";//直接赋值

log("name = %s",name);//直接这样会出现乱码问题,因为log用的不对
//我们可以去看log函数:void CC_DLL log(const char * format,...) CC_FORMAT_PRINTF(1,2);类型是const char*

log("name = %s",name.c_str());

std::string *name1 = new std::string("jack");//直接赋值 
log("name1 = %s",name1->c_str());

使用cocos2d::__String

(注意是两个英文下划线)
源自于Objective-C的Nsstring
在coco2d-x里面,凡是有两个下划线开头的,都是过渡Objective-C过来的(内存管理采用引用计数管理)
现在Cocos2d-x在慢慢去除Objective-C化

创建它的主要的静态create函数如下(工厂设计模式)

static __String *create(const std::string &str)
static __String *createWithFormat(const char *format,...)
//createWithFormat-通过创建模板来创建字符串,所以可以通过这个方法把其他类型的转换为字符串

数据类型之间的转换

cocos2d::__String 转换为const cahr*类型,这种转换还是用的比较多的

__String *name = __String::create("Hi,Tony");//得到对象指针,因为是通过静态create函数获取的,不需要我们delete const char *cstring = name->getCString();

const cahr* 转换为cocos2d::__Stirng类型

const char* cstring ="Hi,Tonny";
__String *ns = __String::createWithFormat("%s",cstring);

std::string转换为cocos2d::__String类型

std::string string = "Hi,Tonny";
__String *name4 = __String::createWithFormat("%s",string.c_str());//将std::string转换为__String

cocos2d::__String转换为int类型

int num = 123;
__String *ns = __String::createWithFormat("%d",num);//这种方式可以转换很多其他类型
int num2 = ns->intValue();

Win32平台下中文乱码问题

默认情况下Windows中文环境是采用GBK编码,源程序文件HelloWorldScene.cpp编码默认也是GBK,如果源程序代码中有中文,它的字符集是GBK,我们需要将中文符GBK编码转换为UTF-8编码。

解决方法一

源文件保存为UTF-8(不带签名的)
文件->高级保存选项

存储完之后编译,会出现这样的问题

这是由于Visual Studio对于Unicode(UTF-8无签名)识别有误,我们一般在后面添加一些英文字符,或者“啊”等特殊的中文字符。

建议不要用这种解决方式

解决方法二

转码GBK->UTF-8

__String *cns = __String::create("大家好啊");
    const char* nsc;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
    std::string sns = MyUtility::gbk_2_utf8(ns->getCString());
    cns = sns.c_str();
#else
    cns = ns->getCString();
#endif
    log("%s",cns);
    auto label = LabelTTF::create(cns,"Arial",24);
//在Win32平台下,将GBK编码转换为UTF-8
string MyUtility::gbk_2_utf8(const string text){
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) //条件编译
    //这里面用的一些库只有win32平台才有的一些类库

    //采用Lambda表达式,将string转换成wstring
    wstring tes = [=](){
        setlocale(LC_ALL,"chs");
        const char* _Source = text.c_str();
        size_t _Dsize = text.size() + 1;
        wchar_t *_Dest = new wchar_t[_Dsize];
        mbstowcs(_Dest,_Source,_Dsize);
        std::wstring result = _Dest;
        delete[]_Dest;
        setlocale(LC_ALL,"C");
        return result;
    }();

    int asciSize = WideCharToMultiByte(CP_UTF8,0,tes.c_str(),tes.size(),NULL,NULL);
    if(asciSize == ERROR_NO_UNICODE_TRANSLATION || asciSize==0){
        return string();
    }

    char *resultString = new char[asciSize];
    int conveResult = WideCharToMultiByte(CP_UTF8,resultString,asciSize,NULL);
    if (conveResult != asciSize){
        return string();
    }
    string buffer = "";
    buffer.append(resultString,asciSize);
    delete[] resultString;
    return buffer;
#else
    return text;
#endif
}

解决方法三

其实还可以用文本文件来解决中文乱码,就是字符串从xml文件或者json中读取(注意,文本需要是UTF-8编码),然后传值,这样不会出现乱码问题

使用标签

可以把标签理解为一个控件

此处的大家好和中间的COCOS2DX图片就是标签

一种是COCOS2DX这样的,可以叫美工做张图片然后放上去就可以了,静态的
另外一种是”大家好”这样的动态文字

LabelTTF

TTF基于系统字库

//静态create函数创建
auto label = LabelTTF::create("大家好",24);//如乱码请参照前面的解决
//在不同的平台中都是去找Arial这个系统库,然后去显示出来,24为字号

//指定标签的位置
label->setPosition(Vec2(origin.x + visibleSize.width/2,origin.y + visibleSize.height - label->getContentSize().height));
//记住设置位置和锚点,锚点没写就是默认的0.5,0.5
//把标签加入到层中
this->addChild(label,1,123);//设置tag为123,方便后面获取

create函数的完整定义:

/** creates a Label from a fontname,alignment,dimension in points and font size in points  @since v2.0.1 */
static LabelTTF * create(const std::string& string,const std::string& fontName,float fontSize,const Size& dimensions = Size::ZERO,TextHAlignment hAlignment = TextHAlignment::CENTER,TextVAlignment vAlignment = TextVAlignment::TOP);

const std::string& string 要显示的字符串
const std::string& fontName 字体的名字
float fontSize 字体的大小
const Size& dimensions = Size::ZERO 尺寸-放在这个所定义的矩形的大小里面
TextHAlignment hAlignment = TextHAlignment::CENTER 水平方向的中心对齐
TextVAlignment vAlignment = TextVAlignment::TOP 垂直方向的顶对齐
后面三个参数可省略,都会有默认值

在cocos2d X3.01时,认为create已经过时了,但是这种用法还是能用,可能以后会去掉

LabelAtlas

基于图集的标签

继承了:LabelProtocol-纯虚函数,相当于Java中的接口

显示的abcd的那些字母,放在一张图中了

auto label1 = LabelAtlas::create("HelloWorld","fonts/tuffy_bold_italic-charmap.png",48,66,' ');
//(字符串,字体文件图集,宽,高,) 路径是 Resources/下 宽高不能随便设置!需要和图片对应的
label1->setPosition(Vec2(visibleSize.width / 2 - label1->getContentSize().width / 2,visibleSize.height - label1-getContentSize().height));
this->addChild(label1,1);

LabelBMFont

位图字体标签,需要添加字体文件:包括一个图片集(.png)和一个字体坐标文件(.fnt)
LabelBMFont比LabelTTF快很多。LabelBMFont中的每个字符的宽度是可变的


.png很容易,叫美工做好图片就行
.fnt:

这个就不是自己能手写出来的了~~ 那么我们就需要借助工具了
(大家可以简单的学习一下工具)

创建并初始化标签

auto label2 = LabelBMFont::create("HelloWord","fonts/BMFont.fnt");
    label2->setPosition(Vec2(visibleSize.width / 2,visibleSize.height - label2->getContentSize().height));
    this->addChild(label2,1);

效果:

Cocos2d-x 3.x标签类Label

Cocos2d-x 3.x后推出了新的标签类Label,这种标签通过使用FreeType(开源字体引擎)来使它在不同的平台上有相同的视觉效果。
由于使用更快的缓存代理,它的渲染也将更加快速。Label还提供了描边和阴影等特效。

前面三个标签在3.0或者说3.1之后已经过时了,但是还可以用(不推荐使用了)。
推荐使用该标签类Label,该类替换了前面的三个标签类

创建Label类静态create函数常用的有如下几个:

static Label* createWithSystemFont(conststd::string &text,//是要显示的文字 
const std::string& font,//系统字体名 
float fontSize,//字体的大小 
const Size& dimensions = Size::ZERO,//在屏幕上占用的区域大小,可省略 
TextHAlignment  hAlignment = TextHAlignment::LEFT,//文字横向对齐方式,可省略 
TextVAlignment  vAlignment = TextVAlignment::TOP)           //文字纵向对齐方式,可省略 
显示的是系统字体,指的是运行环境下的系统,而不是编译系统,相当于原来的LabelTTF

static Label* createWithTTF(conststd::string & text,const std::string &  fontFile,//字体文件 
float fontSize,//字体的大小 
const Size &  dimensions = Size::ZERO,//可省略 
TextHAlignment          hAlignment = TextHAlignment::LEFT,//可省略 
TextVAlignment           vAlignment = TextVAlignment::TOP)      //可省略 
createWithTTF和LabelTTF不一样了,也就是fontFile指定的不是系统字体,而是字体文件,也就是字体文件路径

static Label* createWithTTF(constTTFConfig& ttfConfig,//配置参数 constTTFConfig-结构体
const std::string& text,TextHAlignment alignment = TextHAlignment::LEFT,int maxlinewidth = 0)


static Label* createWithBMFont(conststd::string& bmfontFilePath,//位图字体文件 
const std::string&  text,//是要显示的文字 
const TextHAlignment& alignment = TextHAlignment::LEFT,//可省略 
int maxlinewidth = 0,//可省略 
const Point&  imageOffset = Point::ZERO )                               //可省略 

使用实例

auto label1 = Label::createWithSystemFont("Hello World1",36);
label1->setPosition(Vec2(origin.x + visibleSize.width/2,origin.y + visibleSize.height - 100));
this->addChild(label1,1);//Win32的字体库可以在控制面板中找到

auto label2 = Label::createWithTTF("Hello World2","fonts/Marker Felt.ttf",36);
label2->setPosition(Vec2(origin.x + visibleSize.width/2,origin.y + visibleSize.height - 200));
this->addChild(label2,1);

auto label3 = Label::createWithBMFont("fonts/BMFont.fnt","Hello World3");
label3->setPosition(Vec2(origin.x + visibleSize.width/2,origin.y + visibleSize.height - 300));
this->addChild(label3,1);


TTFConfig ttfConfig("fonts/Marker Felt.ttf",36,GlyphCollection::DYNAMIC);
auto label4 = Label::createWithTTF(ttfConfig,"Hello World4");
label4->setPosition(Vec2(origin.x + visibleSize.width/2,origin.y + visibleSize.height - 400));
this->addChild(label4,1);

ttfConfig.outlinesize = 4;
auto label5 = Label::createWithTTF(ttfConfig,"Hello World5");
//ttfConfig-结构体配置,能配置更多的特效,比如描边,阴影,闪烁的文字等
//只能是TTF文件的,才能使用这些特效
label5->setPosition(Vec2(origin.x + visibleSize.width/2,origin.y + visibleSize.height - 500));
label5->enableShadow(Color4B(255,255,128),Size(4,-4));//设置阴影,阴影的颜色,阴影的大小 
label5->setColor(Color3B::RED);//设置颜色
this->addChild(label5,1);

标签中文乱码问题

解决方法一:保存文件为Unicode(UTF-8无签名)
(不推荐使用)

解决方法二:写工具类,将字符串编码转换为UTF-8
参考前面的Win32平台下中文乱码问题

源代码下载地址:

GITHUB源码下载地址: 【点我进行下载】

本文章由[谙忆]编写, 所有权利保留。
欢迎转载,分享是进步的源泉。

转载请注明出处:http://chenhaoxiang.cn

本文源自【人生之旅_谙忆的博客】

【Cocos2d-x】开发实战-Cocos中的字符串、标签和中文乱码的更多相关文章

  1. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5 3D书本翻页动画的实现示例

    这是一款十分炫酷的HTML5 3D书本翻页动画,效果相对比较简单,拖拽鼠标模拟用手翻页,需要的朋友们下面随着小编来一起学习学习吧

  3. 使用postMessage让 iframe自适应高度的方法示例

    这篇文章主要介绍了使用postMessage让 iframe自适应高度的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. 移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

  6. ios – 在Swift中将输入字段字符串转换为Int

    所以我非常擅长制作APP广告Swift,我试图在文本字段中做一些非常简单的输入,取值,然后将它们用作Int进行某些计算.但是’vardistance’有些东西不正确它是导致错误的最后一行代码.它说致命错误:无法解开Optional.None解决方法在你的例子中,距离是一个Int?否则称为可选的Int..toInt()返回Int?因为从String到Int的转换可能失败.请参阅以下示例:

  7. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  8. xamarin – 崩溃在AccountStore.Create().保存(e.Account,“);

    在Xamarin.Forms示例TodoAwsAuth中https://developer.xamarin.com/guides/xamarin-forms/web-services/authentication/oauth/成功登录后,在aOnAuthenticationCompleted事件中,应用程序在尝试保存到Xamarin.Auth时崩溃错误说不能对钥匙串说期待着寻求帮助.解决方法看看你

  9. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  10. xcode – 错误“线程1:断点2.1”

    我正在研究RESTAPI管理器.这是一个错误,我无法解决它.我得到的错误在下面突出显示.当我打电话给这个班级获取资源时:我评论的线打印:Thread1:breakpoint2.1我需要修复错误的建议.任何建议都非常感谢解决方法您可能在不注意的情况下意外设置了断点.单击并拖动代表断路器外部断点的蓝色刻度线以将其擦除.

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部