首页 > 代码库 > iOS_31_cocos2d_CCSprite

iOS_31_cocos2d_CCSprite

创建精灵



CCSprite精灵是游戏开发中的一个核心概念。

精灵也称为游戏对象,它可以用来表示游戏中的任何物体,比如路灯、桥梁、甚至是一个背景图片、一段文字。

CCSprite可以说是在cocos2d中最常用的一个类,"精灵类",它能够以图片的形式将精灵显示到屏幕上。


CCTexture2D纹理】是游戏开发中另一个核心概念。

纹理其实就是用来描述物体表面细节的图形,也称为纹理贴图。

把纹理按照特定的方式映射到物体表面上的时候能使物体看上去更加真实。

我们将纹理映射到屏幕上即可显示对应的图形。







快速创建精灵的各种方法



1.创建精灵最简单的方式就是给精灵指定一张图片文件,

即如下方法:


cocos2d会利用这张图片生成纹理对象(CCTexture2D)并保存到纹理缓存库中(CCTextureCache单例),

用key--Value方式保存

2.创建精灵的方式也可以先通过图片的filePath生成纹理,再通过纹理创建精灵


纹理对象(CCTexture2D)内部其实是调用单例的纹理缓存(CCTextureCache)将图片添加到缓存库中,



3.最终由精灵来控制  纹理  显示在屏幕中的位置Position。  



为了保证能够正常读取图片资源,先把图片文件放在Resource或Supporting Files文件夹中


运行效果:



其他常用设置

1> 设置精灵的 不透明度 【opacity

// 半透明
sprite.opacity = 125;

opacity 不透明度,其取值范围是0-255,

0代表不透明度为0,即完全透明,不可以被看见,

255代表不透明度是255,即完全不透明,即完全可见


2> 给精灵着色

// 着色为:红色
sprite.color = ccc3(255, 0, 0);

3> 水平镜像,只会翻转该精灵的纹理,并不会翻转该精灵所有的children,并且该翻转 并不会翻转【锚点】

如果 想要翻转【锚点】及其所有的children,可以使用

_sprite.scaleX *= -1;


sprite.flipX = YES;

4> 垂直镜像

sprite.flipY = YES;


果flipX和flipY一起使用,先水平翻转,再垂直翻转

sprite.flipX = YES;
sprite.flipY = YES;


2.可以指定一个范围,表示只想加载图片文件中的某个矩形区域

这张图片的原大小是223 × 224 pixels


只加载了图片左上角112 × 112 pixels的区域


3.创建精灵的时候,也可以直接传入一个纹理对象(CCTexture2D)

// 先通过图片,创建一个2D纹理对象
CCTexture2D *texture2D = [<span style="font-family: Arial, Helvetica, sans-serif;">CCTexture textureWithFile:filePath];</span>

// 再通过传入2D纹理对象,构造生成精灵
CCSprite *sprite = [CCSprite spriteWithTexture:texture2D];


CCTextureCache(纹理缓存)是专门用来缓存CCTexture2D对象的,

它内部有个NSMutableDictionary *_textures字典,

key是图片名称,vale是与图片对应的CCTexture2D对象(即通过该图片生成的2D纹理对象)。

当调用CCTextureCache(纹理缓存)的addImage:方法添加图片时,

会先根据图片名查找成员:_textures字典中是否已经存在与该图片对应的CCTexture2D对象,

如果有就直接返回;

如果没有,才会根据该图片名,创建CCTexture2D对象,

创建完毕后将该图片名对应的CCTexture2D对象放入CCTextureCache(纹理缓存)的成员字典中。




就像前面说的,可以通过指定一个矩形范围,从而只加载图片对应的纹理对象中的某个矩形区域

CCSprite *sprite = [CCSprite spriteWithTexture:texture2D rect:CGRectMake(0, 0, 112, 112)];

纹理的大小

目前位置,iOS设备只支持尺寸为"2的n次幂"的纹理,

因此每张纹理的宽和高都只可能为:2、4、8、16、32、64、128、256、512、1024和2048像素。

也就是说纹理的宽高只能是上述数值的组合,比如16x16,32x32,512x128等

我们在制作纹理图片的时候,最好图片的尺寸都符合上述要求,不然就会浪费空间。

举例说明,有一张260x260像素的32位色图,

它在内存中大概占270KB(260 x 260 x 32 / 8 = 270400B),

