LayerB должен использовать GL_SCISSOR_TEST
, чтобы обрезать снаружи себя.Вы можете легко зайти в Google для получения дополнительной информации об этом, он в основном определяет rect
, а затем использует glScissor
для удаления внешнего вида.У меня есть класс, который я расширяю, когда мне нужно это сделать, который выглядит следующим образом:
//
// CCNodeClip.h
//
// Created by Ignacio Orlandoni on 7/29/11.
//
#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface CCNodeClip : CCLayer {
}
-(void)preVisit;
-(void)postVisit;
@end
-
//
// CCNodeClip.m
//
// Created by Ignacio Orlandoni on 7/29/11.
//
#import "CCNodeClip.h"
@implementation CCNodeClip
-(void)visit {
[self preVisit];
[super visit];
[self postVisit];
}
-(void)preVisit {
if (!self.visible)
return;
glEnable(GL_SCISSOR_TEST);
CGPoint position = [self position];
//I don't remember if this rect really serves for both orientations, so you may need to change the order of the values here.
CGRect scissorRect = CGRectMake(position.x, position.y, [self contentSize].width, [self contentSize].height);
// CCLOG(@"Scrissor Rect: X: %02f, Y:%02f, W: %02f, H: %02f", scissorRect.origin.x, scissorRect.origin.y, scissorRect.size.width, scissorRect.size.height);
// Handle Retina
scissorRect = CC_RECT_POINTS_TO_PIXELS(scissorRect);
glScissor((GLint) scissorRect.origin.x, (GLint) scissorRect.origin.y,
(GLint) scissorRect.size.width, (GLint) scissorRect.size.height);
}
-(void)postVisit {
glDisable(GL_SCISSOR_TEST);
}
@end
С этим, импортированным в LayerB
, теперь вы можете определить егокак CCNodeClip
вместо CCLayer
.
Некоторые ссылки ...
glScissor << cocos2d Forum </a>
Обрезка в форме круга с открытыми окнами в cocos2d << StackOverflow </a>
Cocos2d iPhone - Спрайт клип / маска / рамка << StackOverflow </a>
Другой драгоценный камень Cocos2D: ClippingNode << Learn-Cocos2d.com </a>
В качестве примечания ...
CCScaleTo + CCMoveTo можно избежать, еслиточка привязки спрайта центрируется, поэтому изображение остается в центре в контейнере по мере его масштабирования.(.anchorPoint = ccp(0.5, 0.5);
)