cocos2dx載入骨骼動畫,獲取骨骼位置

2021-10-08 07:33:20 字數 2660 閱讀 2471

需求:

(1)希望在骨骼上繫結乙個粒子特效

(2)獲取骨骼的位置

(3)獲取骨骼動畫的大小

(4)lua

1. cocostudio動畫編輯器

(1)繫結粒子特效(跟隨骨骼的移動移動)

local bonenew = ccs.bone:create("particle")

bonenew:adddisplay(particle, )

--設定是否跟隨骨骼一起移動

bonenew:setignoremovementbonedata(true)

--顯示骨骼上繫結的內容(這裡是粒子特效,換裝也是同樣的介面)

bonenew:changedisplaywithindex(, true)

--設定層級關係

bonenew:setlocalzorder()

--layer22為骨骼動畫中想繫結的骨骼,設定為該骨骼為粒子特效所在骨骼的父骨骼

armature:addbone(bonenew, "layer22")

* 其他的和骨骼的繫結也是通過此方式實現,感覺比較好用

(2)獲取骨骼位置

修改源**,從getworldinfo中獲取資料,在bone類中加乙個介面

cocos2d::vec2 bone::getboneposition() const

使用tolua++匯出來之後如下(當然,自己也可以寫乙個,就不用匯出來這個步驟了):

int lua_cocos2dx_studio_bone_getboneposition(lua_state* tolua_s)

#endif

argc = lua_gettop(tolua_s)-;

)cclog();

;#if cocos2d_debug >= 1

tolua_lerror:

tolua_error(tolua_s,"#ferror in function 'lua_cocos2dx_studio_bone_getboneposition'.",&tolua_err);

#endif;}

(3)獲取骨骼動畫大小

cocostudio匯出來載入後的armature本身就是乙個node,直接getcontentsize就可以了。但是spine的動畫就不行,getcontentsize的結果為0,要使用別的介面,看下面。

2. spine動畫編輯器

(1)繫結粒子特效(跟隨骨骼的移動移動)

沒有辦法做到,但是可以通過獲取骨骼的位置之後,新增乙個特效到整個骨骼動畫的這個位置上,不過是不能跟隨骨骼一起移動的,一起移動看到有兩種方法,不過都沒有試過,就先記錄在這裡,想用再來試一下

* update函式每幀獲取骨骼的位置,把粒子特效重現設定位置

參考:[1]

* 重寫spine骨骼的的介面,每個骨骼和乙個node對應

參考:[2]

(2)獲取骨骼位置

同studio(因為lua沒有匯出函式介面),修改**,匯出lua,在類中增加乙個函式:

vec2 skeleton::getboneposition(const char* bonename) const

匯出後的c++**如下,同樣的可以自己寫:

int lua_cocos2dx_spine_skeleton_getboneposition(lua_state* tolua_s)

#endif

argc = lua_gettop(tolua_s)-;

)cclog();

;#if cocos2d_debug >= 1

tolua_lerror:

tolua_error(tolua_s,"#ferror in function 'lua_cocos2dx_spine_skeleton_getboneposition'.",&tolua_err);

#endif;}

(3)獲取骨骼動畫大小

這個比較重要!!不能使用介面getcontentsize,得出來的是0,但是skeleton類提供了另外乙個介面,也匯出了lua介面:

rect skeleton::getboundingbox () const 

vec2 position = getposition();

return rect(position.x + minx, position.y + miny, maxx - minx, maxy - miny);

}說明:

* 返回四個值:x, y, height, width

* 說明:(x, y)左下角的座標,相對於rootbone的原點;height, width就是整個骨骼動畫的大小

* rootbone可以理解為cocos裡面的錨點

* 【重要】在呼叫該介面之前,需要呼叫update介面初始化一遍資料,不然也是沒有資料的,參考[3]

3. 總結

(1)獲取位置都是需要新加介面的

(2)雖然spine編輯器要好用,但是對於程式來說spine繫結特效還沒有cocostudio方便

(3)cocostudio的位置最好不要直接拿來用,例如轉換為全域性座標,最好直接addbone的方式

(4)spine的座標也是直接骨骼動畫addchild

4. 參考

[1][2]

[3]

cocos2d x 骨骼動畫初步了解

上乙個專案用的是cocos2d x2.0.4的模板,並沒有很好的支援骨骼動畫,用的只是別人寫的骨骼外掛程式,但是並不是很好的與cococs2d匹配。現在終於可以看到有原配了 新增資源 ccarmaturedatamanager sharedarmaturedatamanager addarmatur...

cocos2dx動畫Animation介紹

一 幀動畫 cpp ccanimation animation ccanimation create 從本地檔案 系統中載入檔案到ccspriteframe中區,然後新增到ccanimation中 for int i 1 i 15 i sprintf szimagefilename,images g...

cocos2dx動畫Animation介紹

一 幀動畫 你可以通過一系列檔案,像如下這樣,建立乙個動畫 01ccanimation animation ccanimation create 02 從本地檔案系統中載入檔案到ccspriteframe中區,然後新增到ccanimation中 03for inti 1 i 15 i 04 06sp...