只有你足够强,别人才会和你讲道理。
文章: 280
浏览: 3,005,104
  • 博主:笨木头
  • 关注:Unity、Net Core、Blazor
  • 邮箱:musicvs@163.com
笨木头  2012-10-18 18:29     Cocos2d-x,Cocos2d-x2.0     阅读(5421)     评论(5)
转载请注明,原文地址: http://www.benmutou.com/archives/14
文章来源:笨木头与游戏开发
 

 

1.       在HelloWorld之前

因为我准备按照第一篇教程里教我的东西,一步步从简单到难写成多个Demo,于是我又不想新建那么多项目,所以,是的~我们需要一个菜单界面。

要创建很难,很多步,别激动,慢慢来,噗:
  1. 首先我们需要一个CCMenu对象,它是一个菜单对象,当然菜单是可以包含子菜单的。
  2. 然后我们需要子菜单,在cocos2d-x里子菜单就是CCMenuItem,但是Item的类别有很多,在这里,我选择文字标签ItemCCMenuItemLabel
  3. CCMenu需要一个CCMenuItemLabel,同样CCMenuItemLabel它只是一个Item,而它又要作为一个标签Item,所以它需要一个标签对象:CCLabelTTF
  4. 于是,整个步骤就是,一个CCLabelTTF对象添加到一个CCMenuItemLabel对象,然后CCMenuItemLabel对象再添加到CCMenu里。
 

好了,废话多了,看代码:

/* 创建一个Label对象 */

CCLabelTTF* helloWorldLab1 = CCLabelTTF::create("HelloWorld1", "Arial", 35);

/* 创建一个CCMenuItemLabel对象,需要Label对象作为参数 */

CCMenuItemLabel* helloWorldItem1 = CCMenuItemLabel::create(

            helloWorldLab1,

            this,

            menu_selector(MenuScene::showHelloWorld1));

/* 创建一个CCMenu对象,需要Item对象作为参数 */

CCMenu* menu = CCMenu::create(helloWorldItem1, NULL);

/* 最后将CCMenu菜单添加到场景中 */

this->addChild(menu);
 

menu_selector,没有人想好奇一下这个是什么吗?虽然它的内在原理我现在还没懂,但是我知道它相当于一个回调功能。当菜单的Item对象被点击之后,会调用

showHelloWorld1函数。也就是说,我们可以在这里设置点击菜单项之后要做的事情。

 

2.    第一个HelloWorld

现在来一个最简单的吧:

CCSprite* backgroundSprite = CCSprite::create("HelloWorld.png");

this->addChild(backgroundSprite);
就这样,最普通的创建一个精灵的方式。

 

友情提示:如果对C++语法也不熟悉的朋友(比如我,噗),最好自己一点点写,重新写一个场景类,包括它的头文件,cpp文件。

 

3.       第二个-使用TexturePacker打包后的图片创建精灵

关于TexturePacker的使用我就不说了,大牛的教程里讲得很详细了。另外一提,TexturePacker并不是万能的,千万不要过度依赖,本人亲测,如果用TexturePacker打包的图片有过多空白冗余的地方,将会适得其反地使得图片更加占用内存(和打包之前相比)。所以,打包的时候一定要用心,尽量减少空白的地方。

 

嗯,然后,为了添加第二个Demo,我需要在菜单里加入第二个Item对象,于是,看看:

/* 获取屏幕大小*/

CCSize size = CCDirector::sharedDirector()->getWinSize();

CCLabelTTF* itemLab = NULL;

/* Demo1-最简单的方式创建一个精灵*/

itemLab = CCLabelTTF::create("HelloWorld1", Arial, 30);

CCMenuItemLabel* helloWorldItem1 = CCMenuItemLabel::create(

       itemLab,

       this,

       menu_selector(MenuScene::showHelloWorld1));

/* Demo2-使用TexturePacker打包后的图片创建一个精灵*/

itemLab = CCLabelTTF::create("HelloWorld2", Arial, 30);

CCMenuItemLabel * helloWorldItem2 = CCMenuItemLabel::create(

itemLab,

        this,

        menu_selector(MenuScene::showHelloWorld2));

/* 创建菜单*/

CCMenu* menu = CCMenu::create();

menu->setPosition(ccp(size.width / 2, size.height / 2));

/* 添加所有Item到菜单中*/

menu->addChild(helloWorldItem1);

menu->addChild(helloWorldItem2);

/* 自动按垂直方向排列子Item */

menu->alignItemsVertically();

this->addChild(menu);
前面的创建Item就不说了,我想说说红色加粗的部分,向菜单添加Item对象和向场景添加精灵的方式是一样的,用addChild就可以了,很方便。

然后,刚开始我发现直接这样add进入的Item全都挤在一起了,于是我首先想到用setPosition

,当然,结果是成功的。可是,后来我想,cocos2d-x这么强大,应该有自动排列才对的,于是我找了一下CCMenu的函数,发现了这个alignItemsVertically(),让子Item按垂直方向自动排队~很好用,噗。

 

然后进入正题,先打包好图片,得到两个文件:images.plistimages.png。我比较懒,直接从大牛的教程里下载的然后看代码:

/* 将图片加载到缓存池中*/

CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();

cache->addSpriteFramesWithFile("images.plist", "images.png");

CCSize size = CCDirector::sharedDirector()->getWinSize();

/* 使用TexturePacker打包图片后创建精灵的方式*/

CCSprite* people = CCSprite::spriteWithSpriteFrameName("p6.png");

people->setPosition(ccp(size.width / 2, size.height / 2));

this->addChild(people);
好了,你懂了,不说了。

噗,开玩笑的。CCSpriteFrameCache是缓存池,存放所有CCSpriteFrame对象的地方,用addSpriteFramesWithFile方法把打包好的图片解析成CCSpriteFrame对象,然后放到缓存池里。

于是,创建精灵的时候就直接用图片打包前各自的名字就可以了,比如下图中的箭头所指的那个图片(由于怕你们看不到它,所以我稍微多用了2个箭头,是2个么?应该是的= =):

创建精灵的时候就直接用图片打包前各自的名字就可以了

 

它在打包前有自己的文件名的,叫做”p6.png”,于是,我想用这个小人图片创建一个精灵,就这样:

CCSprite* people = CCSprite::spriteWithSpriteFrameName("p6.png");

 小人图片创建一个精灵

 

好了,这就是第二个HelloWorld了。

 

待续
5 条评论
  • tianshenshangjie 2012-12-12 12:25:00

    骚年呀。项目哪里可以下载
    0回复
  • musicvs 2012-12-12 12:33:00

    [reply]tianshenshangjie[/reply]
    都是比较简单的代码,所以就没有把项目贴上来了...

    你可以看看这篇教程:
    http://cn.cocos2d-x.org/bbs/forum.php?mod=viewthread&tid=775&extra=page%3D2

    我这篇文章是在看完上面的教程之后写的~~
    0回复
  • HeyNine 2012-12-12 14:38:00

    楼主分享一下你学习cocos2d的学习资料吧,我也想学习学习,不过都没有系统的资料
    0回复
  • musicvs 2012-12-12 16:34:00

    [reply]HeyNine[/reply]
    十分残忍的是,真的没有系统的资料...我都是东一篇西一篇的看了,像老G的博客,红孩儿的博客,himi的博客,这些都是大牛(当然还有很多大牛,比如子龙山人,实在是牛人,,,百度一下,很多牛人的博客~)..

    我建议先百度到处看看资料,看不懂也没关系,只是先了解..慢慢对cocos2d-x不太陌生的时候,就对着别人的教程敲代码~
    然后开始知道了一点点道道的时候,就开始自己写一个非常简单的小游戏~

    再然后就写一个稍微复杂一些的游戏(这样能学到很多东西,并不仅仅是cocos2d-x方面的~),我现在就正在执行这一步,虽然也是小游戏,但是五脏俱全(目前为止已经有50个类了~)...
    边写边学很兴奋,虽然这样可能学习的进度会慢一些,但是掌握的应该会深刻一些~

    糟糕,我又唠叨了...
    0回复
  • HeyNine 2012-12-12 16:41:00

    [reply]musicvs[/reply]
    哈哈,一定都不唠叨,很有用,感谢楼主了
    0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发