一、在遊戲中經常用到Spine動畫,在cocos2dx 3.10之前建立Spine動畫可以采用
1、第一種方式
auto spine = SkeletonAnimation::createWithFile("spine.json", "spine.atlas");
但是當json檔案過大時每次解析會消耗大量時間導緻卡頓
2、第二種方式
//獲得資料
spAtlas* _atlas = spAtlas_createFromFile("spine.atlas", );
spSkeletonJson* _json = spSkeletonJson_create(_atlas);
auto spData = spSkeletonJson_readSkeletonDataFile(_json , "spine.json");
//建立
auto spine = SkeletonAnimation::createWithData(spData);
第二種方式通過建立data避免多次解析json檔案
二、cocos2dx 3.14.1 spine建立的差別
1、第一種方式
auto spine = SkeletonAnimation::createWithJsonFile("spine.json", "spine.atlas");
方法名稱改為createWithJsonFile,同樣當json檔案過大時每次解析會消耗大量時間導緻卡頓
2、第二種方式
//獲得資料
spAtlas* _atlas = spAtlas_createFromFile("spine.atlas", );
auto _attachmentLoader = Cocos2dAttachmentLoader_create(_atlas );
spSkeletonJson* _json = spSkeletonJson_createWithLoader(&_attachmentLoader ->super);
auto spData = spSkeletonJson_readSkeletonDataFile(_json , "spine.json");
//建立
auto spine = SkeletonAnimation::createWithData(spData);
可以看出在獲得data資料的時候變成了如下方式
auto _attachmentLoader = Cocos2dAttachmentLoader_create(_atlas );
spSkeletonJson* _json = spSkeletonJson_createWithLoader(&_attachmentLoader ->super);
我們來看一下庫檔案,可以看出資料擷取的方式發生了改變
void SkeletonRenderer::initWithJsonFile (const std::string& skeletonDataFile, spAtlas* atlas, float scale) {
_atlas = atlas;
_attachmentLoader = SUPER(Cocos2dAttachmentLoader_create(_atlas));
spSkeletonJson* json = spSkeletonJson_createWithLoader(_attachmentLoader);
json->scale = scale;
spSkeletonData* skeletonData = spSkeletonJson_readSkeletonDataFile(json, skeletonDataFile.c_str());
CCASSERT(skeletonData, json->error ? json->error : "Error reading skeleton data.");
spSkeletonJson_dispose(json);
setSkeletonData(skeletonData, true);
initialize();
}
如果還是運用老的建立方式的話,可以正常編譯,但是在運作的過程中
void SkeletonRenderer::draw (Renderer* renderer, const Mat4& transform, uint32_t transformFlags) 方法裡面獲得attachmentVertices->_triangles将無法擷取

運作到如下标記的地方将導緻程式崩潰