一个游戏中能够有非常多个场景,每一个场景里面又可能包括有多个图层,这里的图层一般就是CCLayer对象。CCLayer本身差点儿没什么功能。对照CCNode,CCLayer可用于接收触摸和加速计输入。事实上。cocos2d对图层并没有严格的要求,图层不一定要使用CCLayer类,它也能够是一个简单的CCNode。为什么呢?我们新建一个图层不就是为了能够容纳很多其它的子节点么,CCNode也能够加入子节点啊。所以。假设你的图层不须要接收触摸和加速计输入,就尽量使用CCNode表示图层,CCLayer由于能够接收触摸和加速计输入会添加不必要的开销。移动、缩放、旋转整个图层,图层上的全部节点也会跟着一起移动、缩放、旋转。
经常使用设置
1.接收触摸输入
CCLayer默认情况是不接收触摸输入的,须要显示地设置isTouchEnabled为YES
-
self.isTouchEnabled = YES;
设置isTouchEnabled为YES后,就会调用图层对应的方法来处理触摸输入:
这些都是在CCStandardTouchDelegate协议中定义的方法
1> 当单指接触到屏幕时
-
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
2> 当手指在屏幕上移动时
-
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
3> 当单指离开屏幕时
-
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
4> 当触摸被取消时
-
- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
非常少会发生触摸被取消的情况,所以大多数情况下可忽略,或用ccTouchesEnded取代,由于ccTouchesCancelled和ccTouchesEnded类似
大部分情况下,我们须要知道触摸发生在什么位置。这里的触摸事件是由UIKit框架接收的,因此须要把触摸位置转换为OpenGL坐标。
比方在手指移动过程中:
-
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
-
-
UITouch *touch = [touches anyObject];
-
-
CGPoint uiPoint = [touch locationInView:touch.view];
-
-
CGPoint glPoint = [[CCDirector sharedDirector] convertToGL:uiPoint];
-
}
以下利用一个小样例来综合使用上述的方法。如果图层上有个精灵,我手指触摸到哪,这个精灵的位置就在哪
首先在图层初始化的时候加入精灵
-
-
-(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;
-
}
接下来是在图层中接收触摸输入
-
-
- (CGPoint)locationInLayer:(NSSet *)touches {
-
-
UITouch *touch = [touches anyObject];
-
-
CGPoint uiPoint = [touch locationInView:touch.view];
-
-
CGPoint glPoint = [[CCDirector sharedDirector] convertToGL:uiPoint];
-
-
return glPoint;
-
}
-
-
-
- (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];
-
}
图层的触摸输入临时说到这里,其它高级的使用方法在后面会提及
2.接收加速计输入
CCLayer默认情况是不接收加速计输入的,须要显示地设置isAccelerometerEnabled为YES
-
self.isAccelerometerEnabled = YES;
设置isAccelerometerEnabled为YES后,就会调用图层对应的方法来处理加速计输入:
这是在UIAccelerometerDelegate协议中定义的方法
-
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
-
-
UIAccelerationValue x = acceleration.x;
-
UIAccelerationValue y = acceleration.y;
-
UIAccelerationValue z = acceleration.z;
-
-
}
CCLayerColor
有时候,我们想给整个图层设置一种背景颜色,那么就须要用到CCLayerColor了。CCLayerColor是CCLayer的子类
-
-
ccColor4B color = ccc4(255, 0, 0, 255);
-
-
CCLayerColor *layerColor = [CCLayerColor layerWithColor:color];
-
-
[scene addChild:layerColor];
效果图:
CCLayerGradient
CCLayerGradient是CCLayerColor的子类,能够给图层设置渐变色
-
-
ccColor4B red = ccc4(255, 0, 0, 255);
-
-
ccColor4B blue = ccc4(0, 0, 255, 255);
-
-
CCLayerGradient *layerGradient = [CCLayerGradient layerWithColor:red fadingTo:blue];
-
-
[scene addChild:layerGradient];
效果图:
CCLayerMultiplex
CCLayerMultiplex继承自CCLayer。称为"多重图层"。它能够包括多个CCLayer对象,但在随意时刻仅仅能够有一个CCLayer处于活动状态,用switchTo:和switchToAndReleaseMe:方法能够让某个图层处于活动状态。差别在于switchToAndReleaseMe:方法会先释放当前处于活动状态的图层,再让參数中要求的图层处于活动状态
-
-
CCLayer *layer1 = [CCLayer node];
-
CCLayer *layer2 = [CCLayer node];
-
-
-
-
CCLayerMultiplex *plex = [CCLayerMultiplex layerWithLayers:layer1, layer2, nil];
-
-
-
[plex switchTo:0];
-
-
-
[plex switchTo:1];
-
-
-
[plex switchToAndReleaseMe:0];
图层之间的切换是没有过渡效果的
原文地址:http://blog.csdn.net/q199109106q/article/details/8601533
感谢作者~!