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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

cocos2x (c++/lua) spine 文件的预加载

發布時間:2025/5/22 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos2x (c++/lua) spine 文件的预加载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在之前,筆者寫過一編博客,通過lua在加載場景加載spineAnimation動畫精靈,保存在table中,然后在游戲中創建動畫精靈時,提取加載好的spineAnimaiton中的

spSkeletonData來創建spineAnimation,但后來筆者發現重復創建spineAnimation時,全部相同spSkeletonData會重用同一個spSkeletonData,以下是spSkeletonData拷貝方法的源代碼:

spSkeleton* spSkeleton_create (spSkeletonData* data) {

int i, ii;

?

_spSkeleton* internal = NEW(_spSkeleton);

spSkeleton* self = SUPER(internal);

CONST_CAST(spSkeletonData*, self->data) = data;

?

self->bonesCount = self->data->bonesCount;

self->bones = MALLOC(spBone*, self->bonesCount);

?

for (i = 0; i < self->bonesCount; ++i) {

spBoneData* boneData = self->data->bones[i];

spBone* parent = 0;

if (boneData->parent) {

/* Find parent bone. */

for (ii = 0; ii < self->bonesCount; ++ii) {

if (data->bones[ii] == boneData->parent) {

parent = self->bones[ii];

break;

}

}

}

self->bones[i] = spBone_create(boneData, self, parent);

}

CONST_CAST(spBone*, self->root) = self->bones[0];

?

self->slotsCount = data->slotsCount;

self->slots = MALLOC(spSlot*, self->slotsCount);

for (i = 0; i < self->slotsCount; ++i) {

spSlotData *slotData = data->slots[i];

?

/* Find bone for the slotData's boneData. */

spBone* bone = 0;

for (ii = 0; ii < self->bonesCount; ++ii) {

if (data->bones[ii] == slotData->boneData) {

bone = self->bones[ii];

break;

}

}

self->slots[i] = spSlot_create(slotData, bone);

}

?

self->drawOrder = MALLOC(spSlot*, self->slotsCount);

memcpy(self->drawOrder, self->slots, sizeof(spSlot*) * self->slotsCount);

?

self->r = 1;

self->g = 1;

self->b = 1;

self->a = 1;

?

self->ikConstraintsCount = data->ikConstraintsCount;

self->ikConstraints = MALLOC(spIkConstraint*, self->ikConstraintsCount);

for (i = 0; i < self->data->ikConstraintsCount; ++i)

self->ikConstraints[i] = spIkConstraint_create(self->data->ikConstraints[i], self);

?

spSkeleton_updateCache(self);

?

return self;

}

?

在拷貝當中,骨骼數據確實新開辟一個內存,拷貝了一份新的spSkeletonData,但是,由于spSkeletonData屬于在table中保存的SkeletonAnimation中,受到SkeletonAnimation的影響,所以不能使用SkeletonAnimation中的spSkeletonData去創建另外一個SkeletonAnimation。

?

筆者也試過從lua中創建spSkeletonData數據,保存在table中,然后在游戲中傳遞spSkeletonData去創建SkeletonAnimation,

但在切換場景過程中,spSkeletonData會被釋放掉,所以不能被復用。

?

后來筆者從c++入手,將spSkeletonData保存在c++靜態的字典中,通過鍵值提取spSkeletonData去創建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;

using namespace std;

?

class SpineAnimation_new:spine::SkeletonAnimation

{

public:

? ? static SpineAnimation_new *createWithSkeletonData(spSkeletonData* skeletonData);

? ? static SpineAnimation_new *createWithKey(const std::string& key);

?? ?

? ? virtual ~SpineAnimation_new();

? ? spAnimationState* getState() {return SkeletonAnimation::getState();}

?? ?

?? ?

? ? spSkeletonData* getSkeletonData()

? ? {

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

? ? ? ? return skData;

? ? }

?? ?

? ? static spSkeletonData*loadSkeletonData(const std::string& atlasFile,const std::string& jsonFile,const std::string& key);

? ? static map<const std::string,spSkeletonData*> skeletonDataMap;

? ? static void clear();

private:

? ? SpineAnimation_new(spSkeletonData*skeletonData);

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

};

?

#endif?

?

//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;

?

map<const std::string,spSkeletonData*> SpineAnimation_new::skeletonDataMap;

SpineAnimation_new *SpineAnimation_new::createWithSkeletonData(spSkeletonData* skeletonData)

{

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

? ? node->autorelease();

? ? return node;

}

