3

cocos2d, Box2D

 2 years ago
source link: http://antkillerfarm.github.io/technology/2015/02/21/cocos2d.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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了。

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

OpenWrt配置篇(续)

大多数情况下,我们并不需要亲手编写OpenWrt模块,因为日常使用中的绝大部分功能,OpenWrt项目都提供了相应的扩展包。因此,如何寻找、安装扩展包,就成为一个经常性的问题。

官方扩展包可以在代码根目录下的feeds.conf.default文件中找到。

从这里可以看出,OpenWrt项目早期的代码托管在openwrt.org下,而最近的开发已经迁移至github。因此,如果有的包在源代码中没有看到的话,可以到openwrt.org下碰碰运气。

一个软件包可以生成独立的ipk安装文件(Modularizes),也可以直接打包进img中(Built-in)。这个生成选项在make menuconfig的选项菜单中,选择Y就是Built-in,选择M就是Modularizes。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK