15、Cocos2dx 3.0游戏开发找小三之Sprite:每个精灵都是上辈子折翼的天使

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30475395

Sprite

Sprite 可以说是游戏中最重要的组成元素;

它描述了游戏中的精灵,是 Node 的一个最重要也最灵活的子类。

Sprite 很重要,它代表了游戏中一个最小的可见单位,

同时Sprite 也很灵活,它装载了一个平面纹理,具有丰富的表现力,而且 可以通过多种方式加载。

如果说 Scene 和 Layer 代表了宏观的游戏元素管理,那么 Sprite 则为微观世界提供了丰富灵活的细节表现。

纹理

纹理就是一张图片,这张图片被精灵显示出来。纹理是3D游戏中绘制到物体表面上的图案;

Cocos2d-x使用了 3D 绘图库 OpenGL;

这样一来,我们既可以利用图形加速器提高绘图效率,也可以在游戏中加入 3D 变换特效,实现更绚丽的效果。

为了在 3D 环境中绘制平面图形,Cocos2d-x 只需在 3D 空间中垂直于视线的平面上绘制矩形,在矩形的表面使用纹理贴图即可。

创建小天使

游戏开发应用中,精灵是由一个纹理创建的;如果不对精灵做任何设置,精灵就是显示在屏幕上的一张图片。

通常精灵被置于层中,因此我们首选在层的初始化方法中创建精灵,设置属性,并添加到层中。

最常用的创建精灵的方式 是:使用一个图片文件通过使用 Sprite 的工厂方法 create 来创建精灵;

auto bg= Sprite::create("bg.png");

这个工厂方法包含一个std::string字符串参数,表示精灵所用纹理的文件名。

Sprite 会自动把图片作为纹理载入到游戏中,然后使用纹理初始化精灵。

精灵不但可以显示一个完整的纹理,也可以仅显示纹理的一部分。

通过Sprite* Sprite::create(const std::string& filename, const Rect& rect)就可以达到目的;

下面的代码使用两个参数的 create 工厂方法创建了一个精灵:

这个精灵使用"bg.png"作为纹理,但是仅显示纹理左上角 100×100 像素大小的部分:

auto bg2= CCSprite::create("bg.png", Rect(0, 0, 100, 100));

第一个参数是所使用纹理的文件名,第二个参数是一个Rect 类型的结构体,表示纹理中显示出来的矩形部分。

Rect(x,y,width,height)用来方便地创建一个矩形。

需要注意的是,纹理的坐标系中原点(0,0)位于左上角,原点向右是 x 轴的正方向,原点向下是 y 轴的正方向。

坐标系统以后再详细描述;

给小天使穿衣服

创建了精灵后,我们还需要把精灵安排在合适的位置,否则引擎也不能决定精灵将如何呈现出来。

诸如精灵的位置、方向、缩放比例等参数都是精灵的属性,我们在层中添加精灵之前,需要对它们进行恰当地设置。

下面的代码首先获取屏幕大小,然后根据屏幕大小把精灵置于屏幕中央:

Size size = Director::getInstance()->getWinSize();
Point pos = Point(size.width / 2, size.height / 2);
bg->setPosition(pos); 

我们可以看到,在这段代码中我们修改了精灵的 Position 属性。

Position 属性是一个 Point 类型的结构体,表示精灵在 层中的位置,它是精灵相对于层的坐标。

把精灵的位 置坐标设置为屏幕长宽的一半,就可以使精灵位于屏幕中央了。

精灵具有十分丰富的属性,我们可以利用这些属性让精灵灵活地呈现出来。

但实际上,这些属性不仅仅是精灵才拥有的,同时也属于Node。

Sprite 继承自 CCNode,因而也继承了它的全部属性。

天使来到了人间

社置完精灵的属性后,就该把精灵添加到层中了。

实际上 Sprite 与 Layer 都继承自 CCNode,向一个游戏元素中添加其他游戏元素的 addChild 是 Node 包含的方法,因此我们完全可以如同向场景中添加层一样,把精灵添加到层中;

this->addChild(bg);

其他常用成员

Sprite 还拥有以下常用的成员:

1、初始化方法

CCSprite 拥有许多种不同的初始化方法,可以方便地创建精灵。

使用这些方法,我们不仅可以通过图片文件来创建精灵,还可以直接使用纹理或精灵框帧来创建精灵。

a、使用图片文件

static Sprite* create(const std::string& filename);
static Sprite* create(const std::string& filename, const Rect& rect);

其中 filename为图片的文件名,直接传入图片文件相对于"Resource"文件夹的路径即可;

rect 为可选参数,用于指定精灵显示纹理的部分,它使用前面介绍的纹理坐标系。

b、使用 Texture2D

static Sprite* createWithTexture(Texture2D *texture);
static Sprite* createWithTexture(Texture2D *texture, const Rect& rect, bool rotated=false);

Texture2D 类型的 texture参数为纹理对象,可以使用 TextureCache 类的 addImage 方法把图片文件装载为纹理并返回,而
rect 与使用图片文件创建精灵的 rect 参数相同。

c、使用 SpriteFrame 创建

static Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame);
static Sprite* createWithSpriteFrameName(const std::string& spriteFrameName);

SpriteFrame 类型的 spriteFrame参数为纹理框帧。SpriteFrame 保存了一个 Texture2D 的引用与一个 Rect 来表

示纹理中的一部分。使用 SpriteFrame 初始化精灵时,也可使精灵显示部分纹理。

2、纹理相关的属性

Sprite 提供了以下与纹理相关的属性,用于获取或设置精灵内容。

Texture2D* _texture:获取或设置精灵所用的纹理。使用此方法设置纹理后,精灵将会显示一个完整的纹理。

Rect _rect:获取或设置纹理显示部分。此 Rect 采用纹理坐标,即左上角为原点。

SpriteBatchNode* _batchNode:获取或设置精灵所属的批节点。

3、纹理相关的方法

Sprite 提供了以下与纹理相关的方法。

virtual void setSpriteFrame(SpriteFrame* newFrame):设置显示中的纹理框帧,

其中 newFrame为新的纹理框帧,其代表的纹理或纹理的显示部分都可以与旧的框帧不同。

virtual SpriteFrame* getSpriteFrame() const:获取正在显示的纹理框帧。

virtual bool isFrameDisplayed(SpriteFrame *pFrame) const:返回一个值,表示pFrame是否是正在显示中的纹理框帧。

4、颜色相关的属性

Sprite 提供了以下与颜色相关的属性:

Color3B color:获取或设置叠加在精灵上的颜色。Color3B 由三个颜色分量(红色、绿色和蓝色分量)组成。默认为纯白色,表示不改变精灵的颜色,如果设置为其他值,则会改变精灵的颜色。

GLubyte Opacity:获取或设置精灵的不透明度。GLubyte 为 OpenGL 的内置类型,表示一个无符号 8 位整数,取值范围从最小值 0
到最大值 255。

bool isOpacityModifyRGB:获取或设置精灵所使用的纹理数据是否已经预乘 Alpha 通道。当包含 Alpha 通道的图片显示错误时,可以尝试修改这个属性。

郝萌主友情提示:

守护精灵,守护属于你的天使、、、

15、Cocos2dx 3.0游戏开发找小三之Sprite:每个精灵都是上辈子折翼的天使,布布扣,bubuko.com

时间: 2024-10-07 00:42:36

15、Cocos2dx 3.0游戏开发找小三之Sprite:每个精灵都是上辈子折翼的天使的相关文章

14、Cocos2dx 3.0游戏开发找小三之Scene and Layer:一场游戏一场梦

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30474393 Scene :场景 了解了Director 之后,接下来介绍 Scene 这个与它紧密相关的游戏组件. 通过之前的学习,我们已经了解了场景以及它在流程控制中的地位. 在 Cocos2d-x 中,Scene 定义了一个场景.场景只是层的容器,包含了所有需要显示的游戏元素. 因此相对于其他游戏元素,Scene 并没有提供什么特别的功能,就是一

