Cocos2d iPhone - справка Sprite/маска/рамка

как я могу обрезать/обрезать/маску или просто установить кадр CCSprite в Cocos2D?

Нечто похожее на: установка рамки для UIView, с отсечением subviews = TRUE

В моем CCSprite Main Sprite добавлено несколько Child Sprite. Мне нужна только Маска часть этого основного спрайта Sprite. Есть ли способ обрезать или использовать маску для CCSprite?

Я мог бы обрезать фон и слой, который сверху, оставив только эту видимую область, но это единственный способ?!

вот образец изображения, демонстрирующий то, что я пытаюсь достичь: alt text http://dnamique.com/maskSprite.jpg

Ответы

Ответ 1

В итоге я использовал GL_SCISSOR.

в MainSprite я импигментировал:

- (void) visit
{
    if (!self.visible) {
        return;
    }
    glEnable(GL_SCISSOR_TEST);
    glScissor(x, y, width, height);   
    [super visit];
    glDisable(GL_SCISSOR_TEST);
}

Это закрепит или замаскирует указанную область.

Единственный сложный бит в том, что в ландшафтном режиме Cocos2D имеет 0,0 в нижней левой части экрана, в то время как OpenGL имеет его в нижнем правом углу, так как он не учитывает ориентацию экрана.

Другими словами, для OpenGL у вас есть экран с повернутым портретом.

Ответ 2

Я написал класс ClippingNode, который делает именно это. Вы можете добавить другие узлы (спрайты, метки и т.д.) В ClippingNode, и они будут отображаться только в области, указанной ClippingNode. Он также учитывает вращение устройства.

Внутри он использует GL_SCISSOR_TEST, как в ответе Баха.

http://www.learn-cocos2d.com/2011/01/cocos2d-gem-clippingnode/

Ответ 3

Я попробовал использовать Steffen Itterheim ClippingNode, но не смог работать в достаточно надежном достаточно моды для моих нужд.

Верьте или нет, приведенный ниже код работает достаточно хорошо и должен быть полным кода. Он обрабатывает изменения ориентации устройства, anchorPoint, положение, масштаб (scaleX, scaleY). Для cocos2d v2 вам просто нужно закомментируйте вызовы glPushMatrix и glPopMatrix..

Чтобы использовать, просто установите свойства position и contentSize и добавьте дочерний/дочерний элемент, который вы хотите привязать к этому экземпляру ClippingNode. Свойство contentSize используется для определения размеров области отсечения.

example of usage:
ClippingNode *clipNode = [[ClippingNode alloc] init];
clipNode.anchorPoint = ccp(0.5f, 0);
clipNode.position = ccp(100, 25);
clipNode.contentSize = CGSizeMake(120, 120);

// add clipNode to your node hierarchy.
[parentNode addChild:clipNode];

// add one or more children to your clipNode:
[clipNode addChild:child1];

// ClippingNode.h
// CC0 - (public domain. Use in anyway you see fit.)
// No warranty of any kind is expressed or implied.
//
// by UChin Kim.
//
// the caller can simply set the regular cocos2d
// properties: position and contentSize to define the clipping region implicitly (i.e. the
// position and contentSize of the ClippingNode is the clipping region to be used).
// as an added bonus, position seems to work as expected (relative to parent node, instead of
// requiring absolute positioning).
//
// also, anchorPoint and scale properties seem to work as expected as well..
// no special code is neeed to handle device orientation changes correctly..
//
// To visually see exactly what is being clipped, set the following #define
// #define SHOW_CLIPPED_REGION_IN_LIGHT_RED 1
//

#import "cocos2d.h"

@interface ClippingNode : CCNode

@end

//
// ClippingNode.m
//
#import "ClippingNode.h"

@implementation ClippingNode

-(void) visit
{
CGPoint worldOrg = [self convertToWorldSpace:ccp(0, 0)];
CGPoint dest = [self convertToWorldSpace:ccp(self.contentSize.width, self.contentSize.height)];
CGPoint dims = ccpSub(dest, worldOrg);

glPushMatrix();
glEnable(GL_SCISSOR_TEST);

glScissor(worldOrg.x, worldOrg.y, dims.x, dims.y);

#if SHOW_CLIPPED_REGION_IN_LIGHT_RED
glColor4ub(64, 0, 0, 128);
ccDrawSolidRect(ccp(0, 0), ccp(1024, 1024));
#endif

[super visit];

glDisable(GL_SCISSOR_TEST);
glPopMatrix();
}

@end