cocos2d-x滚动文字(一)

        这一两个月挺忙的,没时间来写点东西。现在项目交付了,可以空出点时间来总结一下在用cocos2d-x写游戏的时候遇到的一些问题。下面进入主题。

接下几篇要完成的事:

一,简单显示字符串

二,控制字符串的空格,换行等

三,在规定的矩形框内显示字符串

四,滚动字符串

一,显示文字有两种方法:

     一种用图片,把文字写入图片,显示这张图片即可,这样的方法要修改的话是很不方便,当然,游戏中还是挺多地方用到这种方法的,目的,为了好看。

     另一种是用编码的形式,通过编码的值,从系统里面获取点阵信息,然后打印到屏幕等地方。而cocos2d-x里的label是写到纹理中,这也是为了跨平台考虑的,跟系统相关的都封装到下面那一层去,这样的话就可以只考虑纹理,另外灵活性也比较好。

     这里主要说的是第二种,第一种会显示图片就掌握了。选第二种的好处

     (1),易修改

     (2),内存占用少,当文字特别多的时候,就凸显出来了

      不好的地方就是比较生硬,单一。

     在cocos2d-x里面可以通过CCLabelTTF定义一个label来显示字符串

如下面代码

     m_pLabel = CCLabelTTF::labelWithString

(“hello,world”,"MarkerFelt.ttc", 20);

m_pLabel->setPosition(ccp(0,0));

m_pLabel->setColor(ccRED);

   addChild(m_pLabel);

Hello World的例子里也有。

这里的字符串得是UTF-8编码的,否则很可能是乱码来着,所以在Win32平台上直接写汉字是行不通的,得先转为UTF-8。可以通过工具先转为UTF-8格式的字符串,也可以在用之前,加个转换函数,使之能在win32平台正常显示。

     考虑到跨平台,则选用xml来存储字符串,用tinyxml取字符串显示。这样只需改变xml里的文字而不用再修改程序了,多国语言用这种方法实现起来也变得很容易。Tinyxml这个小型的xml解析库可以到官网上下,最后也会在demo中给出。

      1, 配置xml文件,可以用UE,记事本等,下面用记事本来编辑

        (1),打开记事本,输入

  

  您好,世界

         (2),另存为hello.xml,最底下选UTF-8,否则会是乱码哦

         (3),把hello.xml放到resource文件夹下面,也可能得放Resources\iphonehd下面,具体视具体环境而做相应修改

     2,获取hello.xml里面的您好,世界这5个字的函数可以实现如下,更具体的可看demo中代码

char  *getStr()
{
if(m_xmlDoc)
{
   delete m_xmlDoc;
   m_xmlDoc = NULL;
}
//记得在适当的位置释放m_xmlDoc
m_xmlDoc = new TiXmlDocument(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("hello.xml"));  
m_xmlDoc->LoadFile();

TiXmlElement* rootElement = m_xmlDoc->RootElement();
TiXmlElement *nodeElement = NULL;
nodeElement = rootElement->FirstChildElement();

if(!nodeElement)
{
     return NULL;
}
return  (char*)nodeElement->GetText();
}


更多关于tinyxml的知识可以在网上搜索教程学习。当然,问我也是可以的,就怕不能及时给你回应。

把上面label那段代码改为

     m_pLabel = CCLabelTTF::labelWithString

(getStr(),"MarkerFelt.ttc", 20);

m_pLabel->setPosition(ccp(0,0));

m_pLabel->setColor(ccRED);

   addChild(m_pLabel);

就可以了正常在win32上显示中文了。

最后贴出,HelloWorldScene.cpp代码

CCScene* HelloWorld::scene()
{
    CCScene * scene = NULL;
    do 
    {
        // 'scene' is an autorelease object
        scene = CCScene::create();
        CC_BREAK_IF(! scene);
        // 'layer' is an autorelease object
        HelloWorld *layer = HelloWorld::create();
        CC_BREAK_IF(! layer);
        // add layer as a child to scene
        scene->addChild(layer);
    } while (0);
    // return the scene
    return scene;
}
HelloWorld::HelloWorld()
{
    m_xmlDoc = NULL;
}
HelloWorld::~HelloWorld()
{
if(m_xmlDoc)
{
    delete m_xmlDoc;
    m_xmlDoc = NULL;
}
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
  
        CC_BREAK_IF(! CCLayer::init());
m_bIsTouchEnabled = true;
 
CCSize s = CCDirector::sharedDirector()->getWinSize();
// 3. Add add a splash screen, show the cocos2d splash image.
CCSprite* pSprite = CCSprite::create("HelloWorld.png");
CC_BREAK_IF(! pSprite);
// Place the sprite on the center of the screen
pSprite->setPosition(ccp(s.width/2, s.height/2));
// Add the sprite to HelloWorld layer as a child layer.
this->addChild(pSprite, -1);
CCLabelTTF* pLabel = CCLabelTTF::labelWithString(getStr(),"MarkerFelt.ttc", 20);
pLabel->setPosition(ccp(200,200));
    pLabel->setColor(ccRED);
        addChild(pLabel);
        bRet = true;
    } while (0);
    return bRet;
}
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    // "close" menu item clicked
    CCDirector::sharedDirector()->end();
}
char *HelloWorld::getStr()
{
if(m_xmlDoc)
{
delete m_xmlDoc;
m_xmlDoc = NULL;
}
m_xmlDoc = new TiXmlDocument(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("hello.xml"));  
m_xmlDoc->LoadFile();
TiXmlElement* rootElement = m_xmlDoc->RootElement();
TiXmlElement *nodeElement  =  NULL;
nodeElement = rootElement->FirstChildElement();
if(!nodeElement)
{
return NULL;
}
return  (char*)nodeElement->GetText();
}



         

你可能感兴趣的:(cocos2d-x)