使用lua實現Spine動畫的預加載


創建spine動畫有兩種方法,分別是createwithfile和createwithdata。

createWithFile是通過加載動作數據馬上進行創建,如果spine動畫中的json文件大小超過100k時,會出現卡頓現象,如果動畫文件偏小,可以使用這個方法來創建動畫。

createWithData是通過預加載,保存動畫數據在spSkeletonData中,然后通過實現創建動畫,這個方法可以使用在spine動畫偏大的情況下使用。

 

cocos2dx 自帶的LuaSkeletonAnimation文件中沒有對createWithData進行實現,所有,我選擇繼承SkeletonAnimation來重寫該方法。

實現方法如下:

 

 (SpineAnimation_new.h)

#include <stdio.h>

#include "cocos/editor-support/spine/SkeletonAnimation.h"

#include "cocos/editor-support/spine/spine.h"

#include "spine/SkeletonRenderer.h"

#include "cocos2d.h"

 

using namespace spine;

 

class SpineAnimation_new:spine::SkeletonAnimation

{

public:

    static SpineAnimation_new *createWithSkeletonData(spSkeletonData* skeletonData);

    static SpineAnimation_new *createWithSkeletonAnimation(SpineAnimation_new*skeletonAnim);

    static SpineAnimation_new *createWithFileName(const std::string& skeletonDataFile, const std::string& atlasFile, float scale = 1);

    virtual ~SpineAnimation_new();

    spSkeletonData* getSkeletonData()

    {

        spSkeletonData*skData =SkeletonRenderer::getSkeleton()->data;

        return skData;

    }

private:

    SpineAnimation_new(spSkeletonData*skeletonData);

    SpineAnimation_new(const std::string& skeletonDataFile, const std::string& atlasFile, float scale = 1);

};

 

(SpineAnimation_new.cpp)

 

#include "SpineAnimation_new.h"

#include "cocos2d.h"

#include "cocos/scripting/lua-bindings/manual/cocos2d/LuaScriptHandlerMgr.h"

#include "CCLuaStack.h"

#include "CCLuaEngine.h"

 

USING_NS_CC;

 

SpineAnimation_new *SpineAnimation_new::createWithSkeletonData(spSkeletonData* skeletonData)

{

    SpineAnimation_new* node = new (std::nothrow)SpineAnimation_new(skeletonData);

    node->autorelease();

    return node;

}

 

SpineAnimation_new *SpineAnimation_new::createWithSkeletonAnimation(SpineAnimation_new*skeletonAnim)

{

    SpineAnimation_new* node = new (std::nothrow)SpineAnimation_new(skeletonAnim->getSkeletonData());

    node->autorelease();

    return node;

}

 

SpineAnimation_new *SpineAnimation_new::createWithFileName(const std::string& skeletonDataFile, const std::string& atlasFile, float scale)

{

    SpineAnimation_new* node = new (std::nothrow)SpineAnimation_new(skeletonDataFile, atlasFile, scale);

    node->autorelease();

    return node;

}

 

 

SpineAnimation_new::~SpineAnimation_new()

{

    ScriptHandlerMgr::getInstance()->removeObjectAllHandlers((void*)this);

}

 

SpineAnimation_new::SpineAnimation_new(spSkeletonData*skeletonData):

SkeletonAnimation(skeletonData)

{

    

}

SpineAnimation_new::SpineAnimation_new(const std::string& skeletonDataFile, const std::string& atlasFile, float scale):SkeletonAnimation(skeletonDataFile,atlasFile,scale)

{

}

在綁定lua的c++代碼中,cocos2dx自帶的打包工具會出現一下小問題,在棧中獲取不了加載好的spine數據,所以要我將讀棧方法修改如下:

    argc = lua_gettop(tolua_S) - 1;

    if (argc == 1)

    {

        SpineAnimation_new* arg0 = (SpineAnimation_new*)tolua_tousertype(tolua_S,2,0);

        SpineAnimation_new* ret = SpineAnimation_new::createWithSkeletonAnimation(arg0);

        return 1;

    }

 

在lua代碼中,我先將所有spine動畫創建加載,放在一個table中,並且調用retain()方法避免場景切換時被釋放,然后在游戲過程中,通過鍵值獲取table中預先創建好的spine動畫實現創建。

local spineAnim = cc.SpineAnimation_new:createWithFileName("role/tn_zt/tn_zt.json","role/tn_zt/tn_zt.atlas")--預加載動畫資源

 self._sprite3d = cc.SpineAnimation_new:createWithSkeletonAnimation(spineAnim)--創建動畫

    self:addChild(self._sprite3d)--添加到當前場景

    self._sprite3d:setPosition(200,200)

 

通過以上方法就可以實現spine動畫的預加載

(轉載時請注明出處,from 博客園:HemJohn)

 


免責聲明!

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



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