【地球人..学习cocos2d-x】学习实践之逐步变强的HelloWorld(下集)

【地球人..学习cocos2d-x】学习实践之逐步变强的HelloWorld(下集)

 

笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址
http://blog.csdn.net/musicvs/article/details/8089125

 

正文:

 

上集传送门:http://blog.csdn.net/musicvs/article/details/8086971

 

好,继续

 

先修正上一篇文章的一个错误,在cocos2d-x2.x版本之后,创建精灵的方式由sprite***改为create***(并且几乎其它所有类都有这样的改动,虽然让使用了1.x版本的朋友很无奈,但是这个create还是比sprite**什么的比较形象。

于是,把上次的spriteWithSpriteFrameName改为createWithSpriteFrameName

 

1.     第三个HelloWorld-使用CCSpriteBatchNode

这个如果把原理抛开的话,很简单:

/* 加载图片资源到SpriteFrame缓存池*/

CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();

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

 

/* 创建CCTexture2D对象*/

CCTexture2D* texture = CCTextureCache::sharedTextureCache()->textureForKey("images.png");

 

/* 使用CCTexture2D对象创建BatchNode */

CCSpriteBatchNode* batchNode = CCSpriteBatchNode::createWithTexture(texture);

 

 /* 添加BatchNode到场景*/

this->addChild(batchNode);

 

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

 

/* 创建精灵*/

CCSprite* sprite = CCSprite::createWithSpriteFrameName("p6.png");

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

 

/* 把精灵添加到BatchNode */

batchNode->addChild(sprite);

好像没有什么能解释的,我本身对CCSpriteBatchNode的理解也十分不透彻。只是大概知道,把属于同一张大图片里的所有小图片都放到一个BatchNode对象里,然后给绘制的时候,只提交一次(好像是和OPGL的绘制原理有关的)。既然这是HelloWorld,就不详细研究了。

 

只要留意一下步骤:

创建用TexturePacker打包图片

->用图片创建Texture2D对象

->Texture2D对象创建SpriteBatchNode对象并添加到场景

->然后创建精灵的时候把精灵添加到SpriteBatchNode里而不是添加到场景里。

 

运行效果是一样的:

 

2.     第四个HelloWorld-加入关闭按钮

正常情况下,加入关闭按钮是比较简单的:

CCMenuItemImage *pCloseItem =CCMenuItemImage::create(

                  "CloseNormal.png",

                  "CloseSelected.png",

                   this,

                   menu_selector(HelloWorld::menuCloseCallback));

menu->addChild(pCloseItem);

就不解释了。

现在的问题是,我们已经把图片都打包在一张大图里了,根本就没有单独的CloseNormal.pngCloseSelected.png。那怎么办?最简单的办法就是没有办法。

 

噗,开玩笑的,看看代码:

/* 加入关闭按钮-使用图片菜单来实现*/

CCMenuItemImage* closeItemImg = CCMenuItemImage::create();

 

/* 初始化,先不设置图片*/

closeItemImg->initWithTarget(

this, menu_selector(BatchNodeSceneWithCloseBtn::menuCloseCallback));

 

/* 设置正常图片-使用SpriteFrame对象*/

closeItemImg->setNormalSpriteFrame(cache->spriteFrameByName("CloseNormal.png"));

 

/* 设置点击状态图片-使用SpriteFrame对象*/  closeItemImg->setSelectedSpriteFrame(cache->spriteFrameByName("CloseSelected.png"));

 

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

menu->setPosition(ccp(size.width - 50, 50));

this->addChild(menu);

区别就是,initWithTargetsetNormalSpriteFramesetSelectedSpriteFrame这几个函数,主要是setNormalSpriteFramesetSelectedSpriteFrameSpriteFrame已经存在SpriteFrameCache里了,所以我们可以成功地设置按钮的图片。

 

 

好了,第一篇学习的实践HelloWorld已经结束了。

 

我的第二篇学习即将开始,看完之后再和大家分享心得,大家也可以一起去看看,这位大牛写的教程很不错:

http://cn.cocos2d-x.org/bbs/forum.php?mod=viewthread&tid=805

 

 

.

 

.

你可能感兴趣的:(cache,null,menu)