?

?

spSkeletonData*SpineAnimation_new::loadSkeletonData(const std::string& atlasFile,const std::string& jsonFile,const std::string& key)

{

? ? spAtlas* atlas = spAtlas_createFromFile(atlasFile.c_str(), 0);

? ? spSkeletonJson* json = spSkeletonJson_create(atlas);

? ? json->scale = 1;

? ? spSkeletonData* sd = spSkeletonJson_readSkeletonDataFile(json, jsonFile.c_str());

? ? SpineAnimation_new::skeletonDataMap.insert(pair<const std::string,spSkeletonData*>(key,sd));

? ? return sd;

}

?

SpineAnimation_new *SpineAnimation_new::createWithKey(const std::string& key)

{

? ? map<const std::string,spSkeletonData*>::iterator iter = SpineAnimation_new::skeletonDataMap.find(key);

? ? spSkeletonData* sd = iter->second;

? ? SpineAnimation_new*sa = createWithSkeletonData(sd);

? ? return sa;

}

?

?

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)

{

}

?

void SpineAnimation_new::clear()

{

? ? SpineAnimation_new::skeletonDataMap.clear();

}

?

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

轉載于:https://www.cnblogs.com/HemJohn/p/4815998.html

總結

以上是生活随笔為你收集整理的cocos2x (c++/lua) spine 文件的预加载的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 在线色图| 国产福利一区视频 | 涩涩在线观看 | 欧美另类自拍 | 亚洲一区你懂的 | 外国av在线 | 亚洲AV无码精品色毛片浪潮 | 美色视频| 成人性生交大片免费看vrv66 | 水果派解说av | 精品三级在线观看 | 欧美xxxx免费虐 | 国产精品久久福利 | 想要视频在线 | 国产又爽又黄又嫩又猛又粗 | 欧美特黄一区二区三区 | 欧美另类亚洲 | 8x8x永久免费视频 | 在线免费黄色网 | 国产超碰人人 | 网站在线看 | 色批网站| 日韩黄色免费网站 | 女主播在线观看 | 国内自拍视频在线观看 | 漂亮少妇高潮午夜精品 | 日韩成人福利 | 亚洲一区欧美二区 | 在线观看日韩一区 | 日韩av男人的天堂 | 欧洲在线一区 | 成人在线观看免费 | 国产毛片久久 | 手机看片91| 在线观看av一区二区 | 中文字幕第七页 | 国产农村妇女毛片精品久久 | 丁香社区五月天 | 欧美日韩少妇精品 | 91亚洲精华国产精华精华液 | 亚洲老老头同性老头交j | 91春色| a v免费视频 | 亚洲国产精品区 | 无码人妻精品一区二区三区蜜桃91 | 无码人妻h动漫 | 蜜桃av中文字幕 | 婷婷天堂网| 欧美黑人一级爽快片淫片高清 | 在线观看涩涩 | 午夜少妇影院 | 久久久久久久美女 | 人人九九 | 青草视频免费观看 | 欧美高清免费 | 日韩在线视频在线 | 岛国av免费在线 | 激情综合网五月婷婷 | 91精品国产入口 | 久久精品国内 | 在线一二三区 | 曰本三级日本三级日本三级 | 亚洲精品热 | 亚洲视频网站在线 | a级黄色影院 | 97超碰福利 | 国产探花视频在线观看 | 香蕉视频网站入口 | 国产极品美女在线 | 国产又猛又黄又爽 | www.婷婷色| 欧美丰满少妇人妻精品 | 超碰久操 | 欧美日韩亚洲国产另类 | 欧美在线一卡 | ass极品水嫩小美女ass | 日本在线免费 | 姝姝窝人体www聚色窝 | 亚洲黄色小说图片 | 一级a毛片免费观看久久精品 | 亚洲狠狠婷婷综合久久久久图片 | 天堂资源地址在线 | 亚洲无码国产精品 | 伊人天天操 | 亚洲欧美综合精品久久成人 | 欧美日韩国产在线播放 | 欧美顶级毛片在线播放 | 九九热久久免费视频 | 777国产成人入口 | 久久久久久久久久久久国产精品 | 成年人网站在线 | 日韩不卡视频一区二区 | 亚洲区小说区图片区 | 午夜性生活片 | 亚洲综合丁香 | 亚洲AV无码精品色毛片浪潮 | 国产成人精品亚洲线观看 | 美女又爽又黄免费视频 | 黄色国产视频 |