四、CCSprite

在介绍CCSprite之前,先要理解游戏开发中的一个核心概念:精灵。精灵也称为游戏对象,它可以用来表示游戏中的任何物体,比如敌人、子弹、甚至是一个背景图片、一段文字。CCSprite可以说是在cocos2d中最常用的一个类,可以称之为"精灵类",它能够以图片的形式将精灵显示到屏幕上。

创建精灵

在谈怎么创建一个精灵之前,先了解下游戏开发中另一个核心概念:纹理。纹理其实就是用来描述物体表面细节的图形,也称为纹理贴图,把纹理按照特定的方式映射到物体表面上的时候能使物体看上去更加真实。我们将纹理映射到屏幕上即可显示对应的图形。

1.创建精灵最简单的方式就是给精灵指定一张图片文件,cocos2d会利用这张图片生成纹理对象(CCTexture2D)并加载到纹理缓存库中(CCTextureCache),最终由精灵来控制纹理显示在屏幕中的位置。

[java] view plaincopy

  1. // 添加精灵到图层中
  2. - (id)init {
  3. if (self = [super init]) {
  4. CCSprite *sprite = [CCSprite spriteWithFile:@"lufy.png"];
  5. CGSize winSize = [CCDirector sharedDirector].winSize;
  6. sprite.position = ccp(winSize.width * 0.5f , winSize.height * 0.5f);
  7. [self addChild:sprite];
  8. }
  9. return self;
  10. }

为了保证能够正常读取图片资源,要把你的图片文件放在Resource文件夹中

运行效果:

其他常用设置

1> 设置精灵的不透明度

[java] view plaincopy

  1. // 大概为半透明
  2. sprite.opacity = 125;

opacity的取值范围是0-255,0代表完全透明,255代表完全不透明

2> 给精灵着色

[java] view plaincopy

  1. // 红色
  2. sprite.color = ccc3(255, 0, 0);

3> 水平镜像

[java] view plaincopy

  1. sprite.flipX = YES;

4> 垂直镜像

[java] view plaincopy

  1. sprite.flipY = YES;

如果flipX和flipY一起使用

[java] view plaincopy

  1. sprite.flipX = YES;
  2. sprite.flipY = YES;

2.可以指定一个范围只加载图片的某个矩形区域

这张图片的原大小是100x100的

[java] view plaincopy

  1. CCSprite *sprite = [CCSprite spriteWithFile:@"lufy.png" rect:CGRectMake(0, 0, 50, 50)];

只加载了图片左上角50x50的区域

3.可以直接传入一个纹理对象(CCTexture2D)

[java] view plaincopy

  1. // 创建纹理对象
  2. CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage:@"lufy.png"];
  3. // 传入纹理对象,生成精灵
  4. CCSprite *sprite = [CCSprite spriteWithTexture:texture];

CCTextureCache是专门用来缓存CCTexture2D对象的,它内部有个NSMutableDictionary *textures_字典,key是图片名称,vale是CCTexture2D对象。当调用它的addImage:方法添加图片时,会先根据图片名查找字典中是否存在对应的CCTexture2D对象,如果有就直接返回;如果没有,就会根据图片名称去加载CCTexture2D对象,加载完毕后将CCTexture2D对象放入字典中。

或者指定一个范围只加载图片的某个矩形区域

[java] view plaincopy

  1. CCSprite *sprite = [CCSprite spriteWithTexture:texture rect:CGRectMake(0, 0, 50, 50)];

纹理的大小

目前位置,iOS设备只支持尺寸为"2的n次幂"的纹理,因此每张纹理的宽和高都只可能为:2、4、8、16、32、64、128、256、512、1024和2048像素。也就是说纹理的宽高只能是上述数值的组合,比如2x4,32x32,512x64等。

我们在制作纹理图片的时候,最好图片的尺寸都符合上述要求,不然坏处多多。

比如,有一张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图像

iOS的像素分别率随设备的硬件而变化,iPhone第一次引入了高分辨率的视网膜屏幕(Retina显示屏幕),像素分辨率为960x640,刚好是前一代iPod和iPhone像素分辨率(480x320)的两倍。一般会将Retina显示屏幕使用的图像称为高分辨率(HD)图像,非Retina显示屏幕使用的图像称为标准分辨率(SD)图像。

下面来看看各代iOS设备的规格参数

设备 最大纹理尺寸 像素分辨率 坐标系
iPhone 2G\3G\3GS、iPod Touch 1024x1024 480x320 480x320
iPhone4、iPhone4s 2048x2048 960x640 480x320
iPad、iPad2 2048x2048 1024x768 1024x768

虽然这些设备的像素分辨率不同,但幸运的是,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分辨率图片。

不过,要想cocos2d会自动加载HD图片,还需要开启对Retina显示屏幕的支持

[java] view plaincopy

  1. [[CCDirector sharedDirector] enableRetinaDisplay:YES];

CCLabelTTF

