一个游戏中能够有不少个场景,每一个场景里面又可能包含有多个图层,这里的图层通常就是CCLayer对象。CCLayer自己几乎没什么功能,对比CCNode,CCLayer可用于接收触摸和加速计输入。其实,cocos2d对图层并无严格的要求,图层不必定要使用CCLayer类,它也能够是一个简单的CCNode,为何呢?咱们新建一个图层不就是为了可以容纳更多的子节点么,CCNode也能够添加子节点啊。因此,若是你的图层不须要接收触摸和加速计输入,就尽可能使用CCNode表示图层,CCLayer由于可以接收触摸和加速计输入会增长没必要要的开销。移动、缩放、旋转整个图层,图层上的全部节点也会跟着一块儿移动、缩放、旋转。java
CCLayer默认状况是不接收触摸输入的,须要显示地设置isTouchEnabled为YESnode
[java] view plaincopy框架
self.isTouchEnabled = YES; ui
设置isTouchEnabled为YES后,就会调用图层相应的方法来处理触摸输入:spa
这些都是在CCStandardTouchDelegate协议中定义的方法
.net
1> 当单指接触到屏幕时对象
[java] view plaincopyblog
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 继承
2> 当手指在屏幕上移动时游戏
[java] view plaincopy
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
3> 当单指离开屏幕时
[java] view plaincopy
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
4> 当触摸被取消时
[java] view plaincopy
- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
很少会发生触摸被取消的状况,因此大多数状况下可忽略,或用ccTouchesEnded代替,由于ccTouchesCancelled和ccTouchesEnded相似
大部分状况下,咱们须要知道触摸发生在什么位置。这里的触摸事件是由UIKit框架接收的,所以须要把触摸位置转换为OpenGL坐标。
好比在手指移动过程当中:
[java] view plaincopy
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
// 获取触摸对象
UITouch *touch = [touches anyObject];
// 获取触摸在UIView视图上的位置
CGPoint uiPoint = [touch locationInView:touch.view];
// 转换为OpenGL坐标
CGPoint glPoint = [[CCDirector sharedDirector] convertToGL:uiPoint];
}
下面利用一个小例子来综合使用上述的方法,假设图层上有个精灵,我手指触摸到哪,这个精灵的位置就在哪
首先在图层初始化的时候添加精灵
[java] view plaincopy
// 图层的init方法
-(id) init
{
if( (self=[super init])) {
// 初始化一个精灵
CCSprite *lufy = [CCSprite spriteWithFile:@"lufy.png"];
CGSize size = [[CCDirector sharedDirector] winSize];
lufy.position = ccp(size.width * 0.5f, size.height * 0.5f);
// 添加精灵,并设置标记
[self addChild: lufy z:0 tag:kLufyTag];
self.isTouchEnabled = YES;
}
return self;
}
接下来是在图层中接收触摸输入
[java] view plaincopy
// 计算触摸在图层中的位置(OpenGL坐标)
- (CGPoint)locationInLayer:(NSSet *)touches {
// 获取触摸对象
UITouch *touch = [touches anyObject];
// 获取触摸在UIView视图上的位置
CGPoint uiPoint = [touch locationInView:touch.view];
// 转换为OpenGL坐标
CGPoint glPoint = [[CCDirector sharedDirector] convertToGL:uiPoint];
return glPoint;
}
// 因为ccTouchesBegan、ccTouchesMoved、ccTouchesEnded中的作法都是同样,因此抽成一个方法
- (void)dealTouches:(NSSet *)touches {
// 计算触摸的位置
CGPoint point = [self locationInLayer:touches];
// 根据标记获取精灵
CCSprite *lufy = (CCSprite *)[self getChildByTag:kLufyTag];
// 设置精灵的位置
lufy.position = point;
}
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self dealTouches:touches];
}
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[self dealTouches:touches];
}
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self dealTouches:touches];
}
图层的触摸输入暂时讲到这里,其余高级的用法在后面会说起
CCLayer默认状况是不接收加速计输入的,须要显示地设置isAccelerometerEnabled为YES
[java] view plaincopy
self.isAccelerometerEnabled = YES;
设置isAccelerometerEnabled为YES后,就会调用图层相应的方法来处理加速计输入:
这是在UIAccelerometerDelegate协议中定义的方法
[java] view plaincopy
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
// typedef double UIAccelerationValue;
UIAccelerationValue x = acceleration.x;
UIAccelerationValue y = acceleration.y;
UIAccelerationValue z = acceleration.z;
// x,y,z表明三维中任意方向的加速度
}
有时候,咱们想给整个图层设置一种背景颜色,那么就须要用到CCLayerColor了,CCLayerColor是CCLayer的子类
[java] view plaincopy
// 红色:#ffff0000
ccColor4B color = ccc4(255, 0, 0, 255);
// 初始化一个颜色图层
CCLayerColor *layerColor = [CCLayerColor layerWithColor:color];
// 添加到场景中
[scene addChild:layerColor];
效果图:
CCLayerGradient是CCLayerColor的子类,能够给图层设置渐变色
[java] view plaincopy
// 红色:#ffff0000
ccColor4B red = ccc4(255, 0, 0, 255);
// 蓝色:#ff0000ff
ccColor4B blue = ccc4(0, 0, 255, 255);
// 初始化一个渐变图层,从红色渐变到蓝色
CCLayerGradient *layerGradient = [CCLayerGradient layerWithColor:red fadingTo:blue];
// 添加到场景中
[scene addChild:layerGradient];
效果图:
CCLayerMultiplex继承自CCLayer,称为"多重图层"。它能够包含多个CCLayer对象,但在任意时刻只能够有一个CCLayer处于活动状态,用switchTo:和switchToAndReleaseMe:方法能够让某个图层处于活动状态,区别在于switchToAndReleaseMe:方法会先释放当前处于活动状态的图层,再让参数中要求的图层处于活动状态
[java] view plaincopy
// 建立2个图层
CCLayer *layer1 = [CCLayer node];
CCLayer *layer2 = [CCLayer node];
// 建立一个多重图层,包含了layer1和layer2
CCLayerMultiplex *plex = [CCLayerMultiplex layerWithLayers:layer1, layer2, nil];
// 让layer1处于活动状态(layer2还在内存中)
[plex switchTo:0];
// 让layer2处于活动状态(layer1还在内存中)
[plex switchTo:1];
// 释放当前处于活动状态的layer2(layer2从内存中移除),而后让layer1处于活动状态
[plex switchToAndReleaseMe:0];
图层之间的切换是没有过渡效果的