但受纹理尺寸的限制,纹理的尺寸必须是2的n次幂,

系统将自动生成一张最接近原图尺寸的(只会比原图尺寸大)、宽高都为2的n次幂的纹理,

因此,系统将会生成一张512x512像素的纹理,

并且,最终会占用1MB的内存(512 x 512 x 32 / 8 = 1048576B),

可以看出,实际占用的内存竟然是原图所需内存的4倍。

解决办法就是将这张260x260像素的图像改为256x256像素,系统也将生成256x256像素的纹理。


HD高分辨率和SD标准分辨率图

2010年的iPhone4第一次引入了高分辨率的视网膜屏幕(Retina显示屏幕),

像素分辨率为960x640,刚好是前一代iPod和iPhone像素分辨率(480x320)的两倍。

一般会将Retina显示屏幕使用的图像称为高分辨率(HD)图像,

非Retina显示屏幕使用的图像称为标准分辨率(SD)图像。

cocos2d的坐标系统跟UIKit一样与像素无关,它使用的是点坐标系,而不是像素坐标系,

即以点为单位,不是以像素为单位。

在Retina显示屏幕的设备上,1点是2像素;

在非Retina显示屏幕的设备上,1点就是1像素

因此通过点来表示位置,坐标在两种设备上是相同的。

如果游戏运行在具有Retina显示屏幕的设备上,cocos2d会先尝试加载带有-hd后缀的图片。

比如你在具有Retina显示屏幕的设备上加载ball.png,它会首先尝试加载ball-hd.png,

如果该文件不存在或者非Retina显示屏幕,将加载标准分辨率(SD)图片ball.png。

因此为了更好地支持Retina显示屏,一般会使用HD分辨率创建所有图片,

然后把宽高都缩小50%,另存为SD分辨率图片




CCLabelTTF

CCLabelTTF继承自CCSprite,可以用来显示单纯的字符串文本

可以通过color属性设置文字颜色







CCSprite 类引用

继承自

CCNode :CCResponder : NSObject

遵守协议

CCBlendProtocol

CCEffectProtocol

CCShaderProtocol

CCTextureProtocol

类声明

CCSprite.h


CCSprite 实质是一个 2D 图片

CCSprite 通过一幅图片创建, 或图片中的一小块矩形区域

CCSprite 默认锚点是 (0.5, 0.5).

成员属性如下:

  •   textureRect property
  •   textureRectRotated property
  •   spriteFrame property
  •   flipX property
  •   flipY property
  •   offsetPosition property

创建一个CCSprite 对象

  • + spriteWithImageNamed:
  • + spriteWithTexture:
  • + spriteWithTexture:rect:
  • + spriteWithSpriteFrame:
  • + spriteWithCGImage:key:

初始化一个CCSprite对象

  • – initWithImageNamed:
  • – initWithTexture:
  • – initWithTexture:rect:
  • – initWithSpriteFrame:
  • – initWithCGImage:key:
  • + emptySprite
  • – initWithTexture:rect:rotated:

与纹理相关的方法

  • – setTextureRect:
  • – setTextureRect:rotated:untrimmedSize:

成员属性详解:

flipX

Whether or not the sprite is flipped horizontally. It only flips the texture of the sprite, and not the texture of the sprite’s children. Also, flipping the texture doesn’t alter the anchorPoint. If you want to flip the anchorPoint too, and/or to flip the children too use: sprite.scaleX *= -1;

@property (nonatomic, readwrite) BOOL flipX


flipY

Whether or not the sprite is flipped vertically. It only flips the texture of the sprite, and not the texture of the sprite’s children. Also, flipping the texture doesn’t alter the anchorPoint. If you want to flip the anchorPoint too, and/or to flip the children too use: sprite.scaleY *= -1;

@property (nonatomic, readwrite) BOOL flipY


offsetPosition

The offset position in points of the sprite in points. Calculated automatically by sprite sheet editors.

@property (nonatomic, readonly) CGPoint offsetPosition



spriteFrame

The currently displayed spriteFrame.

@property (nonatomic, strong) CCSpriteFrame *spriteFrame



textureRect

Returns the texture rect of the CCSprite in points.

@property (nonatomic, readonly) CGRect textureRect



textureRectRotated

Returns whether or not the texture rectangle is rotated.

@property (nonatomic, readonly) BOOL textureRectRotated



类方法列表 :

emptySprite

