CocosBuilder的Cocos2dx-lua绑定方案

CocosBuilder的Cocos2dx-lua绑定方案

前情提要

似乎写每一份代码,每一篇文章,都有些理由,所以忍不住要写个前情提要。

CocosBuilder虽然已经2年没有更新了,已经被SpriteBuilder所取代,但是由于我们早期的项目使用的就是CocosBuilder,而SpriteBuilder增加的功能并没有特别出彩,没有足够的理由让我们抛弃CocosBuilder,于是沿用下来。但是如果拿不开源的CocosStudio来比较,我还是推荐使用CocosBuilder

据我所知,最早让Cocos2dx的lua版本支持CocosBuilder的,是这个项目:LuaProxy。不知道为什么,CocosBuilder官方库只做了对js的支持,甚至做了html5的支持,却完全没有考虑对lua的支持。而LuaProxy就是建立在官方对js支持的基础上,做了lua的实现。但是读完CocosBuilder中js方案的实现,以及Cocos2dxCCBReader对js方案的实现,我居然产生了,这不可能是一个人写的吧,这种想法。因为js方案与cpp方案的思路完全不同,如果是同一个人做的,这也太蛋疼了吧?(不过我没有看js那边的使用方法,只是按照LuaProxy的使用方法去理解的。)

cpp方案用了一种非常优雅的方式,加载的过程中,自定义类需要有一个对应的Loader,使用字符串来索引Loader,以帮助CCBReader生成对应的类的实例。

LuaProxy的方案的缺陷

  1. 首先最不能忍的,就是用了一个全局table ccb来替代cpp中的registerCCNodeLoader,看起来好像可以解决,但是必须事先把所有需要绑定的Controller的名字写入这个ccb里面,也就意味着很可能许多不需要的代码会被提前加载,对于lua这样的脚本语言来说,这完全是不必要的代价。
  2. 全局ccb也带来了另外一个问题,同屏加载多个相同ccbi时,动态更新数据的问题。
    • 试想这种情况:你用CocosBuilder的粒子编辑器做了一束烟花,但是粒子贴图要在几种里面随机,这个需要在代码里面实现。于是你把这个CCParticleSystemQuad绑定到了ccb的一个table中。然后需求变了,策划需要同时放多个烟花,于是同时出现的烟花,只有最后一个的贴图可以随机了。因为他们共享同一个全局ccb的table,后加载的覆盖了前面加载的。这里只是举一个简单的例子,实际应用可能比这个情况复杂得多。
  3. 嵌套CCBFile时,无法对子CCBFile做操作的问题。可能子CCBFile绑定了某个lua对象,有一些函数可以调用,有一些成员变量可以使用。但是全在全局ccb里面,父节点根本不知道子CCBFile对应全局ccb的哪个对象。

解决方案

对于lua这样的脚本语言来说,完全可以在加载ccbi的过程中,动态加载需要的lua文件,进行绑定,我们需要做的只是设定一个绑定规则。然后对CocosBuilder做一些小改动,让publish的时候,同时生成lua文件,那整个开发流程将大大被缩短。

So,为了解决上面的3个问题,我做了两件事

  1. 修改了CCBReader读取的一些方法,提供给lua读取嵌套CCBReader的方法。并且重写了lua读取ccbi的代码。
  2. 修改了CocosBuilder的源代码,让它在publish的时候,直接生成对应的lua文件。

准备工作

1.下载以下cpp文件,覆盖掉cocos2dx的相应文件,然后重新编译Runtime

PS: 值得注意的是,我修改的是cocos2dx 3.2,不确定覆盖更高或者更低的版本会不会出问题,如果不是3.2的用户,可以查看这个commit,自行修改相应代码。

2.下载以下lua文件,放到lua项目的src对应目录下

3.获取修改过的CocosBuilder

有2个方法

  1. 从Github clone源代码自己编译:https://github.com/jennal/CocosBuilder
  2. 下载我编译好的版本:https://github.com/Jennal/CocosBuilder/blob/master/Release/CocosBuilder.app.tar.gz?raw=true

