加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2D(六)----CCLayer

发布时间:2020-12-14 19:20:56 所属栏目:百科 来源:网络整理
导读:一个游戏中可以有很多个场景,每个场景里面又可能包含有多个图层,这里的图层一般就是CCLayer对象。CCLayer本身几乎没什么功能,对比CCNode,CCLayer可用于接收触摸和加速计输入。其实,cocos2d对图层并没有严格的要求,图层不一定要使用CCLayer类,它也可以

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


常用设置

1.接收触摸输入

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

[java] view plain copy
  1. 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{
  1. //获取触摸对象
  2. UITouch*touch=[touchesanyObject];
  3. //获取触摸在UIView视图上的位置
  4. CGPointuiPoint=[touchlocationInView:touch.view];
  5. //转换为OpenGL坐标
  6. CGPointglPoint=[[CCDirectorsharedDirector]convertToGL:uiPoint];
  7. }


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

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

copy
    //图层的init方法
  1. -(id)init
  2. {
  3. if((self=[superinit])){
  4. //初始化一个精灵
  5. CCSprite*lufy=[CCSpritespriteWithFile:@"lufy.png"];
  6. CGSizesize=[[CCDirectorsharedDirector]winSize];
  7. lufy.position=ccp(size.width*0.5f,size.height*0.5f);
  8. //添加精灵,并设置标记
  9. [selfaddChild:lufyz:0tag:kLufyTag];
  10. self.isTouchEnabled=YES;
  11. }
  12. returnself;
  13. }

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

copy
    //计算触摸在图层中的位置(OpenGL坐标)
  1. -(CGPoint)locationInLayer:(NSSet*)touches{
  2. //获取触摸对象
  3. UITouch*touch=[touchesanyObject];
  4. //获取触摸在UIView视图上的位置
  5. CGPointuiPoint=[touchlocationInView:touch.view];
  6. //转换为OpenGL坐标
  7. CGPointglPoint=[[CCDirectorsharedDirector]convertToGL:uiPoint];
  8. returnglPoint;
  9. //由于ccTouchesBegan、ccTouchesMoved、ccTouchesEnded中的做法都是一样,所以抽成一个方法
  10. -(void)dealTouches:(NSSet*)touches{
  11. //计算触摸的位置
  12. CGPointpoint=[selflocationInLayer:touches];
  13. //根据标记获取精灵
  14. CCSprite*lufy=(CCSprite*)[selfgetChildByTag:kLufyTag];
  15. //设置精灵的位置
  16. lufy.position=point;
  17. -(void)ccTouchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event{
  18. [selfdealTouches:touches];
  19. void)ccTouchesEnded:(NSSet*)toucheswithEvent:(UIEvent*)event{
  20. }

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


2.接收加速计输入

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

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

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

copy
    void)accelerometer:(UIAccelerometer*)accelerometerdidAccelerate:(UIAcceleration*)acceleration{
  1. //typedefdoubleUIAccelerationValue;
  2. UIAccelerationValuex=acceleration.x;
  3. UIAccelerationValuey=acceleration.y;
  4. UIAccelerationValuez=acceleration.z;
  5. //x,y,z代表三维中任意方向的加速度
  6. }


CCLayerColor

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

copy
    //红色:#ffff0000
  1. ccColor4Bcolor=ccc4(255,0,0); background-color:inherit">255);
  2. //初始化一个颜色图层
  3. CCLayerColor*layerColor=[CCLayerColorlayerWithColor:color];
  4. //添加到场景中
  5. [sceneaddChild:layerColor];
效果图:


CCLayerGradient

CCLayerGradient是CCLayerColor的子类,可以给图层设置渐变色

copy
    ccColor4Bred=ccc4(//蓝色:#ff0000ff
  1. ccColor4Bblue=ccc4(//初始化一个渐变图层,从红色渐变到蓝色
  2. CCLayerGradient*layerGradient=[CCLayerGradientlayerWithColor:redfadingTo:blue];
  3. [sceneaddChild:layerGradient];
效果图:


CCLayerMultiplex

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

copy
    //创建2个图层
  1. CCLayer*layer1=[CCLayernode];
  2. CCLayer*layer2=[CCLayernode];
  3. //创建一个多重图层,包含了layer1和layer2
  4. CCLayerMultiplex*plex=[CCLayerMultiplexlayerWithLayers:layer1,layer2,nil];
  5. //让layer1处于活动状态(layer2还在内存中)
  6. [plexswitchTo:0];
  7. //让layer2处于活动状态(layer1还在内存中)
  8. [plexswitchTo:1];
  9. //释放当前处于活动状态的layer2(layer2从内存中移除),然后让layer1处于活动状态
  10. [plexswitchToAndReleaseMe:0];

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





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

感谢作者~!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读