16、Cocos2dx 3.0游戏开发找小三之Node:父节点、子节点、傻傻分不清楚

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30476133 Cocos2d-x 采用了场景.层.精灵的层次结构来组织游戏元素, 与此同时,这个层次结构还对应了游戏的渲染层次,因此游戏元素可以组织成树形结构,称作渲染树. Cocos2d-x 把渲染树上的每一个游戏元素抽象为一个节点,即 Node. 一切游戏元素都继承自 Node,因此它们 都具有 Node 所提供的特性. Node 定义了一个可绘制

17、Cocos2dx 3.0游戏开发找小三之内置的常用层:三剑客LayerColor、LayerGradient、Menu

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30477587 为了方便游戏开发者,Cocos2d-x 内置了 3 种特殊的 Layer: 具体如下所示: LayerColor:一个单纯的实心色块. LayerGradient:一个色块,但可以设置两种颜色的渐变效果. Menu:十分常用的游戏菜单. LayerColor 与 与 LayerGradient 这两个层十分简单,都仅仅包含一个色块. 不同

18、Cocos2dx 3.0游戏开发找小三之cocos2d-x,请问你是怎么调度的咩

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478251 Cocos2d 的一大特色就是提供了事件驱动的游戏框架, 引擎会在合适的时候调用事件处理函数,我们只需要在函数中添加对各种游戏事件的处理, 就可以完成一个完整的游戏了. 例如,为了实现游戏的动态变化,Cocos2d 提供了两种定时器事件: 为了响应用户输入,Cocos2d 提供了触摸事件和传感器事件: 此外,Cocos2d 还提供了一系列

6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你习惯快乐时,记忆里的不愉快就消失了. 游戏开始之前 经过之前的学习,我们已经可以开发一个最基本的 Cocos2d-x 游戏了,这个游戏包括一张背景图片和一个退出游戏的按 钮,但是这距离完成一个完整.实用的游戏还很遥远.在这一章节中,我们将首先抛开 Cocos2d,介绍游戏开发的基本概念,然后结合 Co

10、Cocos2dx 3.0游戏开发找小三之容器篇:Vector、Map、Value

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27705613 容器 3.0版本之前Cocos2d-x 引擎为我们提供了 CCArray. CCDictionary 等 Objective-C 风格的容器: 使用 Cocos2d-x 容器的一个重要原因在于 Cocos2d-x 的内存管理. 一般来说,被存入容器的对象在移除之前都应该保证是有效的, 但值得注意的是,在v3.0 beta版本中加入了数据结

7、Cocos2dx 3.0游戏开发找小三之3.0版本的代码风格

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已经多次提到 Cocos2d-x 源自于 Cocos2d-iPhone.Cocos2d-iPhone 是一个十分出色的游戏引擎,许多优秀的 iOS平面游戏都基于 Cocos2d-iPhone 开发,而它的实现语言是 Objective-C.因此,Cocos2d-x 也就沿袭了 Objective-C 的

8、Cocos2dx 3.0游戏开发找小三之3.0版本的内存管理

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十分有限,内存尤为宝贵,开发者必须十分慎重地利用内存,避免不必要的消耗,更要防止内存泄漏. 基于 Cocos2d-iPhone 的 Objective-C风格的内存管理是 Cocos2d-x 的一个特色. 把 Objective-C 的内存管理方式引入 C++,使得游戏开发的内存管理难度下降了个层次.

9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个经典的设计模式,指的是基类中只定义创建对象的接口,将实际的实现推迟到子类中. 在这里,我们将它稍加推广,泛指一切生成并返回一个对象的静态函数. 一个经典的工厂方法如同这样: Sprite* factoryMethod() { Sprite* ret = new Sprite(); //在这里对 ret