CCLabelTTF继承自CCSprite,可以用来显示文本

[java] view plaincopy

  1. CCLabelTTF *label = [CCLabelTTF labelWithString:@"Hello World" fontName:@"Courier New" fontSize:20];
  2. label.position = ccp(winSize.width * 0.5f , winSize.height * 0.5f);
  3. [self addChild:label];

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

[java] view plaincopy

  1. // 红色
  2. label.color = ccc3(255, 0, 0);

四、CCSprite,布布扣,bubuko.com

时间: 2024-08-03 23:26:29

四、CCSprite的相关文章

第四讲:CCSprite精灵类 -- 创建精灵

创建精灵类的6种方法: 1.最常用的方法 //获取屏幕大小 CCSize size = CCDirector::sharedDirector()->getWinSize(); CCSprite *sp1 = CCSprite::create("icon.png"); sp1->setPosition(size.width*0.2, size.height*0.7); this->addChild(sp1); 2. CCSprite *sp2 = CCSprite::c

cocos2d-x ios游戏开发初认识(五) CCsprite精灵类

这次写一下精灵创建的几种类型: 一.通过文件创建: 在原有的基础上添加如下代码: //一.通过文件创建精灵 CCSprite *bg =CCSprite::create("map.png"); CCSize winSize  =CCDirector::sharedDirector()->getWinSize(); //得到屏幕的尺寸 bg->setPosition(ccp(winSize.width/2, winSize.height/2)); this->addCh

CCSprite的使用方法大全

一.精灵创建及初始化 1.从图片文件创建: CCSprite *sprite = [CCSprite spriteWithFile:@"ImageFileName.png"]; 默认锚点 ccp(0.5,0.5), 默认位置 ccp(0,0), CCSprite尺寸(contentSize)为图片尺寸 2.从帧缓存创建: [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"MineSwe

第四十天 一乐在其中—Android的小游戏打飞机(三)添加敌机

8月9日,晴."江城如画里,山晓望晴空.雨水夹明镜,双桥落彩虹. 人烟寒橘柚,秋色老梧桐." 上篇已经让飞机加载子弹和音效及背景音乐,本篇主要添加敌机. 本篇要用到的几个函数讲解: 1.voidsetTag (int nTag) 设置动作的标记. 2.CCRANDOM_0_1()函数生成的是 [0, 1] 之间的随机数:要生成  [0-100] 之间的数CCRANDOM_0_1 * 100:生成 [1,5]  之间的float 数,就是 CCRANDOM_0_1 * 4 + 1. 3.

cocos2d中CCSprite的使用总结 【转】

一.精灵创建及初始化 1.从图片文件创建: CCSprite *sprite = [CCSprite spriteWithFile:@"Icon.png"]; 2.从帧缓存创建: [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"MineSweeping.plist"]; CCSprite *sprite = [CCSprite spriteWithSpriteFrameNa

[windows+cocos2dx]CCSprite精灵类

序言 回想cocos2dx,之前在mac+Xcode平台学习了一遍cocos2dx,一年时间不接触cocos了.一直在搞Unity3d.如今还是就之前所学温故温故,但不再用Xcode来写.用经常使用的Windows+VS2012做为开发环境来回想cocos2dx.从CCSprite精灵类開始回想起. CCSprite多种创建方式 创建CCSprite精灵类有好多中方式,好多构造函数,这里列举集中创建形式.包含要显示某个部分和缓存帧,2D贴图创建和普通创建等. if ( !CCLayer::ini

Cocos2dx中的四种控件及主要用法

1.控件:即控制对象,控制按钮之类的精灵 2.主要介绍四大类控件: CCControlSlider:进度条 CCControlSwitch:开关 CCScale9Sprite:9妹图(用于缩放) CCControlButton:控制按钮,最复杂,最灵活 3.使用方法: a.创建一个进度条: CCControlSlider *slider = CCControlSlider::create("slider/sliderTrack.png", "slider/sliderProg

【转】cocos2d-x游戏开发(十四)用shader使图片背景透明

转自:http://blog.csdn.net/dawn_moon/article/details/8631783 好吧,终于抽时间写这篇文章了. 手头上有很多人物行走图,技能特效图等,但这些图都有个纯黑色背景,怎么样将内容显示出来,让背景透明呢?前段时间搞了一下,感谢群里的童鞋们,提供了思路和方法. 这里用shader处理了像素,使黑色背景透明,直接上代码 ShaderSprite.h 1 #ifndef __TestShader__ShaderSprite__ 2 #define __Tes

Cocos2d-x学习笔记(四)CCScene分析

原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38730335 前言 之前提到CCScene是场景,是整个游戏的舞台,通过查看源码我们不难发现CCScene也是CCNode的子节点,那么它也拥有我们上一节讲的CCNode的所有非private属性及方法. CCScene的作用十为了联系所有的CCNode节点(包括CCLayer.CCSprite等). 当清楚知道每个场景要显示的内容,那么定义出不同的CCNode,然后