首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

【Cocos2d-x游戏引擎开发笔记(2)】在屏幕下渲染文字

2012-12-25 
【Cocos2d-x游戏引擎开发笔记(2)】在屏幕上渲染文字原创文章,转载请注明出处:http://blog.csdn.net/zhy_chen

【Cocos2d-x游戏引擎开发笔记(2)】在屏幕上渲染文字

原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/8268814。

 

这篇博文主要展示在屏幕上渲染文字,先来看看最后要实现的界面:

【Cocos2d-x游戏引擎开发笔记(2)】在屏幕下渲染文字

 

 

【Cocos2d-x游戏引擎开发笔记(2)】在屏幕下渲染文字

 

 

【Cocos2d-x游戏引擎开发笔记(2)】在屏幕下渲染文字

 

这个界面就是在屏幕的四个角落有不同字体不同颜色的Welcome来渲染,在屏幕的中间是汉字,颜色也是随机的。

 

 

下面来看看代码是怎么样实现的。

 

 

在main.cpp中将屏幕的大小设置为

eglView->setFrameSize(800, 480);//设置界面大小


在AppDelegate.cpp的applicationDidFinishLaunching函数中

 pDirector->setDisplayStats(0);

不显示FPS

 

在HelloWorldSecne.cpp中,将init方法中的代码注释一部分,如下:

bool HelloWorld::init(){    bool bRet = false;    do     {        //////////////////////////////////////////////////////////////////////////        // super init first        //////////////////////////////////////////////////////////////////////////        CC_BREAK_IF(! CCLayer::init());        //////////////////////////////////////////////////////////////////////////        // add your codes below...        //////////////////////////////////////////////////////////////////////////        // 1. Add a menu item with "X" image, which is clicked to quit the program.        // Create a "close" menu item with close icon, it's an auto release object.        /*CCMenuItemImage *pCloseItem = CCMenuItemImage::create(            "CloseNormal.png",            "CloseSelected.png",            this,            menu_selector(HelloWorld::menuCloseCallback));        CC_BREAK_IF(! pCloseItem);        // Place the menu item bottom-right conner.        pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));        // Create a menu with the "close" menu item, it's an auto release object.        CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);        pMenu->setPosition(CCPointZero);        CC_BREAK_IF(! pMenu);        // Add the menu to HelloWorld layer as a child layer.        this->addChild(pMenu, 1);        // 2. Add a label shows "Hello World".        // Create a label and initialize with string "Hello World".        CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);        CC_BREAK_IF(! pLabel);        // Get window size and place the label upper.         CCSize size = CCDirector::sharedDirector()->getWinSize();        pLabel->setPosition(ccp(size.width / 2, size.height - 50));        // Add the label to HelloWorld layer as a child layer.        this->addChild(pLabel, 1);        // 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(size.width/2, size.height/2));        // Add the sprite to HelloWorld layer as a child layer.        this->addChild(pSprite, 0);*/        bRet = true;    } while (0);    return bRet;}


现在项目运行起来应该是这样的:

【Cocos2d-x游戏引擎开发笔记(2)】在屏幕下渲染文字


好了,下面开始写自己的代码

 

CCLabelTTF *labelWelcome0=CCLabelTTF::create("Welcome","微软雅黑",48);CCLabelTTF *labelWelcome1=CCLabelTTF::create("Welcome","宋体",48);CCLabelTTF *labelWelcome2=CCLabelTTF::create("Welcome","Consolas",48);CCLabelTTF *labelWelcome3=CCLabelTTF::create("Welcome","Bitstream Vera Sans Mono",48);


这是“Welcome”的构造,使用create方法

第一个参数是const char *,表示要渲染的文字

第二个参数是const char*,表示文字的字体

第三个参数是float,表示字体的大小

 

 

CCSize size=CCDirector::sharedDirector()->getWinSize();float width=size.width;float height=size.height;


这里使用CCDirector获取屏幕的大小。

 

CCSize s0=labelWelcome0->getContentSize();CCSize s1=labelWelcome1->getContentSize();CCSize s2=labelWelcome2->getContentSize();CCSize s3=labelWelcome3->getContentSize();

这里获取要渲染的文字的大小

labelWelcome0->setPosition(CCPointMake(s0.width/2,size.height-s0.height/2));labelWelcome1->setPosition(ccp(size.width-s1.width/2,size.height-s1.height/2));labelWelcome2->setPosition(CCPoint(s2.width/2,s2.height/2));labelWelcome3->setPosition(ccp(size.width-s3.width/2,s3.height/2));//labelWelcome3->setPosition(CCPointZero);



这里设置文字显示的位置,这里的CCPointMake,ccp,CCPoint都是传递两个float参数指定显示的地点,指定的是文字中心点的地点,CCPointZero是(0,,0)点。

 

最后将文字加到布景中:

addChild(labelWelcome0,1);addChild(labelWelcome1,1);addChild(labelWelcome2,1);addChild(labelWelcome3,1);

 

现在,界面如下:

【Cocos2d-x游戏引擎开发笔记(2)】在屏幕下渲染文字

 

接下来为文字设置随机的颜色

 

                  srand((unsigned) time(NULL));ccColor3B c0,c1,c2,c3,c4;c0.r=rand()%256;c0.g=rand()%256;c0.b=rand()%256;c1.r=rand()%256;c1.g=rand()%256;c1.b=rand()%256;c2.r=rand()%256;c2.g=rand()%256;c2.b=rand()%256;c3.r=rand()%256;c3.g=rand()%256;c3.b=rand()%256;

这里随机设置颜色,使用了C++中的随机数。接下来

                  labelWelcome0->setColor(c0);labelWelcome1->setColor(c1);labelWelcome2->setColor(c2);labelWelcome3->setColor(c3);


这段代码在将文字添加到布景之前设置。好了,现在的界面是下面的:

【Cocos2d-x游戏引擎开发笔记(2)】在屏幕下渲染文字

 

最后要添加中间的文字了,中间的文字是中文,Windows默认的字符集是GB2312,而Cocos2d-x使用的是UTF-8,所以要将我们的字符先转为UTF-8,转换方法是使用下面的函数:

 

char* HelloWorld::G2U(const char* gb2312)  {   int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);   wchar_t* wstr = new wchar_t[len+1];   memset(wstr, 0, len+1);   MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);   len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);   char* str = new char[len+1];   memset(str, 0, len+1);   WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);   if(wstr) delete[] wstr;   return str;  }



 

