2024年2月24日发(作者:)

目录

COCOS2d-X教程 ............................................................................................................... 1

第一章 环境..................................................................................................... 1

(一)vs环境搭建 .................................................................................................. 1

(二):如何添加新项目 ..................................................................................... 2

第二章 cocos2d-x的特性 .................................................................................... 5

第三章 制基本图元 ............................................................................................ 7

(一)、基本图形绘制 ........................................................................................ 7

第三部分:绘制图片 ........................................................................................ 11

第七章 在cocos2d-x中使用RTTI ...................................................................... 21

第八章 动作................................................................................................... 22

第一部分:动作概述 ........................................................................................ 22

第三部分:CCCallFunc家族(回调函数包装器) ............................................... 23

COCOS2d-X教程

第一章 环境

(一)vs环境搭建

1.安装visual studio2008

据说vs2008是cocos2d-x运行最稳定的版本。

官方下载地址:

/downloads/?na=41&SrcFamilyId=83C3A1EC-ED72-4A79-8961-25635DB0192B&SrcDisplayLang=zh-cn&u=http%3a%2f%%2fdownload%2fe%2f7%2f7%2fe777851c-c1a4-4979-86b3-6886953b32e9%

visual assist x自备,vs序列号自备。

2.安装cocos2d-x引擎

/wiki_extensions/forward_wiki_page/cocos2d-x?menu_id=1

从网站上下载cocos2d-x,并解压到自定义的路径下

3.测试helloworld

我们使用windows版的helloworld,

打开cocos2d-x引擎安装目录下的

将helloworld

设为启动项目

|

生成->调试->启动新实例,如图所示:

(二):如何添加新项目

1 安装应用程序向导

运行 ,cocos2d-x 应用程序向导就会自动安装到VS环境下

2 建立新项目

右键单击解决方案->添加->新项目->cocos2d-x-win32 application

注意:目录层级关系,缺省情况下,应该设置在cocos2d-x引擎安装的目录下,否则在编译链接时可能会找不到文件

然后,按照之前的步骤编译运行即可,运行效果同上一部分的图

第二章 cocos2d-x的特性

由于cocos2d-x是cocos2d-iphone的c++移植版本。所以我就直接翻译了cocos2d网站上的描述。

cocos2d for iphone 是一个用于构建2D游戏,demos和其他图形/交互应用程序 的框架。他基于cocos2d设计:他使用相同的概念,但是用objc替代了python。

cocos2d for iphone 是:

易用的:他使用友好的API,并伴有大量例子

快速的:他使用opengles实现并优化了数据结构

灵活的:他容易扩展,容易整合第三方库

免费的:开源,兼容闭源和开源游戏

社区支持的:有一个大的活跃的友好的社区

AppStore认可的:超过2500款AppStore游戏使用它开发,包括许多热卖游戏。

cocos2d for iphone 的特性:

场景管理(工作流)

场景间过度

精灵和精灵表

特效:Lens, Ripple, Waves, Liquid, Twirl, 等

动作(行为)

o

变换动作:Move, Rotate, Scale, Jump, 等

o

组合动作:Sequence, Spawn, Repeat, Reverse,等

o

灵活动作:Exp, Sin, Cubic, 等

o

混合动作:CallFunc, OrbitCamera

基本的菜单和按钮

集成物理引擎(box2d和chipmunk)

粒子系统

文本渲染支持(可变的和固定宽度字体)

纹理集支持

瓦片地图支持(TMX格式):

o

正交地图

o

等角地图(斜视角)

o

六边形地图

视差滚动支持

声音支持

Streak Motion support

渲染纹理支持

高分榜(cocos live)

Point based API: Supports Retina Display

触摸、重力加速器、键盘、鼠标支持

横竖屏切换、自动全屏支持

整合Pause/Resume

快速纹理:支持PVRTC textures, 8位 textures, 16位 textures and 32位 textures

基于opengl es

第三章 制基本图元

(一)、基本图形绘制

cocos2dx封装了大量opengl函数,用于快速绘制基本图形,这些代码的例子在,testsDrawPrimitivesTest目录下

注意,该方法是重载node的draw方法实现的,在智能机上,并不推荐直接绘制几何图形,因为大量的坐标编码会极大降低工作效率,应尽量使用Image。而且cocos2dx的渲染机制会造成前后遮挡问题,尤其是几何图形与图片等其他node混合绘制时。

第二部分:字符串绘制

1、cocos2dx的字符串绘制使用的是Label,cocos2dx并不直接支持在屏幕中绘制字符串(这是有道理的,因为我们不能直接把一个string做成一个节点,那样很难理解),如果要直接绘制的话,可以自己封装opengl函数(网上有很多例子,一般是用texture做)。其实最简单的绘制例子就是最开始的那个Helloworld。核心代码如下:建立一个CCLabelTTF并添加到子节点即可。

2、 绘制中文

CCLabelTTF*pLabel=CCLabelTTF::labelWithString("你好,世界", "Thonburi", 64);

注意:需要使用VS的另存为功能、将含有中文字符串的源代码,保存为UTF-8格式

手动保存比较麻烦,可以使用批量转换工具,如:boomworks的“文件编码转换工具”

3 文字锚点对齐与坐标计算

为了便于字体对齐,我们在很多游戏引擎中,都使用对齐锚点的功能,如j2me的anchor参数接口。

我们添加一个CCLayer,并重载他的draw函数,然后在draw中绘制十字线。

然后,我们重写绘制字体函数,将坐标修改为屏幕正中

可以看到,cocos2d默认锚点是node的中心。

如果要采用其他方式对齐,如左上角,可以使用getContentSize()获取CCSize。然后调整位置。

注意:中文字符获取宽高似乎有bug,在win32上面获得不了准确的数值。

注意:由于手机不同平台的适配方案不同,我们在写坐标时,不要使用绝对坐标值的加减,而应使用比例,乘除等方法。否则,开启适配函数后,坐标值会被映射成多个像素点,造成渲染错位。

第三部分:绘制图片

cocos2dx中并没有直接绘制图片的概念,我们一般是使用CCSprite。核心代码如下:

第四章 简单动画

为cocos2d-x是通用游戏引擎,为了保证兼容性和易用性,对动画机制作了最简单的设计(被做成了一个action)。但代价就是绘制动画的代码可能比较多,如果在实际开发中,一般都要选择自己封装。

这里只给出最基本的动画代码,具体使用要根据实际情况自己封装。最好自己开发一个编辑器。额外说一句,开发编辑器最好使用Qt,因为是跨平台的。

我们随便找一张动画资源图片,在66RPG里有很多,如图:

动画代码

注意,cocos2dx不支持使用clip的动画,另外,clip动画的开发成本很高,在智能手机这种大内存的平台是否适用(牺牲内存换开发速度么?),值得商量。

绘制效果如图:

相关的类关系图

简单过程是,使用CCTexture2D加载图片 ,用CCTexture2D生成对应的CCSpriteFrame(对应的就是帧),将CCSpriteFrame添加到CCAnimation生成动画数据,用CCAnimation生成CCAnimate(就是最终的动画动作),最后用CCSprite执行这个动作。

第五章 如何将win32移植到android

本文主要讨论如何将一个win32项目,移植到android上面,网上很多文章说的不一样,因为cocos2d-x的android项目配置方法好像修改过几次(好像?我没用过老版的),本文提供一种简单的方法。

第0步:配置android工程生成器

#1用ue之类的编辑器打开cocos2d-x目录下的

#2编辑这三个变量

第一步:建立android工程

#1运行cocos2d-x目录下的

#2然后首先输入包名和项目名。

注意有坑!这会删除和覆盖你在cocos2d-x安装目录下同名文件夹,如果你建立了一个同名项目(有的话一般是win32的)的话。

#3然后输入支持系统版本,android是向下兼容的。我这里写5,也就是android2.1-update1

