日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Cocos2d-x之Sprite

發布時間:2025/3/21 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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來自一張大圖就行


實例源碼:

.h files#ifndef _SPRITEBATCHNODETEST_SCENE_H_ #define _SPRITEBATCHNODETEST_SCENE_H_ #include "cocos2d.h" class SpriteBatch : public cocos2d::Layer { private:cocos2d::Size visible;cocos2d::Vec2 origin;cocos2d::SpriteBatchNode* batch;cocos2d::Sprite* mole; public:static cocos2d::Scene* createScene();virtual bool init();//初始化Batch,通過這個函數來添加多個地鼠void initBatch();//添加地鼠,從batch取得,然后在當前的這個點出添加一個地鼠(點事通過觸屏事件得到)void addMole(cocos2d::Vec2 point);//添加一個觸屏事件,當我們點擊屏幕時,在我們點擊的位置添加一個地鼠virtual bool onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event);CREATE_FUNC(SpriteBatch); }; #endif // _SPRITEBATCHNODETEST_SCENE_H_.cpp files#include "SpriteBatchNodeTest.h" USING_NS_CC; Scene* SpriteBatch::createScene() {auto scene = Scene::create();auto layer = SpriteBatch::create();scene->addChild(layer);return scene; } bool SpriteBatch::init() {if (!Layer::init()){return false;}visible = Director::getInstance()->getVisibleSize();origin = Director::getInstance()->getVisibleOrigin();initBatch();//注冊監聽器auto l = EventListenerTouchOneByOne::create();l->onTouchBegan = CC_CALLBACK_2(SpriteBatch::onTouchBegan, this);//注冊事件_eventDispatcher->addEventListenerWithSceneGraphPriority(l, this);return true; } void SpriteBatch::initBatch() {//首先初始化,創建地鼠對象,添加50個地鼠到layer中batch = SpriteBatchNode::create("Rat4.png", 50);//將batch添加到當前的Layer中this->addChild(batch); } void SpriteBatch::addMole(cocos2d::Vec2 point) {//創建一個地鼠的精靈,此精靈為紋理,且取自batch中的地鼠紋理mole = Sprite::createWithTexture(batch->getTexture());//將地鼠顯示在單擊屏幕的地方mole->setPosition(point);//最后將此精靈添加到Layer中this->addChild(mole); } bool SpriteBatch::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event) {//首先,取得鼠標點擊屏幕的那個點cocos2d::Vec2 point = touch->getLocationInView();//將獲取的point這個點,轉換成坐標point = Director::getInstance()->convertToGL(point);//每點擊一次屏幕,就調用addMole()一次addMole(point);return false; }

?

?

?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的重要創建函數:

static SpriteFrame* create(const char* filename, const Rect& rect); 使用Texture(紋理)和矩形框創建精靈幀 static SpriteFrame* createWithTexture(Texture2D* pobTexture, const Rect& rect); 使用圖片文件和矩形框來創建精靈幀

實例:

.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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。