PS: 值得注意的是,由于我们的项目使用的默认设计尺寸是1200×800,所以代码中的缩放比例都是针对这个分辨率的。修改也不难,在这里:CocosBuilder/ccBuilder/ResolutionSetting.m,把顶部的两个define改成你自己要的设计尺寸就行了。

使用方法

改完Cocos2dx的框架代码,下载了lua代码,有了Cocosbuilder的修改版,准备完成,正式进入使用阶段。

1.ccb文件制作

ccb文件的制作基本没有什么特别,只是有几个点需要注意:

  1. Publish Settings里面多了个选项,记得勾起来。新建项目,默认是勾的。
    Publish Settings
  2. 文件名与该文件的Controller名,必须保持一致,这是为了简化接口,也为了让代码与设计统一
    文件名与该文件的Controller名,必须保持一致

2.代码绑定

生成的lua文件已经包含了一些注释,几乎不用有太多额外的代码,就可以很容易地绑定ccbi文件与lua类。

下面讲解几个需要注意的地方

  1. CCBLoader:setRootPath的两个参数

  1. 生成的lua文件的ctor相当于cpp中使用ccbi的onNodeLoaded,换句话说,代码执行到这里的时候,这个节点的子节点以及绑定都应该已经完成,可以放心使用了。可以在这里做一些初始化数据的工作。
  2. 创建ccbi节点的方法

示例下载

https://github.com/Jennal/CocosBuilder/blob/master/Sample/CCBSample-lua-binding.tar.gz?raw=true

感谢

虽然LuaProxy的方案并不完美,但也为我的改进铺平的道路,在这里感谢LuaProxy的作者shawnclovie

C語言教程 — (一)環境配置

市面上的C語言書很多,我也看過一些,但始終沒有找到很好的范本,要么誤人子弟,要么不適合入門。這也是為什么那么多人說C語言難學,甚至有人說至少需要1年才能精通C語言。雖然我不知道他所謂的精通是達到什么程度,我不敢自稱精通,但至少引導入門的水平算是達到了吧。我現在寫的是入門級的教程

介紹一門語言,不得不講一下這門語言的歷史。C語言發布的時候并不是作為一門編程語言的研究成果,它只是作為一個偉大產品--Unix被發明的附屬物。是的,它是在Unix編寫的過程中,為了簡化編碼,加強邏輯性編程的一個工具。算是一個誤打誤撞的產品而流行至今,算是一個奇跡。但它的出現,為編程世界打開了一道新的大門,要知道當時的程序員寫的是最接近機器碼的匯編。C語言的出現,讓他們可以使用更接近人類語言和語法的代碼去同機器的世界溝通。

想知道更多關于C語言的歷史,可以查看: http://www.livinginternet.com/i/iw_unix_c.htm

接下來,簡單的介紹一下編程語言是怎么一回事。這要從計算機程序運行的方式說起。普通的應用程序都是運行在操作系統之上的。當然,操作系統也是一個程序,它作為普通程序的底層支持,溝通應用程序、計算機硬件還有使用計算機的用戶,在三者之間建立起聯系,作為三者溝通的橋梁。對于操作系統的介紹,這里略去10W字,不作為本文的內容。 我們要學習的是用編程語言來編寫應用程序。

這里介紹幾個概念:
1. 源代碼:我們使用編程語言,寫出的智慧的結晶
2. 可執行文件:可以直接在操作系統之上運行的應用程序 我們的目標是,寫出源代碼,并把它轉化成為可執行文件。

從源代碼到可執行文件的過程,叫做編譯。從事編譯這項工作的程序,叫做編譯器。C語言問世至今,已經有30幾年的歷史了,所以C語言的編譯器也有很多各種各樣不同的版本。C語言本身也出現了很多分支,這些分支當然有各自的編譯器來支持。我想推薦一個自認為最正統的分支:ASNI C99標準[1]。很好的實現這個標準,并被廣泛使用的編譯器是gcc[2]

終于要進入正題了。下面我們了解一下怎么在自己的機子上配置C語言編程的開發環境。鑒于大多數初學者都是使用Windows系統,這里只介紹Windows下的編譯環境配置。

