Cocos2d-x之Sprite
|?? 版權聲明:本文為博主原創文章,未經博主允許不得轉載。
?
Sprite是Cocos2d-x游戲開發者最常用的類,用圖片把精靈(Sprite)顯示在屏幕上。
在游戲開發中,經常會遇到精靈(Sprite)這個術語。精靈是一個圖像,可以在屏幕上獨立的移動,一個精靈可能是玩家角色,子彈,敵人或者是大的背景圖片。一般情況下,精靈來自開發者所準備的PNG或PVRTC或JPG圖像。一旦圖像載入內存,就會將精靈轉換成紋理圖CCTexture,從而被CPU用于在屏幕上渲染;Cocos2d中的精靈和其他游戲引擎中的精靈相似,它可以移動,旋轉,縮放,執行動畫,并接受其他轉換Cocos2dx的Sprite由Texure,frame和animation組成,由openes負責渲染。
主要的類關系如下:?簡單過程可描述為:用Texture2D加載圖片,可以用Texture2D生成對應的SpriteFrame(精靈幀),將SpriteFrame添加到Animation生成動畫數據,用Animation生成Animate(就是最終的動畫動作),最后用Sprite執行這個動作。創建精靈的幾種方式:直接創建,紋理來創建精靈,精靈幀來創建精靈;
?
精靈類的主要公共函數:
?
精靈類的六種創建方法:
static Sprite* create(const char *pszFileName); 使用一個圖片名稱創建一個精靈,這種適用于靜態的精靈創建,如添加背景static Sprite* create(const char *pszFileName, const Rect& rect); 使用一個文件名稱和一個矩形框創建一個精靈static Sprite* createWithTexture(Texture2D *pTexture); 使用texture創建一個sprite,紋理創建static Sprite* createWithTexture(Texture2D *pTexture, const Rect&& rect); 使用texture和一個矩形框來創建一個spritestatic Sprite* createWithSpriteFrame(SpriteFrame *pSpriteFrame); 使用一個精靈幀來創建一個精靈static Sprite* createWithSpriteFrameName(const char *pszSpriteFrameName); 使用精靈幀名稱來創建一個精靈?
實例:
第一種創建:圖片名稱創建
void SpriteTest::Test1() {Sprite* sprite = Sprite::create("GameMainMenu.png");sprite->setPosition(Vec2(origin.x + visible.width / 2,origin.y + visible.height / 2));float xs = visible.width / sprite->getContentSize().width;float ys = visible.height / sprite->getContentSize().height;sprite->setScale(xs, ys);this->addChild(sprite); }第二種創建:文件名稱和一個矩形框創建
void SpriteTest::Test2() {Rect r = Rect(1, 91, 110, 83); //矩形框的位置坐標sprite = Sprite::create("Mouse_1.png", r);sprite->setPosition(Vec2(origin.x + visible.width / 4,origin.y + visible.height / 4));this->addChild(sprite); }第三種創建:紋理創建
void SpriteTest::Test3() {//取得一個.png圖片的紋理texture = Director::getInstance()->getTextureCache()->addImage("ThorHammer.png");sprite = Sprite::createWithTexture(texture);sprite->setPosition(Vec2(origin.x + visible.width / 4,origin.y + visible.height / 2.5));this->addChild(sprite); }第四種創建:texture和一個矩形框來創建
void SpriteTest::Test4() {//加載一張包含多張小圖片的大圖片texture = Director::getInstance()->getTextureCache()->addImage("MainBottom.png");//框出大圖片中的一張小圖片Rect r = Rect(1, 305, 558, 150);sprite = Sprite::createWithTexture(texture);//設置位置sprite->setPosition(Vec2(origin.x + visible.width / 2,origin.y + visible.height - 1.5*(visible.height / 3)));sprite->setScale(0.3, 0.3);this->addChild(sprite); }第五種創建:一個精靈幀來創建
void SpriteTest::Test5() {SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Hammer.plist");SpriteFrame* frame = SpriteFrameCache::getInstance()->getSpriteFrameByName("GoldenHammer.png");sprite = Sprite::createWithSpriteFrame(frame);sprite->setPosition(Vec2(origin.x + visible.width / 2,origin.y + visible.height / 2));this->addChild(sprite); }第六種創建:精靈幀名稱來創建
void SpriteTest::Test6() {SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Hammer.plist");sprite = Sprite::createWithSpriteFrameName("StarHammer .png");sprite->setPosition(Vec2(origin.x + visible.width / 2,origin.y + visible.height / 3));this->addChild(sprite); }完整代碼:
.h file#ifndef _SPRITETEST_SCENE_H_ #define _SPRITETEST_SCENE_H_ #include "cocos2d.h" class SpriteTest : public cocos2d::Layer { private:cocos2d::Size visible;cocos2d::Vec2 origin;cocos2d::Sprite* sprite;cocos2d::Texture2D* texture; public:static cocos2d::Scene* createScene();virtual bool init();void Test1();void Test2();void Test3();void Test4();void Test5();void Test6();CREATE_FUNC(SpriteTest); }; #endif // _SPRITETEST_SCENE_H_.cpp file#include "SpriteTest.h" USING_NS_CC; Scene* SpriteTest::createScene() {auto scene = Scene::create();auto layer = SpriteTest::create();scene->addChild(layer);return scene; } bool SpriteTest::init() {if (!Layer::init()){return false;}visible = Director::getInstance()->getVisibleSize();origin = Director::getInstance()->getVisibleOrigin();Test1();this->Test2();Test3();this->Test4();Test5();Test6();return true; } //第一種創建: 通過.png圖片來創建精靈 void SpriteTest::Test1() {Sprite* sprite = Sprite::create("GameMainMenu.png");sprite->setPosition(Vec2(origin.x + visible.width / 2,origin.y + visible.height / 2));float xs = visible.width / sprite->getContentSize().width;float ys = visible.height / sprite->getContentSize().height;sprite->setScale(xs, ys);this->addChild(sprite); }//第二種創建: 通過在一張大圖片中框出一個矩形圖片來創建精靈 void SpriteTest::Test2() {Rect r = Rect(1, 91, 110, 83); //矩形框的位置坐標sprite = Sprite::create("Mouse_1.png", r);sprite->setPosition(Vec2(origin.x + visible.width / 4,origin.y + visible.height / 4));this->addChild(sprite); }//第三種創建: 通過紋理來創建精靈 void SpriteTest::Test3() {//取得一個.png圖片的紋理texture = Director::getInstance()->getTextureCache()->addImage("ThorHammer.png");sprite = Sprite::createWithTexture(texture);sprite->setPosition(Vec2(origin.x + visible.width / 4,origin.y + visible.height / 2.5));this->addChild(sprite); }//使用一個紋理和一個矩形框創建一個精靈 void SpriteTest::Test4() {//加載一張包含多張小圖片的大圖片texture = Director::getInstance()->getTextureCache()->addImage("MainBottom.png");//框出大圖片中的一張小圖片Rect r = Rect(1, 305, 558, 150);sprite = Sprite::createWithTexture(texture);//設置位置sprite->setPosition(Vec2(origin.x + visible.width / 2,origin.y + visible.height - 1.5*(visible.height / 3)));sprite->setScale(0.3, 0.3);this->addChild(sprite); }//使用一個精靈幀創建一個精靈 void SpriteTest::Test5() {SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Hammer.plist");SpriteFrame* frame = SpriteFrameCache::getInstance()->getSpriteFrameByName("GoldenHammer.png");sprite = Sprite::createWithSpriteFrame(frame);sprite->setPosition(Vec2(origin.x + visible.width / 2,origin.y + visible.height / 2));this->addChild(sprite); }//使用精靈幀名稱創建一個精靈 void SpriteTest::Test6() {SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Hammer.plist");sprite = Sprite::createWithSpriteFrameName("StarHammer .png");sprite->setPosition(Vec2(origin.x + visible.width / 2,origin.y + visible.height / 3));this->addChild(sprite); }?
?
?SpriteBatchNode簡介:
在游戲開發中當屏幕上的精靈太多時,程序性能將急劇下降,這是因為每當添加一個精靈時,GPU都會重新渲染一次,這樣性能很低.當有多個精靈出現時,例如:游戲中的子彈,可以使用SpriteBatchNode批量加載一次,從而提高了程序的性能。
通過源碼分析,我們看到SpriteBatchNode還是通過TestureCache來加載圖片的
bool SpriteBatchNode::initWithFile(const char*fileImage,
unsigned int capacity)
{
??? Texture2D* ptexture2d = TextureCache::sharedTextureCache()->addImage(fileImage);
??? return initWithTexture(ptexture2d, capacity);
}
和SpriteFrameCache不同的是,SpriteFrameCache通常用來實現動畫,但是在3.0的版本中不建議使用,只要sprite來自一張大圖就行
實例源碼:
?
?
?SpriteFrameCache?
SpriteFrameCache是精靈幀的緩存類,提供了一些管理精靈幀Sprite的方法,SpriteFrameCache是單例類,實例化方法如下:
static SpriteFrameCache* getInstance(void);
其他重要的方法: static void purgeShareSpriteFrameCache(void); 清除緩存 void addSpriteFramesWithFile(const char* plist); 從plist配置文件中添加多個精靈幀SpriteFrame void addSpriteFramesWithFile(const char* plist, const char* fileName); 使用plist和紋理文件創建多個精靈幀(新增紋理時使用,該紋理和plist關聯在一起) void addSpriteFramesWithFile(const char* pszPlist, cocos2d::Texture2D* texture); 使用plist和紋理文件創建多個精靈幀(新增紋理時使用,該紋理和plist關聯在一起) void addSpriteFrame(cocos2d::SpriteFrame* frame,const char* frameName) 添加單幀精靈幀,并為精靈幀指定名稱 void removeSpriteFrame(void); 刪除精靈幀 void removeUnusedSpriteFrames(void) 刪除未使用的精靈幀 void removeSpriteFramesFromFile(const char* plist); 根據plist刪除精靈幀?
SpriteFrame
在游戲的開發過程中,通常使用工具將多張圖片放在同一張大的圖片中來加載,這樣可以提高性能,可以根據某個單個小圖片放在大圖片的矩形框中來顯示這張小圖片,精靈幀SpriteFrame就是用來封裝這張小圖片。
SpriteFrame的重要創建函數:
實例:
.h files#ifndef _SPRITEFRAMETEST_SCENE_H_ #define _SPRITEFRAMETEST_SCENE_H_ #include "cocos2d.h" class spriteFrame : public cocos2d::Layer { private:cocos2d::Vec2 origin;cocos2d::Size visible;cocos2d::Sprite* sprite; public:static cocos2d::Scene* createScene();virtual bool init();void Test_1();void Test_2();CREATE_FUNC(spriteFrame); }; #endif // _SPRITEFRAMETEST_SCENE_H_.cpp files#include "SpriteFrameTest.h" USING_NS_CC; Scene* spriteFrame::createScene() {Scene* scene = Scene::create();auto layer = spriteFrame::create();scene->addChild(layer);return scene; } bool spriteFrame::init() {if (!Layer::init()){return false;}visible = Director::getInstance()->getVisibleSize();origin = Director::getInstance()->getVisibleOrigin();Test_1();this->Test_2();return true; } void spriteFrame::Test_1() {Rect r = Rect(2, 2, 63, 72);auto frame = SpriteFrame::create("Hammer.bng", r);sprite = Sprite::createWithSpriteFrame(frame);sprite->setPosition(Vec2(origin.x + visible.width / 2,origin.y + visible.height / 2));this->addChild(sprite); } void spriteFrame::Test_2() {SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Mouse_3.plist");SpriteFrame* frame = SpriteFrameCache::getInstance()->getSpriteFrameByName("Rat_1_2.png");sprite = Sprite::createWithSpriteFrame(frame);sprite->setPosition(Vec2(origin.x + visible.width / 3,origin.y + visible.height / 3));this->addChild(sprite); }?
重要函數:
?
轉載于:https://www.cnblogs.com/geore/p/5797983.html
總結
以上是生活随笔為你收集整理的Cocos2d-x之Sprite的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 心态总结
- 下一篇: Sublime Text 2报“Deco