cocos2d-x游戏引擎基础知识介绍(一)

来源:互联网 发布:云计算的优缺点 编辑:程序博客网 时间:2024/05/18 23:53

cocos2d-x基础概念

cocos2d-x是一个跨平台的游戏引擎。游戏引擎是由一些提供常见的功能的软件组成。你可能通常把它称为API或者框架,但是在本教程中,我们称之为游戏引擎。游戏引擎包含很多能够使开发时间加速的部件,并且通常比自己写的引擎好。一个游戏引擎往往包含一些或者下面所有的部件:渲染器,2d/3d绘图,碰撞检测,物理引擎,声音,控制器支持,动画还有更多。游戏引擎通常支持多个平台,因此,使得开发游戏和部署到多个平台变得容易。
因为cocos2d-x是一个游戏引擎,它提供了一个简化的API,可以用于开发跨平台的移动和桌面游戏,通过封装一个内部功能强大且易用的API,用户可以专注于开发游戏而忽略它是如何实现的。cocos2d-x将尽可能的解决让用户觉得艰难的工作。
cocos2d-x提供了Scene,Transition,Sprite,Menu,Sprite3D,Auto等对象。游戏开发需求的所有都包含在内。

主要部件
或许学习cocos2d-x看上去很难,但是开始学习cocos2d-x是简单的。在我们深入学习之前,我们必须了解cocos2d-x使用的一些概念。cocos2d-x的核心是Scene,Node,Sprite,Menu和Action对象。观察任何你喜欢的游戏,你会发现所有这些部件都在一个或者其他的表格里!

让我们观察如下图所示的一个游戏界面:


你可以看到一个菜单,一些精灵(Sprite)还有标签(Label),这些在cocos2d-x中都有一个相应的对象。

导演(Director)

cocos2d-x运用了电影中导演的概念。导演(Director)控制着操作的顺序并且告诉必要的接收器做什么。试着把你想像成制片人,告诉导演要做什么。导演的一个常见的任务就是控制场景(Scene)的切换和过渡。导演是共享的且只能有一个。
下面是一个典型的游戏流程。


你就是游戏的导演,决定着游戏的事件发生、何时以及如何发生。

场景(Scene)

在游戏中,你可能想要一个主菜单,一些水平线和一个结束场景。那么如何将这些分散的部分组织到一起呢?场景(Scene)。电影都是由一些分散的场景组成的,如果我们将这个思想应用到游戏中,无论游戏多么简单,我们应该将他分成几个小的场景。
再让我们看看之前的图片:


这是一个主菜单,并且只有一个场景。这个场景由几个部分合理的组合在一起最终形成我们眼中看到的效果。场景是由渲染器画出来的。渲染器负责将精灵和其他的对象渲染到显示器中。为了更好的理解他,我们需要了解场景树(scene graph)的概念。

场景树(scene graph)

场景树是一个安排图形化场景的数据结构。一个场景树结构包含Node对象。


当你添加node节点、精灵和动画到游戏中,你希望渲染器按照你所设想的层次进行绘制,若实际画的和设想的不同,我们可以通过场景树查询。
场景树和其它的树一样,所以你可以沿着树的结构“行走”。cocos2d-x遵循有序行走算法。有序行走算法轨迹如下图所示:


我们试着将下面这个场景的场景树画出来


其场景树为


考虑的另一点是负Z次序的元素在树的左边,而正Z次序的元素在树的右边。当排列元素时要考虑这些。当然,你可以随意的添加元素,系统会根据可计数的Z次序自动的分类。
基于这种概念,我们可以把场景当做Node对象的集合。以下是上述场景的场景树


左边的场景由多个node对象组成。在cocos2d-x,可以用addChild()API来创建场景树

//adds a child with the z-order of -2,that means//it goes to the "left" side of the tree(because it is negative)scene->addChild(title_node,-2);//when you don't specify the z-order,it will use 0scene->addChild(label_node);//adds a child with the z-order of 1,that means//it goes to the "right" side of the tree(because it is positive)scene->addChild(sprite_node,1);

精灵(Sprite)

