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?
我的英语不好,查了半天,才明白过来,原来是这个意思:
- the dot product of (2, -1) and (10, 3)
(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