精靈(Sprite)是遊戲裏面的角色,好比敵人,遊戲裏面運動的物體等等,因此精靈是遊戲裏面一個很是常見的概念,幾乎無處不在。在Cocos2D-x裏面精靈是用CCSprite類來進行表示的,它能夠用一張圖片或者一張圖片的一塊矩形部分來定義。咱們能夠經過下面的代碼用一張圖片資源建立一個精靈,而後把它添加到遊戲中:緩存
CCSprite *b = CCSprite::create("cat.png"); b->setPosition(ccp(s.width * 0.5, s.height * 0.5));
若是你須要生成多個相同的精靈那麼就能夠利用精靈批處理類CCSpriteBatchNode類來進行處理,那麼這樣的處理方式能夠提升精靈的繪製效率的,須要繪製的精靈數量越多,效果越明顯。CCSpriteBatchNode是把多個精靈放到一個紋理上,繪製的時候直接統一繪製該紋理,不須要單獨繪製子節點,這樣繪製的時候就能夠節省了屢次對圖片資源重複打開關閉的時間。CCSpriteBatchNode內部封裝了一個CCTextureAtlas(紋理圖集,它內部封裝了一個CCTexture2D)和一個CCArray(用來存儲CCSpriteBatchNode的子節點:單個精靈)。注意:由於繪製的時候只open-close一次,因此CCSpriteBatchNode對象的全部子節點都必須和它是用同一張圖片。工具
不過使用CCSpriteBatchNode有一個限制,就是所使用的圖片必須來自同一個文件,若是使用一張圖片來建立精靈,你將不能指定精靈的深度,這樣,全部的精靈都必須在同一渲染層,不過你可使用貼圖集來避免這個問題,若是你的全部貼圖都在同一個文件裏,那麼你只需建立一個CCSpriteBatchNode就能夠了。紋理貼圖集是將咱們須要的部分圖片放在一張大小固定的圖片,能夠節約內存。由於OpenGL 機制會把單張圖處理成相應大小的長寬都是2 的n 次方的圖片,因此把圖片放在一塊兒能夠節約空間。可使用Zwoptex工具來製做這樣的貼圖。動畫
貼圖類CCTexture2D 是關於OpenGL 的概念。在OpenGL 中稱圖片爲貼圖,在Cocos2D-x 中CCTexture2D 就是圖片對象的意思,能夠經過它建立精靈等對象。CCTexture2D 類是精靈類和其相關類的基礎。spa
那麼除此以外還有精靈幀類CCSpriteFrame,精靈幀緩存類CCSpriteFrameCache。精靈幀的概念是相對於動畫而產生的。一個精靈是固定的節點,它能夠擁有許多精靈幀(CCSpriteFrame),在它們之間切換就造成了動畫。精靈幀緩存類CCSpriteFrameCache 用來存儲精靈幀,提早緩存起來有助於提升程序的效率。 CCSpriteFrameCache是一個單例模式,不屬於某個精靈,是全部精靈共享使用的。code
下面咱們經過示例來用一張貼圖來生成精靈:對象
TestLayer::TestLayer() { CCSize s = CCDirector::sharedDirector()->getWinSize(); //經過圖片建立2D紋理 CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage("dragon_animation.png"); // 經過2D紋理來建立精靈幀,能夠經過矩形座標來截取2D紋理的某個區域 CCSpriteFrame *frame0 = CCSpriteFrame::createWithTexture(texture, CCRectMake(132*0, 132*0, 132, 132)); CCSpriteFrame *frame1 = CCSpriteFrame::createWithTexture(texture, CCRectMake(132*1, 132*0, 132, 132)); CCSpriteFrame *frame2 = CCSpriteFrame::createWithTexture(texture, CCRectMake(132*2, 132*0, 132, 132)); CCSpriteFrame *frame3 = CCSpriteFrame::createWithTexture(texture, CCRectMake(132*3, 132*0, 132, 132)); CCSpriteFrame *frame4 = CCSpriteFrame::createWithTexture(texture, CCRectMake(132*0, 132*1, 132, 132)); CCSpriteFrame *frame5 = CCSpriteFrame::createWithTexture(texture, CCRectMake(132*1, 132*1, 132, 132)); //經過精靈幀建立精靈 CCSprite* sprite0 = CCSprite::createWithSpriteFrame(frame0); sprite0->setPosition( ccp( 100, s.height/2) ); addChild(sprite0); CCSprite* sprite1 = CCSprite::createWithSpriteFrame(frame1); sprite1->setPosition( ccp(200, s.height/2) ); addChild(sprite1); CCSprite* sprite2 = CCSprite::createWithSpriteFrame(frame2); sprite2->setPosition( ccp(300, s.height/2) ); addChild(sprite2); CCSprite* sprite3 = CCSprite::createWithSpriteFrame(frame3); sprite3->setPosition( ccp(400, s.height/2) ); addChild(sprite3); CCSprite* sprite4 = CCSprite::createWithSpriteFrame(frame4); sprite4->setPosition( ccp(500, s.height/2) ); addChild(sprite4); CCSprite* sprite5 = CCSprite::createWithSpriteFrame(frame5); sprite5->setPosition( ccp(600, s.height/2) ); addChild(sprite5); }
貼圖的圖片:blog
運行的效果:遊戲