我們需要的有:
1. 編譯器、系統頭文件、引用庫
2. 集成開發環境(IDE[3]

很幸運,Dev-cpp為我們提供了完整的1,至于2,我推薦Eclipse-cpp。
他們的下載地址:
Dev-cpp:http://www.bloodshed.net/dev/devcpp.html
Eclipse-cpp:http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo/R/eclipse-cpp-galileo-win32.zip
Dev-cpp需要安裝在非中文目錄下,建議直接安裝在D盤根目錄下。D:\dev-cpp\ 安裝完成以后,右鍵單擊我的電腦-屬性-高級-環境變量,在系統變量里面找到Path,單擊編輯,在變量值的最后面加上:

也就是你安裝的目錄下面的bin目錄,注意,千萬別把原來的給刪了,后果很嚴重哦。保存好之后,點開開始菜單-運行,輸入:

在打開的黑色DOS窗口里輸入:

如果出現gcc的版本號,說明剛才的修改成功了,如果提示gcc不是命令,說明剛剛沒設置成功,請仔細查看以上步驟,重試。 接下來安裝Eclipse-cpp,其實不用安裝,找個地方解壓就行了。
然后運行Eclipse.exe。第一次運行會出現:

第一次打開Eclipse

第一次打開Eclipse


這個是設置工作目錄,也就是你創建工程和源代碼默認的根路徑。建議改成圖中的地址,這樣就把工作路徑設置成你安裝Eclipse的目錄下的workspace目錄下了。這樣做的好處是,以后可以直接打包整個Eclipse文件夾到別的電腦,而保持工程文件的完整性。以后每次打開Eclipse都會彈出這個窗口,詢問工作目錄,如果嫌麻煩,可以把下面的復選框勾上,這樣以后就不會再詢問了。
點擊OK,進入歡迎界面:
Eclipse的Welcome界面

Eclipse的Welcome界面

關掉歡迎界面,就見到Eclipse的主界面啦,如圖所示:

Eclipse主界面

Eclipse主界面

右鍵單擊Project Explore下面的空白處,選擇New-C Project,新建一個C工程,在彈出的窗口中選擇Hello World ANSI C Project。然后給你的第一個工程起個名字,輸入上面的Project name中。單擊Finish,第一個工程就創建成功啦。
現在可以在Project Explore中看到你剛剛創建的工程了。這個工程包含四個東西:
1.Binaries:生成的二進制文件
2.Debug:用于編譯輸出的文件夾
3.Includes:系統頭文件
4.src:我們的源文件,這里會有一個現成的文件,雙擊打開它。

用以下內容替換原來的內容:

然后單擊綠色的像播放一樣的按鈕Run(以下簡稱Run按鈕),右邊的黑色小箭頭,選擇Run Configurations…,這里我們要進行運行程序的配置。
雙擊左邊列表中的C/C++ Application,新建一個運行配置。現在把視線移到右邊。單擊Project右邊的Browse,由于我們現在只有一個工程,所以就選中這個唯一的工程。
再單擊C/C++ Application右邊的Search Project,此時也只有一個二進制文件可以選。Apply,我們的設置完成了,單擊Close關閉浮動窗口。
在下面一排的標簽,我們選中Console,也就是命令行。命令行是系統的標準輸入輸出。至于什么是系統的標準輸入輸出,將在下一節中講解。
現在直接單擊Run按鈕,如果Console中出現了應該出現的文字,那說明環境配置成功了。 至于應該出現什么文字呢?試試就知道了。

PS: 安裝Dev-cpp和Eclipse的這一段,我自己沒有測試過,是憑著自己以前的記憶寫下來的,可能會出現一些細節性的問題。沒辦法,我沒有寬帶,剛剛重裝過的電腦里也沒這兩個軟件。我的網速更沒辦法下載這兩個軟件。如果遇到什么問題,請留言。我明天去公司把這兩個東西載下來,再修正一下上面這段。

附錄:
[1] ASNI C99標準:American National Standards Institute C99
[2] gcc:Gnu C Compiler
[3] IDE:Integrated Development Environment