然后项目就建立好了,你会发现在cocos2d-x安装目录下,多了个Test文件夹

第二步:导入代码和资源

#1打开Test

#2我们看到有三个文件夹,其中android就是android项目文件夹

把你win32项目里的Classes拷贝到当前Classes下(注意删除Classes里面的多余的cpp和h,就是项目自动生成的那些)

把你win32项目里的Resources拷贝到当前Resources下(注意删除Classes里面的多余资源,就是项目自动生成的那些)

第三步:编辑mk

#1注意有坑!android项目里有一大堆mk,而且不同的教程说的mk位置还不一样!你编辑错误了,是无效的(跟你实际使用的mk也有关系)。在这个例子中,我们使用的是Classes下的mk

#2要修改的地方如下

LOCAL_SRC_FILES:在这里加入你Classes下的cpp文件

LOCAL_C_INCLUDES:在这里添加你使用的库的h文件,如果有的话

LOCAL_LDLIBS:在这里添加你使用的库的lib文件,如果有的话

这里我使用的是,之前的“是男人就坚持20秒”那个例子的代码

注意,第三方库和额外的库都是要自己添加的。默认生成的mk里没那么全。

第四步:运行build_脚本,编辑so库

#1运行你的cygwin安装目录下的

#2进入当前Testandroid路径下

注意cygwin下的命令写法,和win下不同

#3运行build_脚本

头一次编译会长些,当然图省事你也可以把自己及其他的android项目里面的so复制进来(应该可以把,哈哈哈)

编译完然后你会看到,在android文件夹下面生成了一大堆东西。

第五步:导入到eclipse

#1注意有坑!使用新建android项目下的Create project from existing source,如果你使用的是“导入”有可能无法识别。

#2导入成功,然后就是编译执行了。cocos2d-x作者推荐用sh编译so,再用eclipse编译成apk。

其他注意事项:

#32项目对资源文件大小写不敏感,android敏感,所以如果出错了,把给你提供资源的人给打一顿

#2.可以直接把win32项目里的工程文件,以及win32文件夹复制进来,项目就可以和VS共用了,当然cocos2d-x也是这么干的

#用的是gb码,android用的是utf-8,解决方法在vs下用iconv,另外最好全都转成utf-8,网上有很多编码批量转换工具

#d的横竖屏问题错乱,在android下把

pDirector->setDeviceOrientation(kCCDeviceOrientationLandscapeLeft);

这句用条件编译宏给关掉

六、外篇

地图滚动

读了cocos2d-x手机游戏开发作者给的源代码,感觉里面那个地图滚动代码,不合自己口味,

于是拿以前开发时用的代码给改掉了。

x轴和y轴是分别计算的,首先求出候选值,然后用把它限制在可行域中,然后就是偏移了。我觉得这个代码是比较清晰的。

上面用到的模板函数如下:

获取系统毫秒时间

知易的教程中使用的是UITouch类,这个类是iOS的。因此在cocos2d中无法使用。因此只能自己手动判断两次单击之间的时间间隔,以此来确定双击。

所以,我们需要获得系统时间,本来想用标准C里面的time,但是一看返回的是秒,而不是毫秒(双击一般时间间隔是250ms~300ms)。群友天天(375539155) 提供了一个函数,可以获取系统毫秒数。

接下来就是记录每次的时间,然后判断时间差,就可以进行想要的操作了。

坑爹的矩形碰撞

我们找到计算矩形相交的代码

然后我们随便打开一个函数

问题找到了,比如,我声明一个x=0,y=0,w=10,h=10的矩形

那么他的四个极限位置应该是

minX=x

minY=y

maxX=x+w-1

maxY=y+h-1

但是他这里没有-1。所以造成最后结果大了一个点。这个问题,大家尤其要注意。所以在声明的时候,要自己-1,比如上面的矩形就要声明为:0,0,9,9

第七章 在cocos2d-x中使用RTTI