现在可以将中间的文字显示出来了:

CCLabelTTF *labelWelcome4=CCLabelTTF::create(G2U("游戏开发的世界,我用Cocos2d-x来降服你了~!"),"Verdana",35);


最后,最后就是我们前面的效果了。

最后init方法的全部代码:

bool HelloWorld::init(){    bool bRet = false;    do     {        //////////////////////////////////////////////////////////////////////////        // super init first        //////////////////////////////////////////////////////////////////////////        CC_BREAK_IF(! CCLayer::init());        //////////////////////////////////////////////////////////////////////////        // add your codes below...        //////////////////////////////////////////////////////////////////////////        // 1. Add a menu item with "X" image, which is clicked to quit the program.        // Create a "close" menu item with close icon, it's an auto release object.        /*CCMenuItemImage *pCloseItem = CCMenuItemImage::create(            "CloseNormal.png",            "CloseSelected.png",            this,            menu_selector(HelloWorld::menuCloseCallback));        CC_BREAK_IF(! pCloseItem);        // Place the menu item bottom-right conner.        pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));        // Create a menu with the "close" menu item, it's an auto release object.        CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);        pMenu->setPosition(CCPointZero);        CC_BREAK_IF(! pMenu);        // Add the menu to HelloWorld layer as a child layer.        this->addChild(pMenu, 1);        // 2. Add a label shows "Hello World".        // Create a label and initialize with string "Hello World".        CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);        CC_BREAK_IF(! pLabel);        // Get window size and place the label upper.         CCSize size = CCDirector::sharedDirector()->getWinSize();        pLabel->setPosition(ccp(size.width / 2, size.height - 50));        // Add the label to HelloWorld layer as a child layer.        this->addChild(pLabel, 1);        // 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(size.width/2, size.height/2));        // Add the sprite to HelloWorld layer as a child layer.        this->addChild(pSprite, 0);*/CCLabelTTF *labelWelcome0=CCLabelTTF::create("Welcome","微软雅黑",48);CCLabelTTF *labelWelcome1=CCLabelTTF::create("Welcome","宋体",48);CCLabelTTF *labelWelcome2=CCLabelTTF::create("Welcome","Consolas",48);CCLabelTTF *labelWelcome3=CCLabelTTF::create("Welcome","Bitstream Vera Sans Mono",48);CCLabelTTF *labelWelcome4=CCLabelTTF::create(G2U("游戏开发的世界,我用Cocos2d-x来降服你了~!"),"Verdana",35);CCSize size=CCDirector::sharedDirector()->getWinSize();float width=size.width;float height=size.height;CCSize s0=labelWelcome0->getContentSize();CCSize s1=labelWelcome1->getContentSize();CCSize s2=labelWelcome2->getContentSize();CCSize s3=labelWelcome3->getContentSize();labelWelcome0->setPosition(CCPointMake(s0.width/2,size.height-s0.height/2));labelWelcome1->setPosition(ccp(size.width-s1.width/2,size.height-s1.height/2));labelWelcome2->setPosition(CCPoint(s2.width/2,s2.height/2));labelWelcome3->setPosition(ccp(size.width-s3.width/2,s3.height/2));//labelWelcome3->setPosition(CCPointZero);srand((unsigned) time(NULL));ccColor3B c0,c1,c2,c3,c4;c0.r=rand()%256;c0.g=rand()%256;c0.b=rand()%256;c1.r=rand()%256;c1.g=rand()%256;c1.b=rand()%256;c2.r=rand()%256;c2.g=rand()%256;c2.b=rand()%256;c3.r=rand()%256;c3.g=rand()%256;c3.b=rand()%256;c4.r=rand()%256;c4.g=rand()%256;c4.b=rand()%256;labelWelcome0->setColor(c0);labelWelcome1->setColor(c1);labelWelcome2->setColor(c2);labelWelcome3->setColor(c3);labelWelcome4->setPosition(ccp(size.width/2,size.height/2));labelWelcome4->setColor(c4);addChild(labelWelcome0,1);addChild(labelWelcome1,1);addChild(labelWelcome2,1);addChild(labelWelcome3,1);addChild(labelWelcome4,1);        bRet = true;    } while (0);    return bRet;}


 


 


 

 

热点排行