cocos2d, Box2D

来源:互联网 发布:万网域名转出 编辑:程序博客网 时间:2024/04/28 10:31

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?

我的英语不好,查了半天,才明白过来,原来是这个意思:

  1. 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

0 0