一个游戏中能够有非常多个场景,每一个场景里面又可能包括有多个图层,这里的图层一般就是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> 当单指接触到屏幕时

[java] view
plain
copy

  1. - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

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

[java] view
plain
copy

  1. - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

3> 当单指离开屏幕时

[java] view
plain
copy

  1. - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

4> 当触摸被取消时

[java] view
plain
copy

  1. - (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

非常少会发生触摸被取消的情况,所以大多数情况下可忽略,或用ccTouchesEnded取代,由于ccTouchesCancelled和ccTouchesEnded类似

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

比方在手指移动过程中:

[java] view
plain
copy

  1. - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  2. // 获取触摸对象
  3. UITouch *touch = [touches anyObject];
  4. // 获取触摸在UIView视图上的位置
  5. CGPoint uiPoint = [touch locationInView:touch.view];
  6. // 转换为OpenGL坐标
  7. CGPoint glPoint = [[CCDirector sharedDirector] convertToGL:uiPoint];
  8. }

以下利用一个小样例来综合使用上述的方法。如果图层上有个精灵,我手指触摸到哪,这个精灵的位置就在哪

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

[java] view
plain
copy

  1. // 图层的init方法
  2. -(id) init
  3. {
  4. if( (self=[super init])) {
  5. // 初始化一个精灵
  6. CCSprite *lufy = [CCSprite spriteWithFile:@"lufy.png"];
  7. CGSize size = [[CCDirector sharedDirector] winSize];
  8. lufy.position =  ccp(size.width * 0.5f, size.height * 0.5f);
  9. // 加入精灵。并设置标记
  10. [self addChild: lufy z:0 tag:kLufyTag];
  11. self.isTouchEnabled = YES;
  12. }
  13. return self;
  14. }

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

[java] view
plain
copy

  1. // 计算触摸在图层中的位置(OpenGL坐标)
  2. - (CGPoint)locationInLayer:(NSSet *)touches {
  3. // 获取触摸对象
  4. UITouch *touch = [touches anyObject];
  5. // 获取触摸在UIView视图上的位置
  6. CGPoint uiPoint = [touch locationInView:touch.view];
  7. // 转换为OpenGL坐标
  8. CGPoint glPoint = [[CCDirector sharedDirector] convertToGL:uiPoint];
  9. return glPoint;
  10. }
  11. // 因为ccTouchesBegan、ccTouchesMoved、ccTouchesEnded中的做法都是一样,所以抽成一个方法
  12. - (void)dealTouches:(NSSet *)touches {
  13. // 计算触摸的位置
  14. CGPoint point = [self locationInLayer:touches];
  15. // 依据标记获取精灵
  16. CCSprite *lufy = (CCSprite *)[self getChildByTag:kLufyTag];
  17. // 设置精灵的位置
  18. lufy.position = point;
  19. }
  20. - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  21. [self dealTouches:touches];
  22. }
  23. - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  24. [self dealTouches:touches];
  25. }
  26. - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  27. [self dealTouches:touches];
  28. }

图层的触摸输入临时说到这里,其它高级的使用方法在后面会提及

2.接收加速计输入

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

[java] view
plain
copy

  1. self.isAccelerometerEnabled = YES;

设置isAccelerometerEnabled为YES后,就会调用图层对应的方法来处理加速计输入:

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

[java] view
plain
copy

  1. - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
  2. // typedef double UIAccelerationValue;
  3. UIAccelerationValue x =  acceleration.x;
  4. UIAccelerationValue y =  acceleration.y;
  5. UIAccelerationValue z =  acceleration.z;
  6. // x,y,z代表三维中随意方向的加速度
  7. }

CCLayerColor

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

[java] view
plain
copy

  1. // 红色:#ffff0000
  2. ccColor4B color = ccc4(255, 0, 0, 255);
  3. // 初始化一个颜色图层
  4. CCLayerColor *layerColor = [CCLayerColor layerWithColor:color];
  5. // 加入到场景中
  6. [scene addChild:layerColor];

效果图:

CCLayerGradient

CCLayerGradient是CCLayerColor的子类,能够给图层设置渐变色

[java] view
plain
copy

  1. // 红色:#ffff0000
  2. ccColor4B red = ccc4(255, 0, 0, 255);
  3. // 蓝色:#ff0000ff
  4. ccColor4B blue = ccc4(0, 0, 255, 255);
  5. // 初始化一个渐变图层,从红色渐变到蓝色
  6. CCLayerGradient *layerGradient = [CCLayerGradient layerWithColor:red fadingTo:blue];
  7. // 加入到场景中
  8. [scene addChild:layerGradient];

效果图:

CCLayerMultiplex

CCLayerMultiplex继承自CCLayer。称为"多重图层"。它能够包括多个CCLayer对象,但在随意时刻仅仅能够有一个CCLayer处于活动状态,用switchTo:和switchToAndReleaseMe:方法能够让某个图层处于活动状态。差别在于switchToAndReleaseMe:方法会先释放当前处于活动状态的图层,再让參数中要求的图层处于活动状态

[java] view
plain
copy

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

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

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

感谢作者~!

cocos2D(六)----CCLayer的更多相关文章

  1. Cocos2d-android (01) 创建一个简单的cocos2d应用程序

    下载Cocos2d-android的源代码:cocos2d-android-1 git@github.com:ZhouWeikuan/cocos2d.git 将项目导入到eclipse中.运行实例: ...

  2. 基于cocos2d开发的android小游戏——採花仙

    /*cocos 2d 已经成为了如今移动端游戏开发的强有力的工具,眼下主流游戏中多採用cocos 2d游戏引擎. 我也尝试了一下该引擎.我是用的是cocos2d-android,以后要移植到Cocos ...

  3. CosCos2D-android 代码总结

    CosCos2D-android 学习总结 资料: Android游戏开发视频教程 Cocos-android-1代码包下载 直接上代码: MainActivity中Cocos常规写法: //coco ...

  4. Cocos2d-android (06) 屏幕触摸事件及坐标转换

    为屏幕添加触摸事件,将左上角坐标转换为左下角坐标 package com.arlen.cocos2d.touch01; import org.cocos2d.layers.CCLayer; impor ...

  5. Cocos2d-android (05) 渐变动画(颜色,淡入淡出。。。)

    淡入淡出.颜色渐变及动作重复执行 import org.cocos2d.actions.base.CCRepeatForever; import org.cocos2d.actions.interva ...

  6. Cocos2d-android (04) 执行多个动作

    先后.同时执行多个动作及动作序列执行结束后的事件 import org.cocos2d.actions.instant.CCCallFunc; import org.cocos2d.actions.i ...

  7. Cocos2d-android (03) 向量

    向量的基本运算及动作 import org.cocos2d.actions.interval.CCJumpBy; import org.cocos2d.actions.interval.CCMoveB ...

  8. Cocos2d-android (02) 添加一个精灵对象

    什么是精灵: 1.精灵就是游戏当中的一个元素,通常用于代表画面当前中的一个事物,例如主人公,NPC和背景元素等: 2.一个精灵对象通常都与一张图片关联 3.精灵对象可以通过动作对象(CCAction) ...

  9. cocos2d_android 瞬间动作

    该文章所写的瞬间动作主要有CCFlipX,CCFlipY,CCHide,CCShow 当中CCFlipX是以Y轴为中心旋转,CCFlipY是以X轴为中心旋转,CCHide将精灵对象隐藏,CCShow将 ...

  10. Cocos2d-x 学习之引擎介绍

    Cocos2d-X是一个开源的移动2D游戏框架,MIT许可证下发布的.这是一个C + +cocos2d-iPhone项目的版本.cocos2d-X发展的重点是围绕cocos2d跨平台.即其实现一次编码 ...

随机推荐

  1. Linux - 设置光盘,开机自动挂载。

    设置光盘,开机自动挂载. 挂载, 在linux操作系统中, 挂载是指将一个设备(通常是存储设备)挂接到一个已存在的目录上. 我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上, ...

  2. SQL Server 2005外围应用配置器

     在SQL Server Configuration Manager中,重启“SQL Server(SQL2005)”服务.

  3. [专辑] 也晒晒我的RBAC系统 ——行一山人的博客

    也晒晒我的RBAC系统(一):概述 也晒晒我的RBAC系统(二):系统实现原理简介 也晒晒我的RBAC系统(三):后台管理程序源码及使用演示 也晒晒我的RBAC系统(四):框架源代码(超值奉献,请勿拍 ...

  4. [Java] 总结1.5/1.6/1.7版本的特性

    开发过程中接触到了从jdk1.5---jdk1.7的使用,在不同的阶段,都使用过了jdk的一些新特性,操作起来更加方面啦!特此总结了下,以下是测试代码: JDK1.5新特性: 1.自动装箱与拆箱: I ...

  5. shp系列(五)——利用C++进行shp文件的写(创建)

    之前介绍了shp文件.dbf文件和shx文件的的读取,接下来将分别介绍它们的创建过程.一般来说,读和写的一一对应的,写出的文件就是为了保存数据供以后读取的.写的文件要符合shapefile的标准.之前 ...

  6. jQuery hooks源码学习

    段落不够清晰,待整理 看jQuery源码的时候,经常见到含有hooks标志的对象,如cssHooks, attrHooks, propHooks, valHooks. 下面对其中的一段进行解读. jQ ...

  7. 深入分析setContentView

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  8. Super超级ERP系统---(2)基础信息管理

    这一节我我们来了解下super系统的基础信息模块有哪些功能以及怎么实现.任何功能再强大的系统,也需要基本信息来支撑.超级erp系统的基础信息主要有供应商管理,品牌管理,分类管理,商品管理几个模块构成. ...

  9. 第4章 部署模式 Deployment Plan(部署规划)

    已开发了基于组件的应用程序,该应用程序在逻辑上构造为多层结构,如 Three-Layered Services Application. 中所述.您希望将它分布到一组在物理上为多级结构的服务器上,如 ...

  10. JavaScript的continue和break的区别

    <html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...