Creates a non rendered sprite, the primary use of this type of sprite would be for adding control sprites for more complex animations.

+ (id)emptySprite

返回值:

A newly initialized CCSprite object.



spriteWithCGImage:key:

Creates an sprite with a CGImageRef and a key. The key is used by the CCTextureCache to know if a texture was already created with this CGImage. For example, a valid key is: @“_spriteframe_01”. If key is nil, then a new texture will be created each time by the CCTextureCache.

+ (id)spriteWithCGImage:(CGImageRef)image key:(NSString *)key

参数列表:

image

Image ref.

key

Key description.

返回值:

The CCSprite Object.



spriteWithImageNamed:

Creates a sprite with the name of an image. The name can be either a name in a sprite sheet or the name of a file.

+ (id)spriteWithImageNamed:(NSString *)imageName

参数列表:

imageName

name of the image to load.

返回值:

The CCSprite Object.



spriteWithSpriteFrame:

Creates an sprite from a sprite frame.

+ (id)spriteWithSpriteFrame:(CCSpriteFrame *)spriteFrame

参数列表:

spriteFrame

Sprite frame to use.

返回值:

The CCSprite Object.



spriteWithTexture:

Creates an sprite with a texture. The rect used will be the size of the texture. The offset will be (0,0).

+ (id)spriteWithTexture:(CCTexture *)texture

参数列表:

texture

Texture to use.

返回值:

The CCSprite Object.



spriteWithTexture:rect:

Creates an sprite with a texture. The offset will be (0,0).

+ (id)spriteWithTexture:(CCTexture *)texture rect:(CGRect)rect

参数列表:

texture

Texture to use.

rect

Rect to use.

返回值:

The CCSprite Object.



实例方法:

initWithCGImage:key:

Initializes an sprite with a CGImageRef and a key. The key is used by the CCTextureCache to know if a texture was already created with this CGImage. For example, a valid key is: @“_spriteframe_01”. If key is nil, then a new texture will be created each time by the CCTextureCache.

- (id)initWithCGImage:(CGImageRef)image key:(NSString *)key

参数列表:

image

Image ref.

key

Key description.

返回值:

A newly initialized CCSprite object.



initWithImageNamed:

Initializes a sprite with the name of an image. The name can be either a name in a sprite sheet or the name of a file.

- (id)initWithImageNamed:(NSString *)imageName

参数列表:

imageName

name of the image to load.

返回值:

A newly initialized CCSprite object.



initWithSpriteFrame:

Initializes an sprite with an sprite frame.

- (id)initWithSpriteFrame:(CCSpriteFrame *)spriteFrame

参数列表:

spriteFrame

Sprite frame to use.

返回值:

A newly initialized CCSprite object.



initWithTexture:

Initializes an sprite with a texture. The rect used will be the size of the texture. The offset will be (0,0).

- (id)initWithTexture:(CCTexture *)texture

参数列表:

texture

The texture to use.

返回值:

A newly initialized CCSprite object.



initWithTexture:rect:

Initializes an sprite with a texture and a rect in points (unrotated) The offset will be (0,0).

- (id)initWithTexture:(CCTexture *)texture rect:(CGRect)rect

参数列表:

texture

The texture to use.

rect

The rect to use.

返回值:

A newly initialized CCSprite object.



initWithTexture:rect:rotated:

Designated initializer. Initializes an sprite with a texture and a rect in points, optionally rotated. The offset will be (0,0). IMPORTANT: This is the designated initializer.

- (id)initWithTexture:(CCTexture *)texture rect:(CGRect)rect rotated:(BOOL)rotated

参数列表:

texture

The texture to use.

rect

The rect to use.

rotated

YES if texture is rotated.

返回值:

A newly initialized CCSprite object.



setTextureRect:

Set the texture rect of the CCSprite in points. It will call setTextureRect:rotated:untrimmedSize with rotated = NO, and utrimmedSize = rect.size.

- (void)setTextureRect:(CGRect)rect

参数列表:

rect

Rect to use.




setTextureRect:rotated:untrimmedSize:

Set the texture rect, rectRotated and untrimmed size of the CCSprite in points. It will update the texture coordinates and the vertex rectangle.

- (void)setTextureRect:(CGRect)rect rotated:(BOOL)rotated untrimmedSize:(CGSize)size

参数列表:

rect

Rect to use.

rotated

YES if texture is rotated.

size

Untrimmed size.



iOS_31_cocos2d_CCSprite