cocos代碼研究(1)sprite學習筆記


各種方法創建Sprite和Animate

    //圖片創建法 參數一:圖片資源路徑 參數二:Rect選區
    auto sprite = Sprite::create("Images/grossini_dance_atlas.png", Rect(x, y, 85, 121));
    addChild(sprite);

    /*************華麗分割線*************/

    //BatchNode類紋理創建法 
    //參數一:紋理圖片 參數二:容量(子節點數量上限)
    auto batchNode = SpriteBatchNode::create("Images/grossini_dance_atlas.png", 50);
    //參數一:獲取紋理 參數二:Rect選區
    auto sprite = Sprite::createWithTexture(batchNode->getTexture(), Rect(x, y, 85, 121));
    batchNode->addChild(sprite);
    addChild(batchNode);

    /*************華麗分割線*************/

    //精靈幀緩存SpriteFrameCache創建法 
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/ghosts.plist", "animations/ghosts.png");
    auto sprite = Sprite::createWithSpriteFrameName("father.gif");
    addChild(sprite);

    /*************華麗分割線*************/

    //BatchNode + SpriteFrameCache + Sprite 組合使用
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/ghosts.plist", "animations/ghosts.png");
    auto batchNode = SpriteBatchNode::create("animations/ghosts.png");
    auto sprite = Sprite::createWithSpriteFrameName("father.gif");
    batchNode->addChild(sprite);
    addChild(batchNode);

    /*************華麗分割線*************/

    //紋理創建法
    auto texture = Director::getInstance()->getTextureCache()->addImage("animations/dragon_animation.png");
    auto frame = SpriteFrame::createWithTexture(texture, Rect(132 * 0, 132 * 0, 132, 132));
    auto sprite = Sprite::createWithSpriteFrame(frame);

    /*************華麗分割線*************/

    //SpriteFrameCache創建動畫法
    auto cache = SpriteFrameCache::getInstance();
    cache->addSpriteFramesWithFile("animations/grossini-aliases.plist", "animations/grossini-aliases.png");
    auto sprite = Sprite::createWithSpriteFrameName("grossini_dance_01.png");
    
    Vector<SpriteFrame*> animFrames(15);
    char str[100] = { 0 };
    for (int i = 1; i < 15; i++)
    {
        sprintf(str, "grossini_dance_%02d.png", i);
        auto frame = cache->getSpriteFrameByName(str);
        animFrames.pushBack(frame);
    }

    auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
    sprite->runAction(RepeatForever::create(Animate::create(animation)));

    /*************華麗分割線*************/

    //AnimationCache加載animation創建動畫法
    auto animationCache = AnimationCache::getInstance();
    auto animation = Animation::createWithSpriteFrames(animFrames, 0.2f);
    //參數一:animation  參數二:綁定別名
    animationCache->addAnimation(animation, "dance_blue");
    auto dance_blue = animationCache->getAnimation("dance_blue");

    /*************華麗分割線*************/

    //AnimationCache加載plist文件創建動畫法
    auto frameCache = SpriteFrameCache::getInstance();
    frameCache->addSpriteFramesWithFile("animations/grossini.plist");
    auto animationCache = AnimationCache::getInstance();
    animationCache->addAnimationsWithFile("animations/animations.plist");
    auto normal = animationCache->getAnimation("dance_1");

    /*************華麗分割線*************/

    //動態加載紋理方法
    std::string plist_content;  //plist文件數據
    {
        std::string fullPath = FileUtils::getInstance()->fullPathForFilename("animations/grossini.plist");
        Data data = FileUtils::getInstance()->getDataFromFile(fullPath);
        if (!data.isNull())
            plist_content.assign((const char*)data.getBytes(), data.getSize());
    }
    std::string image_content; //圖片文件數據
    {
        std::string fullPath = FileUtils::getInstance()->fullPathForFilename("animations/grossini.png");
        Data data = FileUtils::getInstance()->getDataFromFile(fullPath);
        if (!data.isNull())
            image_content.assign((const char*)data.getBytes(), data.getSize());
    }
    Image image;
    image.initWithImageData((const uint8_t*)image_content.c_str(), image_content.size());
    Texture2D* texture = new (std::nothrow) Texture2D();
    texture->initWithImage(&image);
    texture->autorelease();

    auto cache = SpriteFrameCache::getInstance();
    cache->addSpriteFramesWithFileContent(plist_content, texture); 

常用的API介紹

AnimationCache類

通過名字和動畫添加到緩存。
void addAnimation (Animation *animation, const std::string &name)

從plist文件添加一個動畫,確保SpriteFrameCache的幀在之前就加載過了
void addAnimationsWithFile (const std::string &plist)

返回一個之前添加的動畫。 如果沒有找到它將返回空。
Animation * getAnimation (const std::string &name)

從緩存中刪除一個動畫。
void removeAnimation (const std::string &name)

清除緩存,它會釋放所有的動畫對象和共享實例。
static void destroyInstance ()

 

SpriteFrameCache類

從 plist 文件添加多個 SpriteFrame,會自動加載相應的紋理。 當 plist 文件中未指定使用的 texture 文件時,plist 文件的擴展名替換為 .png 即為紋理文件的名稱。
void addSpriteFramesWithFile (const std::string &plist)

使用指定的 plist 文件與紋理文件加載 SpriteFrame。
void addSpriteFramesWithFile(const std::string& plist,const std::string& textureFileName)

添加一個 SpriteFrame 並指定其名稱。
void addSpriteFrame (SpriteFrame *frame, const std::string &frameName)

獲取指定名稱的 SpriteFrame。
SpriteFrame * getSpriteFrameByName (const std::string &name)

檢查一個 plist 文件是否已經被加載。
bool isSpriteFramesWithFileLoaded (const std::string &plist) const

清理已加載的 SpriteFrame。
void removeSpriteFrames ()

根據指定的名稱從緩存中刪除一個 SpriteFrame。
void removeSpriteFrameByName (const std::string &name)

釋放未使用的 SpriteFrame。 引用計數為 1 的 SpriteFrame 將被刪除。 在進入一個新的場景時,可以通過調用該方法方便的釋放不再使用的 SpriteFrame。
void removeUnusedSpriteFrames ()

將指定的 plist 文件中的 SpriteFrame 從緩存中刪除
void removeSpriteFramesFromFile (const std::string &plist)

銷毀 SpriteFrameCache 的實例。會釋放所有的 SpriteFrame 和 retain 的實例。
static void destroyInstance()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM