cocos2d-x 骨骼動畫方案

cocos2d-x上面可用的骨骼動畫方案並不多,列出如下:

  • Spine
    一個支援多引擎的骨骼動畫方案,功能強大,支援IK,為骨骼動畫而生。
    其檔案格式有json與binary兩種,cocos2d-x只支援json檔,這點要注意,有需要的話需要自行寫parser,之前看只有libgdx版本支援binary,現在狀況不太確定。
  • DragonBone
    以Flash為基礎,刀塔傳奇的骨骼動畫方案,個人是沒有操作過,不過開發prototype時倒是用第三方程式庫讀刀塔的人物來使用
    《刀塔传奇》骨骼动画查看器
    DragonBonesCPP
  • OPTPiX SpriteStudio
    個人感覺編輯器最強的一套,不過看似沒有IK。
  • cocostudio
    cocos2d-x自己的編輯器,只是實在不能算好用。

cocos2d-x中使用wxWidget

最近在研究製作cocos2d-x的編輯器,所以嘗試了一下怎麼跟gui程式庫作結合
這篇是測試如何跟wxwidget結合使用的初步測試

以下測試使用cocos2d-x 3.4 與 wxWidget 3.0.2

  1. 先準備一個新的cocos2d-x專案(或使用之前就有的)

  2. 下載wxWidgets Binaries
    下載頁面在http://sourceforge.net/projects/wxwindows/files/3.0.2/binaries/
    我抓的是wxMSW-3.0.2_vc120_Dev.7z

  3. 下載Headers
    下載頁面在http://sourceforge.net/projects/wxwindows/files/3.0.2/
    檔案為wxWidgets-3.0.2_headers.7z

  4. 解壓縮兩個檔案並放在同一資料夾當中
    該檔案夾應該會有include與lib兩個子資料夾
    我是放在D:\wxwidget_3_2\

  5. 專案屬性頁中 組態屬性>C/C++>一般>其他include目錄,加入

    1
    2
    3
        
    D:\wxwidget_3_2\include
    D:\wxwidget_3_2\lib\vc120_dll\mswud
  6. 專案屬性頁中 組態屬性>C/C++>前置處理器>前置處理器定義,加入

    1
    2
    3
        
    WXUSINGDLL
    HAVE_SSIZE_T
  7. 專案屬性頁中 組態屬性>連結器>輸入>其他相依性,加入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
        
    wxbase30ud.lib
    wxbase30ud_net.lib
    wxbase30ud_xml.lib
    wxexpatd.lib
    wxjpegd.lib
    wxmsw30ud_adv.lib
    wxmsw30ud_aui.lib
    wxmsw30ud_core.lib
    wxmsw30ud_gl.lib
    wxmsw30ud_html.lib
    wxmsw30ud_media.lib
    wxmsw30ud_propgrid.lib
    wxmsw30ud_qa.lib
    wxmsw30ud_ribbon.lib
    wxmsw30ud_richtext.lib
    wxmsw30ud_stc.lib
    wxmsw30ud_webview.lib
    wxmsw30ud_xrc.lib
    wxpngd.lib
    wxregexud.lib
    wxscintillad.lib
    wxtiffd.lib
    wxzlibd.lib
  8. dll檔設置
    看是要把dll copy到執行目錄或者在環境設置中設定PATH都可以

  9. 修改main.cpp

    這樣應該就可以了
    要注意的是我在HelloWorld中增加了一個singleton方法方便我取得HelloWorld物件作測試
    順利的話可以看到有兩個視窗,一個是原本的cocos2d-x執行視窗,一個是wxWidget產生的視窗
    在wxWidget視窗的按鈕按下去會新增一個Label到Layer中

Spine二進制檔轉json檔測試

由於cocos2d-x目前版本(3.4)仍然不能讀取spine 2.0後推出的binary格式(.skel)
加上自己沒有購買spine所以不能將binary檔匯入後再輸出為json格式
所以嚐試自己弄一個轉換的小工具
雖然最後沒有使用
但還是記載一下過程


由於spine官方目前有支援binary的runtime似乎只有libgdx
所以下面主要會以參考libgdx的方式來進行

  1. 使用eclipse新建一個java application

  2. 下載spine libgdx程式庫,放在src下

  3. 下載libgdx release版本(本次測試使用1.5.3)
    解開後將gdx.jar加入專案
    由於由於裡面有使用到nativecode
    打開gdx-natives.jar
    將需要的library取出(這裡使用的是libbdx64.dll)
    並在讀入該library

    1
    2
    3
    static {
    System.loadLibrary("gdx64");
    }

    如果有找不到lib的狀況要記得在VM Arguments中加入下面內容
    -Djava.library.path=D:\workspace_new\SpineBinary2Json\libs

  4. 新增libgdx的application並實作applicationListener
    Application我是使用LwjglApplication,所以要將gdx-backend-lwjgl.jar與gdx-backend-lwjgl-natives.jar加入專案裡
    之所以要這樣弄是因為我原本以為可以直接將TextureAtlas物件建立起來並生成SkeletonData
    後來發現會出現錯誤如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Exception in thread "main" java.lang.NullPointerException
    at com.badlogic.gdx.graphics.GLTexture.createGLHandle(GLTexture.java:197)
    at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:123)
    at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:103)
    at com.badlogic.gdx.graphics.g2d.TextureAtlas.load(TextureAtlas.java:244)
    at com.badlogic.gdx.graphics.g2d.TextureAtlas.<init>(TextureAtlas.java:236)
    at com.badlogic.gdx.graphics.g2d.TextureAtlas.<init>(TextureAtlas.java:231)
    at com.badlogic.gdx.graphics.g2d.TextureAtlas.<init>(TextureAtlas.java:226)
    at com.badlogic.gdx.graphics.g2d.TextureAtlas.<init>(TextureAtlas.java:216)
    at Main.main(Main.java:76)

    發現應該是gl物件未產出
    後來採最簡單的解法就是建立一個libgdx的application就會進行需要的初始化行為了

  5. 依照binary編寫json檔案
    這裡可以參照下面兩個格式的讀取行為
    https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonJson.java
    https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonBinary.java
    一開始採取從SkeletonData逆推的方式,但最後失敗
    卡在我無法從skin逆推attachment
    後來只好改採在SkeletonBinary讀取檔案的過程中同時將json建立起來的方法(直接修改SkeletonBinary.java)
    但由於這樣做可能會有版權的問題
    故這裡並不提供程式碼
    做起來應該是不難只是有點麻煩而已

簡易文件編碼轉換工具

原由

因為在工作上有需要將一些簡體編碼的程式碼文件轉換成utf格式,所以寫了這個小工具
該工具的作用:將目標資料夾下的指定副檔名文件的編碼改為utf
注意:目前無備份功能, 轉換前須自行備份


開發相關

####開發工具
python 2.7 + chardet + py2exe
gui部分為內建的tkinter
py2exe_dist.zip是我自行用py2exe轉換的執行檔
如要自行產生請安裝py2exe module以及chardet並在專案目錄下執行
python setup.py py2exe

####基本原理
用chardet這個module來測文件的編碼
測出後將其解碼再轉碼為utf

####特殊例子
在測試時有遇到一個特殊狀況
就是當文件編碼為gb2312
但裡面又含有繁體字元
此時要改用gbk編碼來處理

github:
https://github.com/hsienwei/file_encode_to_utf_converter

執行畫面