【地球人..学习cocos2d-x】学习实践之逐步变强的HelloWorld(下集)
笨木头花心贡献,啥?花心?不呢,是用心~
转载请注明,原文地址:http://blog.csdn.net/musicvs/article/details/8089125
正文:
上集传送门:http://blog.csdn.net/musicvs/article/details/8086971
好,继续…
先修正上一篇文章的一个错误,在cocos2d-x的2.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.png和CloseSelected.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); |
区别就是,initWithTarget、setNormalSpriteFrame、setSelectedSpriteFrame这几个函数,主要是setNormalSpriteFrame和setSelectedSpriteFrame,SpriteFrame已经存在SpriteFrameCache里了,所以我们可以成功地设置按钮的图片。
好了,第一篇学习的实践HelloWorld已经结束了。
我的第二篇学习即将开始,看完之后再和大家分享心得,大家也可以一起去看看,这位大牛写的教程很不错:
http://cn.cocos2d-x.org/bbs/forum.php?mod=viewthread&tid=805
.
.