原著是英文,本文只是一个个人的简单理解的中文的非正式翻译,供自己学习使用,参考需谨慎。
向原著的作者SlackMoehrle, Ricardo, Justin, Nite , Kai, Minggo, Wenhai, Tony, Yingtao, Rao 致敬。
cocos2d-x 是始于2010年的一个开源的跨平台的游戏引擎。它的强大足以让游戏开发者轻松的开发出各种壮观的游戏。(AFox:当然开发者本身也需要强大)
你为什么会喜欢上用cocos2d-x来开发游戏?
- 新式风格的C++API
- 跨平台——桌面版和移动版
- 你可以在桌面版开发和测试,然后打包成桌面版或者移动版的产品
- 完善丰富的功能性API文档包含了:精灵, 动作,动画,粒子效果, 转换,定时器,事件(触摸事件,键盘事件,加速计事件,鼠标事件), 声音, 文件IO, 持久操作,骨骼动画以及3D效果
2014-10-28初始版本
2014-12-22增加更多概念,持续更改
2015-01-05增加第9章,并做了其他的改进
如果你正在读这本书,那么你应该对cocos2d-x有一定的了解,并希望更多了解更多,好让你的游戏运行起来。这当然不是问题,我们现在就开始。
Coco2d-x是一个跨平台的游戏引擎。那么究竟什么是游戏引擎?先不用担心,所谓游戏引擎就是一种可以为大多数游戏提供通用功能的软件。这种概念也许和你以前听说的框架或者API等十分相似,但是在这本手册中我们使用游戏引擎这个术语。
游戏引擎包含了许多组成部分,当这些组成部分组合在一起的时候会大幅度提高我们开发游戏的效果并且缩短我们开发游戏的时间。通常一个游戏引擎包含以下部分:渲染器,2d/3d 图形处理,碰撞检测,物理引擎,声音组件,控制器支持,动画等。游戏引擎通常是支持多平台的,让开发者能够在多个平台上轻松的部署和开发游戏工程。
cocos2d-x是一款游戏引擎,为移动和桌面游戏开发提供了简练的API。通过学习这些功能强大而且简单易用的API,你可以将更多的精力放在你的游戏开发上,而不用担心底层技术实现的问题。cocos2d-x或多或少都能够帮助你分担开发的压力。
cocos2d-x 提供场景,转换, 精灵, 菜单,3d精灵,音频等对象。所有你在游戏开发中需要的都包含在内。
刚开始可能比较没有头绪,但是实际上Cocosd-x是十分简单的。在我们深入探讨之前,我们需要了解一些十分有用的概念。cocos2d-x的核心是 Scene,Node, Sprite, Menu 和Action 这些对象。随便看一下你喜欢的任何游戏,你都会发现这些组件。
下面这张图片也许看上去就像一个你曾玩过的流行游戏:
图1
你看到那些游戏组件了么?(接下来原文提供了张新图片指明组件等等,这里就不赘述了)
Cocos2d-x使用Director(导演)概念,游戏就像一场电影!Dierctor控制操作流程并且告诉每个组件该如何行动。把你自己当成制片人然后告诉导演该做什么!Director的一个常见任务是控制场景何时变换和以什么样的方式变换。Director是一个单例对象,这样我们就可以在代码的任何地方使用它。
下面是一个典型的游戏流程。Director 负责管理这些转换:
图2
你就是游戏的导演,你来决定你的游戏怎样运行!
在你的游戏中,你可能希望实现一个主菜单,一些关卡和结束场景。你该如何把这些分立的东西组织起来呢?你猜对了,就是Scene。当你仔细思考你一部电影的时候,你会发现它是由许多个分立的场景或者不同的故事线拼接而成。如果我们用同样的方法来处理我们的游戏,我们会发现不论多简单的游戏都需要有至少需要几个场景来组成。
就像是【图1】的一个主菜单,他是一个单独的场景。这个场景有几个不同的碎片组成,当他们组合在一起的时候就是我们所看到的结果。场景是由Renderer(渲染器,一个类)绘制出来的。Renderer的工作是在屏幕上绘制出精灵和其他的对象。为了更好的理解一点,我们需要先讲一点关于场景图形的东西。
一个场景图形一个结构体,这个结构体可以帮助我们将场景图形化。场景图形节点对象是保存值一个树形结构体中的。
图3
这看上去非常复杂,我肯定你会问如果cocos2d-x帮助你完成了这些,你又为什么要关心这些技术的实现细节呢?事实上这些对理解渲染器如何在绘制场景非常重要。一旦你在你的游戏中添加了一个节点,精灵或者动画,你肯定非常希望得到你期望的视觉效果。如果效果并不是你所期待的会怎样?如果你本来希望的在最前面的精灵却在显示在底层怎么办?回溯一下场景图形的渲染过程,你肯定会非常快得发现你错误在哪里.
由于场景图形是树状的,所以你可以一直“沿着树”向下走。Cocos2d-x使用顺序遍历算法。所说的顺序遍历算法是指,树的左支之后是根节点,再之后是右支节点。由于最左边的节点是最后渲染,所以它也呈现在场景图形的最上面。
图4
(原著中这一段是一个实例的讲解,这里不在做过的介绍)
基于这种概念,我们可以吧Scene看做是一组Node对象的集合,它使用z-order来布局。
在Cocos2d-x中,你可以通过addChild() API来构建场景图形:
//向场景添加一个z-order是-2的子节点,
//说明在这个节点会在树的左支上,因为z-order是负数
scene->addChild(title_node, -2);
//如果你不指定z-order,默认为0
scene->addChild(label_node);
//如果指定z-order是1,那么它就在树的右支上,因为它是正数
scene->addChild(sprite_node, 1);
你可能意识到了也可能没有,但是所有的游戏都有精灵。精灵使可以在屏幕上到处移动的对象。你可以控制他们。你玩的游戏中的主角很可能就是个精灵。你可能在想是不是所有的图形对象都是精灵?答案是否定的,精灵使那些你可以到处移动它们的对象。如果你不能够移动它,那么它只是个节点而已。
我们看一下线面这个图片,区分一下那些是精灵,哪些是节点
图5
精灵在任何游戏中都是关键。通常而论,你的游戏主角可能是用一个图片代表。那就是精灵Sprite。
精灵使很容易被创建的,而且他们拥有多种属性,比如位置,旋转角度,放缩,透明度,颜色等等。
//This is how to create a sprite
auto mySprite = Sprite::create("mysprite.png");
//this is how to change the properties of the sprite
mySprite->setPosition(Vec2(500, 0));
mySprite->setRotation(40);
mySprite->setScale(2.0);
mySprite->setAnchorPoint(Vec2(0, 0));
(原著中下面一段是对上面几行代码的贴图说明,这里将不再赘述)
在屏幕上创建一场景,然后向上面添加精灵仅仅是我们需要做的一小部分。游戏需要到处移动的对象,才是游戏!Action 对象是每个游戏都必须得部分。动作是的我们能够在时间轴上移动Node对象。你希望将一个节点从一点移动到另一个点,在移动结束的时候完成另外一个回调么?没问题!你可以创建一个Action的 Sequence(队列)让这个Node去执行。同样你可以改变Node的属性,比如位置,旋转角度和放缩,通过:MoveBy,Rotate,Scale。所有的游戏都使用动作。
(原著中两个贴图来演示下面代码的效果)
auto mySprite = Sprite::create("Blue_Front1.png");
auto moveBy = MoveBy::create(2, Vec2(50, 10));
mySprite->runAction(moveBy);
auto moveTo = MoveTo::create(2, Vec2(50, 10));
mySprite->runAction(moveTo);
我们希望屏幕上更多的东西运动起来。那么我们该如何运行多个动作呢?Cocos2d-x同样也实现了这些。
正如字面所表达的一样,Sequence 是将多个动画按一定的顺序运行。需要将Sequence逆向运行么?没问题!使用Cocos2d-x 可以直接实现,不需要额外的操作。
(原著中此处有一流程图,说明以下代码段)
auto mySprite = Node:create();
auto moveTo1 = MoveTo::create(2, Vec2(50, 10));
auto moveBy1 = MoveBy::create(2, Vec2(100, 10));
auto moveTo2 = MoveTo::create(2, Vec2(150, 10));
auto delay = DelayTime::create(1);
mySprite->runAction(Sequence::create(moveTo1, delay, moveBy1, delay->clone(), moveTo2, nullptr));
这段例子代码运行了一个Sequence,但是如何在同一时间内运行多个动作呢?Cocos2d-x中的Spawn实现了这个操作。Spawn会在同一段时间中播放所有指定的动作。一些动作需要的时间也许比其他的长,在这种情况下,这些动画不会在同一时间结束。
auto myNode = Node::create();
auto moveTo1 = MoveTo::create(2, Vec2(50, 10));
auto moveBy1 = MoveBy::create(2, Vec2(100, 10));
auto moveTo2 = MoveTo::create(2, Vec2(150, 10));
myNode->runAction(Spawn::create(moveTo1, moveBy2, moveTo2, nullptr));
为什么并行运行动画?(原作讲了一堆,这个不用讲也知道啊,这里就不翻译啦)
Cocos2d-x使用“父子关系“ 。这就是说当父节点的属性和变换也会应用到子节点上。
(原著在这里用一个精灵上add另一个精灵演示旋转和放缩变换是”父子关系的作用”,这里不赘述啦,代码页十分简单,不贴了)
小结:
我们接触了cocos2d-x的很多概念。深吸一口气,不要担心。只要专心投入,一步一步来就可以了。Cocos2d-x非常通俗而且不复杂,很快就能够学会。当然这需要练习和思考。记住当你遇到问题的时候可以向论坛寻求帮助。