cocos2d, Box2D
http://antkillerfarm.github.io/
安裝
cocos2d和cocos2d-x雖然都是一家的產品,但前者是用python寫的,而后者是用C++寫的。
我試著在windows下安裝cocos2d,沒有什么問題。但在ubuntu下安裝的時候,運行demo,程序會出錯。看錯誤提示,錯誤是出在pyglet這個包里。由于一時間沒有好的辦法解決,所以就此終止,換用cocos2d-x。
安裝過程參見以下文章:
http://www.cocos2d-x.org/wiki/How_to_run_cpp-tests_on_Linux
要點摘錄如下:
$ cd $cocos2dx_root/build $ ./install-deps-linux.sh $ mkdir linux-build $ cd linux-build $ cmake ../.. $ make $ cd bin/cpp-tests/ $ ./cpp-tests新建工程
參見以下文章:
http://www.cocos2d-x.org/wiki/How_to_Start_A_New_Cocos2D-X_Game
要點摘錄如下:
$ cd cocos2d-x $ ./setup.py $ source ~/.bash_profile # may be ~/.bash_login or ~/.profile, depends on your environemnt $ cocos new MyGame -p com.MyCompany.MyGame -l cpp -d ~/MyCompany $ cocos run -s ~/MyCompany/MyGame -p linux教程
中文版教程
http://cn.cocos2d-x.org/tutorial/lists?id=105
英文版教程
http://cocos2d-x.org/programmersguide/
編譯系統初探
在tools/cocos2d-console/bin文件夾下有個cocos.py文件,這個就是編譯時所運行的命令。
其中run子命令在tools/cocos2d-console/plugins/project_run/project_run.py中。
compile相關的內容在tools/cocos2d-console/plugins/project_compile/project_compile.py中。
從py腳本可以看出在Linux平臺編譯代碼主要用到了Cmake。
調試
cocos命令有個選項-m可以用于選擇是Release還是Debug。
在Debug模式下,可以使用gdb和CCLOG。
當前的代碼(2015.2.21)在這里有個bug,-m實際上并不起作用。
現將我找到并解決問題的過程羅列一下:
1.首先判斷CCLOG是否好使。
按照官網教程所說,使用CCLOG之前需要定義COCOS2D_DEBUG=1。
最開始的時候,我沒有找到如何修改預定義宏的地方,但是在cpp文件開頭手動加上
#define COCOS2D_DEBUG 1
是可以在命令行中看到相關的調試信息的,這證明CCLOG是好使的。
2.使用gdb
將就著使用了CCLOG一陣子之后,終于遇到了一個問題,必須要用gdb才能解決。但是gdb找不到符號,因此無法斷點。
3.Cmake
硬著頭皮,打開CMakeLists.txt。
很快發現了CMAKE_CXX_FLAGS_DEBUG中已經定義了COCOS2D_DEBUG=1。那么問題很顯然是CMAKE_CXX_FLAGS_DEBUG沒有起作用所致。胡亂修改相關宏的定義之后,發現程序實際上確實用的是CMAKE_CXX_FLAGS。
那么問題就轉化為Cmake是如何選擇CMAKE_CXX_FLAGS_DEBUG和CMAKE_CXX_FLAGS的呢?
網上查了一下,發現可以用
cmake -DCMAKE_BUILD_TYPE=Debug
來切換相關的模式。
在tools/cocos2d-console/plugins/project_compile/project_compile.py中搜索cmake,果然看到cmake沒有指定CMAKE_BUILD_TYPE的值。于是修改之。一試,果然gdb和CCLOG都OK了。
4.尾聲
到
https://github.com/cocos2d/cocos2d-x/issues/
提交自己的修改。這也算是第一次為開源項目貢獻自己的代碼(以前主要是翻譯文檔),值得紀念一下。
我提交的patch在:
https://github.com/cocos2d/cocos2d-x/issues/10540
內存管理和對象生命周期
一開始,按照網上的例子順利實現了動畫效果。后來想了一下,加載圖片資源是一個比較耗時的過程,于是試著將加載圖片和顯示動畫的過程分開,沒想到卻遇到了各種問題。而且這些問題在官方自帶的demo中也找不到答案。因為demo中的例子基本都是在使用的時候,實時加載圖片資源的。
首先,嘗試使用全局指針,保存啟動階段加載的圖片的引用。但是這種辦法在運行的時候會出錯。研究了一下,發現是對象在調用之前就被釋放導致的。
cocos2d-x對象使用引用計數來進行內存管理。這里主要有三個方法ratain\release\autorelease。前兩者是簡單的引用計數加1、減1。最后一個是延時釋放的意思,用于保存返回值對象。
試想這樣一個場景,如果函數需要返回一個被new出來的對象,很顯然不能在返回之前就釋放該對象。那么如何釋放就成了個問題。
解決的辦法不外乎,要么讓用戶去釋放,要么就需要一種特殊的機制。autorelease會給對象做一個標記,讓它等到適當的時機予以釋放。這個時機就是每輪任務執行完成的時候。因此,這也解釋了全局指針保存圖片引用不成功的原因:雖然autorelease在微觀上來看是延時釋放,但在宏觀上來看,基本上也是用完就釋放的東西。
那么如何將加載圖片和顯示動畫的過程分開呢?
其實cocos2d-x中很多對象都有Cache類型的版本,例如Animation和AnimationCache、Texture2和TextureCache。在加載階段,我們將圖片保存在Cache中,然后在使用的時候,直接從Cache,而不是文件中創建相關的對象,這樣就可以達到相應的目的了。
Linux平臺配置工程
有些時候,為了打開或者關閉cocos2d-x引擎的某些功能,需要對工程做一定的配置。現將配置所需要修改的文件羅列如下:
1.CMakeLists.txt
CMakeLists.txt在代碼的不同文件夾中有很多個。其中以工程根文件夾以及Cocos文件夾下的CMakeLists.txt文件最為重要,尤其是后者。
2.base/ccConfig.h
小技巧匯總
1.改變背景顏色
以patch的形式給出的辦法:
+ class HelloWorld : public cocos2d::LayerColor - class HelloWorld : public cocos2d::Layer+ LayerColor::initWithColor(Color4B(155, 155, 155, 255)) - Layer::init()2.實現動畫結束之后觸發動作
sprite->runAction(Sequence::create(action, CallFunc::create(CC_CALLBACK_0(HelloWorld::AnimationFinished, this)), nullptr));void HelloWorld::AnimationFinished();3.循環動畫
sprite->runAction(RepeatForever::create(Sequence::create(action, action->reverse(), nullptr)));4.update操作
bool HelloWorld::init() { ... //每幀更新一次 方式一 scheduleUpdate(); //效果同上 方式兒 //schedule(schedule_selector(HelloWorld::update)); //每秒更新一次 schedule(schedule_selector(HelloWorld::hUpdate),1.0f); //停止默認的更新函數 對方式二沒用 //unscheduleUpdate(); //停止自定義的更新函數 對方式一沒用 //unschedule(schedule_selector(HelloWorld::update)); //停止所有的更新函數 對方式一和方式二都有用 unscheduleAllSelectors(); ... } void HelloWorld::update(float dt); void HelloWorld::hUpdate(float dt);cocos2d-x v3調用Box2D
cocos2d-x v3官方提供了CCPhysics物理引擎類,該類默認使用chipmunk物理引擎。雖然官方聲稱CCPhysics將支持Box2D。但從目前的代碼來看,Box2D應該還沒有集成進去。
http://discuss.cocos2d-x.org/t/cocos2d-v-3-how-to-enable-box2d/15597
這個網址有關于如何在cocos2d-x v3中集成Box2D的討論。現將要點摘錄如下:
1.base/ccConfig.h
#define CC_USE_PHYSICS 0
2.cocos/CMakeLists.txt
option(USE_CHIPMUNK "Use chipmunk for physics library" OFF) option(USE_BOX2D "Use box2d for physics library" ON)set(USE_CHIPMUNK false) set(USE_BOX2D true)target_link_libraries(${APP_NAME}box2d)示例代碼在:
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/HelloBox2d
Box官方論壇的奇遇
一般的網站都會采用驗證碼,來防止自動機器的頻繁注冊。但隨著人工智能越來越強,驗證的方法也越來越難。比如說最常見的圖片式驗證碼,現在是越來越花,就是人眼也很難看出是什么東西。。。
但這些都不算什么,直到我在Box官方論壇,遇到了這個驗證問題:
What is the dot product of (2, -1) and (10, 3) times the number of toes on my right foot?
我的英語不好,查了半天,才明白過來,原來是這個意思:
(2, -1) 和(10, 3)的點積:2 * 10 + (-1) * 3 = 17
2.the number of toes on my right foot
我的右腳的腳趾個數:5 (你要是六趾琴魔該咋辦。。。)
3.A times B
17 * 5 = 85
Box2D用戶手冊中文版
https://github.com/antkillerfarm/box2d/tree/master/Box2D/Documentation
翻譯正在進行中,歡迎共同參與。參與方式:直接給項目提一個Issue即可。
這個版本庫,我會隔一段時間同步一下Google Code上的官方庫,直到它搬到github為止。
(PS:Google Code即將關閉的消息,相信圈子里的朋友,應該都知道了吧。)
http://blog.csdn.net/complex_ok/article/details/6723390
cocos2d-x主循環
Application::run
Director::mainLoop
DisplayLinkDirector::mainLoop
Director::drawScene
總結
以上是生活随笔為你收集整理的cocos2d, Box2D的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬件杂谈
- 下一篇: ALSA(二), makefile, A