cocos2D(六)----CCLayer

cocos2D(六)----CCLayer,第1张

概述一个游戏中可以有很多个场景,每个场景里面又可能包含有多个图层,这里的图层一般就是CCLayer对象。CCLayer本身几乎没什么功能,对比CCNode,CCLayer可用于接收触摸和加速计输入。其实,cocos2d对图层并没有严格的要求,图层不一定要使用CCLayer类,它也可以是一个简单的CCNode,为什么呢?我们新建一个图层不就是为了能够容纳更多的子节点么,CCNode也可以添加子节点啊。所

一个游戏中可以有很多个场景,每个场景里面又可能包含有多个图层,这里的图层一般就是cclayer对象。cclayer本身几乎没什么功能,对比CCNode,cclayer可用于接收触摸和加速计输入。其实,cocos2d对图层并没有严格的要求,图层不一定要使用cclayer类,它也可以是一个简单的CCNode,为什么呢?我们新建一个图层不就是为了能够容纳更多的子节点么,CCNode也可以添加子节点啊。所以,如果你的图层不需要接收触摸和加速计输入,就尽量使用CCNode表示图层,cclayer因为能够接收触摸和加速计输入会增加不必要的开销。移动、缩放、旋转整个图层,图层上的所有节点也会跟着一起移动、缩放、旋转。


常用设置
1.接收触摸输入

cclayer默认情况是不接收触摸输入的,需要显示地设置istouchEnabled为YES

[java] view plain copy self.istouchEnabled=YES; 设置istouchEnabled为YES后,就会调用图层相应的方法来处理触摸输入:

这些都是在CCStandardtouchDelegate协议中定义的方法

1> 当单指接触到屏幕时

copy -(voID)cctouchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event;

2> 当手指在屏幕上移动时

copy voID)cctouchesMoved:(NSSet*)toucheswithEvent:(UIEvent*)event;

3> 当单指离开屏幕时

copy voID)cctouchesEnded:(NSSet*)toucheswithEvent:(UIEvent*)event;

4> 当触摸被取消时

copy voID)cctouchesCancelled:(NSSet*)toucheswithEvent:(UIEvent*)event; 少会发生触摸被取消的情况,所以大多数情况下可忽略,或用cctouchesEnded代替,因为cctouchesCancelled和cctouchesEnded类似


大部分情况下,我们需要知道触摸发生在什么位置。这里的触摸事件是由UIKit框架接收的,因此需要把触摸位置转换为OpenGL坐标。

比如在手指移动过程中:

copy voID)cctouchesMoved:(NSSet*)toucheswithEvent:(UIEvent*)event{ //获取触摸对象 UItouch*touch=[touchesanyObject]; //获取触摸在UIVIEw视图上的位置 CGPointuiPoint=[touchlocationInVIEw:touch.vIEw]; //转换为OpenGL坐标 CGPointglPoint=[[CCDirectorsharedDirector]convertToGL:uiPoint]; }


下面利用一个小例子来综合使用上述的方法,假设图层上有个精灵,我手指触摸到哪,这个精灵的位置就在哪

首先在图层初始化的时候添加精灵

copy //图层的init方法 -(ID)init { if((self=[superinit])){ //初始化一个精灵 CCSprite*lufy=[CCSpritespriteWithfile:@"lufy.png"]; CGSizesize=[[CCDirectorsharedDirector]winSize]; lufy.position=ccp(size.wIDth*0.5f,size.height*0.5f); //添加精灵,并设置标记 [selfaddChild:lufyz:0tag:kLufyTag]; self.istouchEnabled=YES; } returnself; }

接下来是在图层中接收触摸输入

copy //计算触摸在图层中的位置(OpenGL坐标) -(CGPoint)locationInLayer:(NSSet*)touches{ //获取触摸对象 UItouch*touch=[touchesanyObject]; //获取触摸在UIVIEw视图上的位置 CGPointuiPoint=[touchlocationInVIEw:touch.vIEw]; //转换为OpenGL坐标 CGPointglPoint=[[CCDirectorsharedDirector]convertToGL:uiPoint]; returnglPoint; //由于cctouchesBegan、cctouchesMoved、cctouchesEnded中的做法都是一样,所以抽成一个方法 -(voID)dealtouches:(NSSet*)touches{ //计算触摸的位置 CGPointpoint=[selflocationInLayer:touches]; //根据标记获取精灵 CCSprite*lufy=(CCSprite*)[selfgetChildByTag:kLufyTag]; //设置精灵的位置 lufy.position=point; -(voID)cctouchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event{ [selfdealtouches:touches]; voID)cctouchesEnded:(NSSet*)toucheswithEvent:(UIEvent*)event{ }

图层的触摸输入暂时讲到这里,其他高级的用法在后面会提及


2.接收加速计输入

cclayer默认情况是不接收加速计输入的,需要显示地设置isAccelerometerEnabled为YES

copy self.isAccelerometerEnabled=YES; 设置isAccelerometerEnabled为YES后,就会调用图层相应的方法来处理加速计输入:

这是在UIAccelerometerDelegate协议中定义的方法

copy voID)accelerometer:(UIAccelerometer*)accelerometerdIDAccelerate:(UIacceleration*)acceleration{ //typedefdoubleuIaccelerationValue; UIaccelerationValuex=acceleration.x; UIaccelerationValuey=acceleration.y; UIaccelerationValuez=acceleration.z; //x,y,z代表三维中任意方向的加速度 }


cclayercolor

有时候,我们想给整个图层设置一种背景颜色,那么就需要用到cclayercolor了,cclayercolor是cclayer的子类

copy //红色:#ffff0000 cccolor4Bcolor=ccc4(255,0,0); background-color:inherit">255); //初始化一个颜色图层 cclayercolor*layercolor=[cclayercolorlayerWithcolor:color]; //添加到场景中 [sceneaddChild:layercolor]; 效果图:


cclayerGradIEnt

cclayerGradIEnt是cclayercolor的子类,可以给图层设置渐变色

copy cccolor4Bred=ccc4(//蓝色:#ff0000ff cccolor4Bblue=ccc4(//初始化一个渐变图层,从红色渐变到蓝色 cclayerGradIEnt*layerGradIEnt=[cclayerGradIEntlayerWithcolor:redfadingTo:blue]; [sceneaddChild:layerGradIEnt]; 效果图:


cclayerMultiplex

cclayerMultiplex继承自cclayer,称为"多重图层"。它可以包含多个cclayer对象,但在任意时刻只可以有一个cclayer处于活动状态用switchTo:和switchToAndReleaseMe:方法可以让某个图层处于活动状态,区别在于switchToAndReleaseMe:方法会先释放当前处于活动状态的图层,再让参数中要求的图层处于活动状态

copy //创建2个图层 cclayer*layer1=[cclayernode]; cclayer*layer2=[cclayernode]; //创建一个多重图层,包含了layer1和layer2 cclayerMultiplex*plex=[cclayerMultiplexlayerWithLayers:layer1,layer2,nil]; //让layer1处于活动状态(layer2还在内存中) [plexswitchTo:0]; //让layer2处于活动状态(layer1还在内存中) [plexswitchTo:1]; //释放当前处于活动状态的layer2(layer2从内存中移除),然后让layer1处于活动状态 [plexswitchToAndReleaseMe:0];

图层之间的切换是没有过渡效果的





原文地址:http://blog.csdn.net/q199109106q/article/details/8601533

感谢作者~!

总结

以上是内存溢出为你收集整理的cocos2D(六)----CCLayer全部内容,希望文章能够帮你解决cocos2D(六)----CCLayer所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1008637.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存