所有的游戏都有精灵(Spirte)对象。精灵是在屏幕中移动的可操控的对象。游戏中主要的角色可能就是Sprite。并不是所有的图像化的对象都是Sprite,运动的Sprite才是Sprite,否则就是一个node。
让我们指出下列场景的Sprite和Node


在游戏中,sprite很重要。写一个游戏平台,主要角色由一些有序图片组成,这就是sprite。
sprite很容易创建,可以设置position,rotation,scale,opacity,color等其他属性

//this is how to create a spriteauto mySprite = Sprite::create("mysprite.png");//this is how to change the properties of the spritemySprite->setPosition(Vec2(500,0));mySprite->setRotation(40);//sets both the scale of the X and Y axis uniformlymySprite->setScale(2.0);mySprite->setAnchorPoint(Vec2(0,0));
下面解释每个参数的意义

如果我们进行mySprite->setPosition(Vec2(500,0))操作,那么结果如下

注意到sprite的位置已经从原来的位置移动到设置的位置,如果我们现在想设置一个新的旋转,可以使用mySprite->setRotation(40)

可以发现sprite已经旋转到我们设置的角度。

如果我们现在设置一个新的比例,使用mySprite->setScale(2.0);

由于sprite是node的一个子类,所以也拥有anchor point(锚点)属性。你可以将锚点当做一个坐标,sprite的某个部分以此为原点。

设置锚点可以使用mySprite->setAnchorPoint(Vec2(0,0));

下面是几个锚点为不同参数时的效果对比图

红色的点代表锚点。

当给节点定位时锚点是非常有用的。甚至可以动态的调整锚点的参数模拟效果。

动作(Actions)

创建一个精灵并且添加精灵对象到屏幕只是我们需要做的一部分。作为一个游戏,我们需要将事物运动起来。Actoion对象是必须的。Actions允许node对象在时间空间中的转换。可以通过改变参数移动精灵并且在动作完成后执行一个callback函数,甚至可以创造一个动作序列在一个node节点上执行。可以改变node的属性:position,rotation和scale。动作有:MoveBy,Rotate,Scale。所有的游戏都使用动作。

下例展示Action

经过5秒,图中精灵将移动到第二幅图的位置。Actiond对象创建方法如下:

auto mySprite = Sprite::create("Blue_Front1.png");//move a sprite 50 pixels to the right,and 10 pixels to the top over 2 seconds.auto moveBy = MoveBy::create(2,Vec2(50,10));mySprite->runAction(moveBy);//move a sprite to a specific location over 2 secondsauto moveTo = MoveTo::create(2,Vec2(50,10));mySprite->runAction(moveTo);

序列和Spawns

序列(Sequence)是多个动作按照某种顺序的组合。可以将动作反向播放。看一看逐步移动精灵的示例序列的流程:

这个序列很好创建:

auto mySprite = Node::create();//move to point 50,10 over 2 secondsauto moveTo1 = MoveTo::create(2,Vec2(50,10));//move from current position by 100,10 over 2 secondsauto moveBy1 = MoveBy::create(2,Vec(100,10));//move to point 150,10 over 2 secondsauto moveTo2 = MoveTo::create(2,Vec(150,10));//create a delayauto delay = DelayTime::create(1);mySprite->runAction(Sequence::create(moveTo1,delay,moveBy1,delay,delay.clone(),moveTo2,nullptr));
这个例子按顺序运行了一个序列,那么,如何同时运行所有定义的动作呢?cocos2d-x运用了Spawn实现这个功能。spawn会同时运行定义的action,由于不同的动作时长不同,所以不会在同一时刻结束。
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,moveBy1,moveTo2,nullptr));


父子关系

cocos2d-x运用父子关系。这意味着父节点属性改变,子节点属性也会改变。

改变父节点的属性,子节点的属性也会一起改变

然而,不是所有父节点属性的改变都会影响到子节点。改变父节点的锚点属性将仅仅影响改变操作(scale,position,rotate,skew,etc...)并且不会影响子节点的位置。事实上,子节点总是被添加到父节点的(0,0)左下区。