Antkillerfarm Hacking V7.0

cocos2d, Box2D

2015-02-21

安装

cocos2d和cocos2d-x虽然都是一家的产品,但前者是用python写的,而后者是用C++写的。

我试着在windows下安装cocos2d,没有什么问题。但在ubuntu下安装的时候,运行demo,程序会出错。看错误提示,错误是出在pyglet这个包里。由于一时间没有好的办法解决,所以就此终止,换用cocos2d-x。

$ cd $cocos2dx_root/build
$ ./install-deps-linux.sh
$ mkdir linux-build
$ cd linux-build
$ cmake ../..
$ make
$ cd bin/cpp-tests/
$ ./cpp-tests

新建工程

$ 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即将关闭的消息,相信圈子里的朋友,应该都知道了吧。)

2015.6

整个手册,我大概花了1个月的时间(2015.3)翻译完成。不久我就发现作者Erin Catto已经将项目迁移至github:

https://github.com/erincatto/Box2D

于是给他提了一个添加手册中文版的Pull request(2015.4)。Erin Catto在2015.6的时候,接受了这个Pull request。于是我翻译的文档便正式成为了官方文档。这大概也算是我对开源社区最大的贡献了。

参考

http://blog.csdn.net/complex_ok/article/details/6723390

Box2D v2.1.0用户手册翻译

cocos2d-x主循环

Application::run

Director::mainLoop

DisplayLinkDirector::mainLoop

Director::drawScene

游戏资源

https://opengameart.org

https://game-icons.net/

2019.8

随着对python的熟悉,以及python本身生态的完善,cocos2d的安装已经比较简单了。

pip install cocos2d

cocos2d-x的编译步骤变化不大,只是好多第三方库已经prebuilt好了,用起来更方便了。然而,由于官方对ubuntu的支持才到14.04,因此有些prebuilt库实际上是用不了的,需要用新版本ubuntu软件仓库中的同名文件替换之。

Unreal Engine

代码下载指南:

https://github.com/EpicGames/Signup

UE的代码仓库是个私有库,需要注册Epic账号并与github账号关联才能下载。目前仓库大小为13GB左右(2021.12)。

安装:

./Setup.sh
./GenerateProjectFiles.sh
make

这里需要下载一个12GB左右的Mono包。脚本已经设置好并行编译,所以不需要make -j4

参考:

https://zhuanlan.zhihu.com/p/196363738

UE4:从入门到入坟

https://www.cnblogs.com/timlly/

一个UE的专栏

Fork me on GitHub