有时,我们在开发中需要使用RTTI。什么?写的好的代码可以避免使用RTTI。不一定。什么情况下使用RTTI,一种很常见的例子,就是,我使用了一个父类指针容器,但是持有的是子类指针。并且,我需要调用子类指针的接口。这种情况下,就必须用RTTI了(或其他替代方案)。

使用RTTI的步骤。

#1.打开 项目目录

#2.

注释APP_STL := stlport_static

添加两行:

APP_STL := gnustl_static

APP_CPPFLAGS += -frtti

解释:NDK中默认关闭RTTI,所以使用-frtti开启。NDK中附带的stlport库不支持RTTI(也不支持异常)。所以,我们要将其替换为GNU的STL库。(NDK一共有四个STL库,system,stlport静态,stilport动态,gnu静态)

#3.

然后,使用cygwin控制台进入项目目录,clean一下。(最好直接删项目里的lib和obj文件夹,因为你改了编译选项,clean也是删不干净的。)

重新执行编译sh脚本即可

第八章 动作

第一部分:动作概述

动作可以说构成了cocos2dx的精华(你看动作类有多少子类就知道了)。

动作是什么?动作可以理解为指令,这些指令由节点执行。

动作由节点(node)执行,该节点执行动作的时候,他的所有子节点跟着执行,这一特性是非常有用的。

执行动作的代码非常简单,先生成,然后让节点执行

CCAction及其子类的继承树非常庞大,我们需要一个一个介绍。

CCAction及其子类简图

||

第二部分:CCActionInstant家族(立即动作)

立即动作就是不需要时间,马上就完成的动作。立即动作的共同基类是CCActionInstant。CCActionInstant的常用子类有:

CCFlipX:X轴翻转、CCFlipY:Y轴翻转

CCHide:隐藏、CCShow:显示、CCToggleVisibility:切换可视性

CCPlace:放置到一个位置

CCCallFunc家族:回调函数包装器

这些类的使用非常简单,就不说了

第三部分:CCCallFunc家族(回调函数包装器)

CCCallFunc是CCActionInstant的子类,是非常重要的一个类族,就是适配器。用大白话说,就是做了一层包装,把函数包装成动作,这样你在执行动作的时候,就可以执行函数了。听起来很怪异吗?为什么不直接执行函数呢?这是因为执行条件不同。

我们看个例子:玩家死亡动画(也是个动作)播放完成后,结束游戏。(该例子来自于炸弹人,有改动)

其他的代码先不用管它,我们重点是:

cocos2dx中,一般对象都是采用静态方法生成的,我们看这个函数签名:

pSelectorTarget是指这个函数的执行对象,这点不要和动作的执行节点搞混,两者可以是一个也可以不是一个。比如这里,我用的是this,那么动作的执行节点和函数的执行对象就是同一个。

下面是CCCallFunc::execute()的源码,m_pSelectorTarget就是之前在签名里绑定的pSelectorTarget,而该动作的执行节点则是另外一个变量m_pTarget

第四部分:使用CCCallFunc家族的类

CCCallFunc家族一共有四个类。这是四个类对象的静态生成函数:

我们在写的时候,就直接用这四个生成相关的动作对象,然后让节点执行就行。

但是要注意这四个类,分别对应的是四种不同的函数接口,也可以说是他包装了四种不同的回调函数。这四个回调函数的不同主要是参数表的不同。(貌似是废话)我们来看这四个回调函数的类型定义

这四个玩意要解释清楚比较麻烦,这是用typedef定义了类成员函数指针。如果你对C++不熟悉,你不需要搞懂具体什么意思,但你必须保证你的函数签名和这四个其中之一一致。

也就是说,你自己写的回调函数签名,看起来像这样:

你可以在回调函数里操作这些被传进来的参数。

另外,在用静态函数生成动作的时候,你需要使用一个宏,来帮助转换函数指针类型,就是上面那个callfunc_selector,因为有四种类型的回调函数,所以也就有四个类型转换宏

最终,我们写出来的代码看起来像是这样的: