[ 李华明Himi ](http://www.himigame.com/about-himi)原创,转载务必在明显处注明:
转载自[【黑米GameDev街区】](http://www.himigame.com/) 原文链接: [http://www.himigame.com/iphone-cocos2d/516.html](http://www.himigame.com/iphone-cocos2d/516.html "【iOS-Cocos2d游戏开发之二十】精灵的基础知识点总汇(位图操作/贴图更换/重排z轴等)以及利用CCSprite与CCLayerColor制作简单遮盖层!")
[](http://blog.csdn.net/xiaominghimi/article/details/6955680)
最近写了不少Cocos2d的博文了,那么由于Himi介绍的一般都是比较容易出错的问题或者比较受到关注的知识点,所以不少童鞋要求写个基础篇,那么这里Himi就举例最常用的精灵CCSprite来详细的介绍一些吧; 考虑到网上对于Cocos2d-iphone的中文教程已有很多,所以这里Himi会拿出一些教程没有提到的基础知识点来分享;
首先我们来创建一个精灵:
~~~
CCSprite* sprite =[CCSprite spriteWithFile:@"Icon.png"];//初始化
[self addChild:sprite]; //添加入层中
~~~
代码很简单,传入一张贴图名即可,然后添加层中,那么这里Himi说几点:
1.精灵除了这个创建函数外,还有很多方法,最重要的另一个就是利用打包工具打包出来的帧缓存中加载贴图并创建;关于打包工具Himi使用的是TP,还有其他一些这里不介绍了,Himi之前的博文也有对应的介绍;
2.精灵默认添加进layer中默认是layer的(0,0)点,即屏幕的左下角;而且精灵的贴图绘制是以精灵的贴图中心点进行渲染的,简单说如果精灵贴图大小看成单位一,精灵的锚点(anchor)是(0.5,0.5);这个是精灵默认锚点,当然也可以设置锚点,这个锚点的范围是[0,1];
3.大家如果刚接触一门新语言、引擎、框架等就要慢慢找到它们的规律,比如在cocos2d中一般创建都是类似的创建方式,而初始化的函数基本都是以类名后的一个单词作为开头;比如咱们这个CCSprite类,它的构造函数就是sprite开头的;
OK,知道如何创建一个精灵了,下面我们来写一点精灵的常用方法和基本位图操作吧:
~~~
CCSprite* sprite =[CCSprite spriteWithFile:@"Icon.png"];//初始化
[self addChild:sprite]; //添加入层中
sprite.scale=2;//放大2倍
sprite.rotation=90;//旋转90度
sprite.opacity=255;//设置透明度为完全不透明(范围0~255)
sprite.position=ccp(100,100);//设置精灵中心点坐标是x=100,y=100
[sprite setFlipX:YES];//X轴镜像反转
[sprite setFlipY:YES];//Y轴镜像反转
[sprite setColor:ccc3(255, 0, 0)];//设置颜色为红色
~~~
关于精灵的动作这些N多文章都写过了,这里我就不写了,没意义,我这里给大家再讲解下童鞋们经常纠结的两个问题:
1.如何重新设置精灵的z轴(覆盖层)?
对于这个问题,很多童鞋无法找到方法的原因主要是因为大家首先想到的是更改精灵的Z轴值的大小(Z轴值越大离屏幕越近),那么就会错误的使用下面这段代码:
~~~
sprite.zOrder=2;
~~~
这句话是不允许使用的错误代码,因为精灵的zOrder属性只能可读不可修改;那么Himi提供大家一个解决方法,那就是利用布局去重新设置你想设置的精灵的z轴值,例如以下代码:(111.png是我从博客随便截出来的图,反正比Icon.png大就可以,这样童鞋们就能看得清楚了)
~~~
//--z值1的精灵
CCSprite* sprite =[CCSprite spriteWithFile:@"Icon.png"];
[self addChild:sprite z:1]; //添加入层中
sprite.position=ccp(300,200);//设置精灵中心点坐标是x=100,y=100
//--z值2的精灵
CCSprite* sprite2 =[CCSprite spriteWithFile:@"111.png"];
[self addChild:sprite2 z:2];
sprite2.position=ccp(220,120);
~~~
从代码中可以很清晰看到第二个精灵sprite2的z轴大于第一个精灵sprite的z轴值,那么sprite2肯定是覆盖sprite上的,运行效果图如下:
![](https://box.kancloud.cn/2016-03-31_56fcd01d53116.png)
下面我们来利用layer对第一个精灵进行z轴重新设定,代码如下:
~~~
[self reorderChild:sprite z:10];
~~~
self: CCLayer
sprite: 想要重新设置z轴(覆盖层)的精灵
z: 想要重新设置z轴(覆盖层)的精灵的z轴值
OK,那么我们重新设置了第一个精灵的z轴值为10,这时候精灵1比精灵2的z轴大了,1会覆盖2精灵,运行效果如下图:
![](https://box.kancloud.cn/2016-03-31_56fcd01d7db9f.png)
2.如何更换已创建的精灵贴图?
在上面我介绍了精灵的创建一般有两种:一种是利用帧缓存,另一种是直接索引贴图ID进行创建;所以呢更换精灵贴图也一般分为两种方法;
首先介绍第一种直接利用新建贴图进行更换:
实例代码如下:
~~~
//-----没有换贴图前
CCSprite*sprite =[CCSprite spriteWithFile:@"Icon.png"];
sprite.position=ccp(150,150);
[self addChild:sprite];
//-----换贴图后
CCSprite*sprite2 =[CCSprite spriteWithFile:@"Icon.png"];
sprite2.position=ccp(350,150);
[self addChild:sprite2];
//更换贴图
CCTexture2D * texture =[[CCTextureCache sharedTextureCache] addImage: @"Default.png"];//新建贴图
[sprite2 setTexture:texture];
~~~
运行效果如下:
![](https://box.kancloud.cn/2016-03-31_56fcd01da0f71.png)
第二种利用帧替换:
~~~
//加载帧缓存,这个testpngs.plist保存了Icon和111两张图,-hd表示高清版本iphone4
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"testpngs-hd.plist"];
//-----没有换贴图前
CCSprite*sprite =[CCSprite spriteWithSpriteFrameName:@"Icon.png"];
sprite.position=ccp(150,150);
[self addChild:sprite];
//-----换贴图后
CCSprite*sprite2 =[CCSprite spriteWithSpriteFrameName:@"Icon.png"];
sprite2.position=ccp(350,150);
[self addChild:sprite2];
//更换帧贴图
//从帧缓存中取出111.png
CCSpriteFrame* frame2 = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"111.png"];
[sprite2 setDisplayFrame:frame2];
~~~
运行效果如下:
![](https://box.kancloud.cn/2016-03-31_56fcd01dc8935.png)
-------------下面来介绍如何来利用CCSprite精灵或者CCLayerColor简单实现一个简单的覆盖层(遮挡)效果
首先利用CCSprite来实现,代码如下:
~~~
CCSprite *sprLeft = [CCSprite spriteWithFile:@"Icon.png"];
sprLeft.position=ccp(100,180);
[self addChild:sprLeft];
//----创建一个简单的覆盖层
//获取当前屏幕宽高
CGSize size =[[CCDirector sharedDirector]winSize];
//创建一个精灵(无贴图)
CCSprite*sprite =[CCSprite node];
//设置精灵贴图大小(全屏幕宽高)
sprite.textureRect=CGRectMake(0, 0, size.width, size.height);
sprite.position=ccp(size.width*0.5,size.height*0.5);
sprite.opacity=127;//半透明[0~255]
sprite.color=ccc3(0, 0, 0);//设置黑色
[self addChild:sprite];
//----
CCSprite* sprRight = [CCSprite spriteWithFile:@"Icon.png"];
sprRight.position=ccp(300,180);
[self addChild:sprRight];
~~~
这里我创建了两个精灵一个被覆盖 一个不被覆盖 这样只要让童鞋们看得更清楚~
下面利用第二种方式实现:
~~~
//----
CCSprite *sprLeft = [CCSprite spriteWithFile:@"Icon.png"];
sprLeft.position=ccp(100,180);
[self addChild:sprLeft];
//----创建一个简单的覆盖层
//创建一个精灵(无贴图)
CCLayerColor *layer =[CCLayerColor layerWithColor:ccc4(0, 0, 0, 127)];
[self addChild:layer];
//----
CCSprite* sprRight = [CCSprite spriteWithFile:@"Icon.png"];
sprRight.position=ccp(300,180);
[self addChild:sprRight];
~~~
第二种方法大家可以看到就两句话实现,原因这里解释下:
第一种设置了贴图大小,layer不需要!因为layer默认全屏;
第一种设置了坐标,layer不需要!因为layer默认屏幕中心点;
第一种设置了透明度和颜色,layer也设置了~在layer创建的时候创建的,在layer创建时传入的四个参数:
四个参数分别表示RGBA!注意是RGBA!!!!不是ARGB!(因为Himi做过me、Android所以看到设置颜色第一概念就是ARGB。。所以刚接触这里各种郁闷,总是效果不是如自己想的。。。)
这里补充下:RGBA 颜色的三原色,红色、绿色、蓝色、透明度!
两种实现方式效果都如下图所示:
![](https://box.kancloud.cn/2016-03-31_56fcd01e06186.png)
希望童鞋们在初学的时候尽可能的遇到问题按照如下顺序去做:首先自己多次尝试->去看源码->百度google->最后请教他人
OK,就写到这里!下篇见~继续忙了;
- 前言
- 【Iphone 游戏开发】游戏引擎剖析
- [Object-C语言随笔之一]Mac os 下搭建iOS开发环境
- [Object-C语言随笔之二] 《NSLog》常用的打印调试语句与自动排版
- [Object-C语言随笔之三] 类的创建和实例化以及函数的添加和调用!
- [Object-C语言随笔之四]创建视图并绘制简单图形
- 【iOS-Cocos2d游戏开发之一】搭建cocos2d游戏引擎环境HelloWorld!
- 【iOS-Cocos2d游戏开发之二】Cocos2D 游戏开发资源贴(教程以及源码)
- 【iOS-Cocos2d游戏开发之三】CCScene切换的所有特效(28种)以及设置屏幕横竖屏!
- 【iOS-Cocos2d游戏开发之四】独自收集Cocos2d提供的字体!共57种(有对照的字体图)
- 【iOS-Cocos2d游戏开发之五】多触点与触屏事件详解(单一监听、事件分发)【11月28日更新】
- 【iOS-Cocos2d游戏开发之六】对触屏事件追加讲解,解决无法触发ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戏开发之七】在cocos2d中添加/删除系统组件,并解决View设置透明会影响View中的其他组件的问题!【11月28日更新解决添加组件Cocos2d动画停止播放的BUG】
- 【iOS-Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- 【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【iOS-Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- 【iOS-Cocos2d游戏开发之十三】CCSprite利用Bezier(贝塞尔)做抛物线动作并让CCSprite同时播放两个Action动作!
- 【iOS-Cocos2d游戏开发之十四】音频/音效/视频播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d进行视频播放!)
- 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!
- 【iOS-Cocos2d游戏开发之十六】添加本地通知(UILocalNotification)以及添加系统组件滚动视图(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戏开发之十七】灵活使用精灵可视区域(TextureRect)与锚点(anchorPoint),并结合可视区域与锚点制作进度条!
- 【iOS开发必备指南合集】申请企业级IDP、真机调试、游戏接入GameCenter 指南(实现仿官方的成就提示)、游戏接入OpenFeint指南;
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!【2011年12月18日补充】
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取"产品付费数量等于0的问题"】
- 【iOS-cocos2d-X 游戏开发之一】在Mac下结合Xcode搭建Cocos2d-X开发环境!
- 【iOS-cocos2d-X 游戏开发之二】【必看篇】总结阐述Cocos2d-X与Cocos2d-iphone区别;
- 【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3
- 【iOS-Cocos2d游戏开发之二十】精灵的基础知识点总汇(位图操作/贴图更换/重排z轴等)以及利用CCSprite与CCLayerColor制作简单遮盖层!
- 【iOS-Cocos2d游戏开发之二十一 】自定义精灵类并为你的精灵设置攻击帧(指定开始帧)以及扩展Cocos2d源码的CCAnimation简化动画创建!
- 【iOS-Cocos2d游戏开发之二十二 】CCSpeed实现CCAnimate动画进行时设置慢动作以及设置游戏加减速进行(塔防游戏必备)!
- 【iOS-cocos2d-X 游戏开发之三】Mac下配置Android NDK环境并搭建Cocos2d-x环境并Eclipse正常编译运行Cocos2dX自带TestsDemo项目!
- 【iOS-cocos2d-X 游戏开发之四】Cocos2dX创建Android NDK新项目并编译导入Eclipse中正常运行!
- 【iOS-cocos2d-X 游戏开发之五】游戏存储之Cocos2dX自带CCUserDefault类详解;
- 【iOS-cocos2d-X 游戏开发之六】使用Base64算法对Cocos2dX自带CCUserDefault游戏存储数据编码!
- 【iOS-cocos2d-X 游戏开发之七】整合Cocos2dX的Android项目到Xcode项目中,Xcode编写&编译代码,Android导入打包运行即可!
- 【iOS-iap防护】验证用户付费收据!拒绝iap Cracker!拒绝iap Free!让iphone越狱用户无从下手!【2012年5月2日更新防护iap Free的方法】
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
- 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!
- 【iOS-cocos2d-X 游戏开发之十】自定义CCSprite/Layer/CCNode及静态类模版&自定义类细节说明&Cocos2dx触屏事件讲解
- 【iOS-cocos2d-X 游戏开发之十一】New CCSprite()带来的错误&使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戏开发之十二】自定义Cocos2dx摇杆(增强Joystick),增加摇杆跟随用户触点作为摇杆坐标,让摇杆不再死板!
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- 【iOS-cocos2d-X 游戏开发之十四】Xcode中c++&Object-C混编,详细介绍如何在cocos2dx中访问object函数以及Apple Api
- 【iOS-cocos2d-X 游戏开发之十五】Cocos2dx中响应Android的Back(返回)与Menu(小房子)事件&&Cocos2dx自动释放粒子内存函数!
- 【iOS-cocos2d-X 游戏开发之十六】配置你的Cocos2dx项目编译后的Android自动使用(-hd)高清图&设置Android自适应屏幕、缩放比例方法!
- 【Cocoa(mac) Application 开发系列之四】动作编辑器(Cocos2dx)制作流程详解及附上响应鼠标滚轴事件、反转坐标系、导入/创建资源目录等知识点代码!
- 【Cocos2d-X(2.x) 游戏开发系列之一】cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解!在2.x版CCFileData类被去除等
- 【Cocos2d-X(2.x) 游戏开发系列之二】cocos2dx最新2.0.1版本跨平台整合NDK+Xcode,Xcode编写&编译代码,Android导入打包运行即可!
- 【Cocos2dX(2.x)_Lua开发之三】★重要必看篇★在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
- 【Cocos2d-X(2.x) 游戏开发系列之三】最新版本cocos2d­2.0­x­2.0.2使用新资源加载策略!不再沿用-hd、-ipad、-ipadhd添加后缀方式
- 【Cocos2d-X(1.x 2.x) 修复篇】iOS6 中 libcurl.a 无法通过armv7s编译以及iOS6中无法正常游戏横屏的解决方法
- 【Cocos2d-X(1.x 2.x) 】iOS6与iphone5适相关设置随笔(解决第三方类库无法通过armv7s编译的方法、添加Default-568h@2x.png)