http://www.cnblogs.com/linzheng/p/3292684.html
加菲貓 Just have a little faith. [Cocos2D-x For WP8]Sprite精靈
精靈(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 類是精靈類和其相關類的基礎。
那麼除此之外還有精靈幀類CCSpriteFrame,精靈幀緩衝類CCSpriteFrameCache。精靈幀的概念是相對於動畫而產生的。一個精靈是固定的節點,它可以擁有許多精靈幀(CCSpriteFrame),在它們之間切換就形成了動畫。精靈幀緩衝類CCSpriteFrameCache 用來儲存精靈幀,提前緩衝起來有助於提高程式的效率。 CCSpriteFrameCache是一個單例模式,不屬於某個精靈,是所有精靈共用使用的。
下面我們通過樣本來用一張貼圖來產生精靈:
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);}
貼圖的圖片:
啟動並執行效果: