2

iPad App 设置:SceneA 包含 layerA - 1024x768。按下 layerA 中的按钮,layerB 使用 CCMoveTo 动作从顶部下降。LayerB 只有 800x600,所以你可以看到它后面的 layerA(想想叠加的暂停屏幕类型效果)。LayerB 包含一个 800x600 的精灵,用户可以通过按下按钮来放大它。缩放效果只是 CCScaleTo 和 CCMoveTo 的组合,以使其保持在它正在放大的部分的中心。然而,当 sprite 缩放时,layerB 也会在 layerA 之上。有没有办法在包含的窗口中缩放精灵?

4

1 回答 1

1

LayerB 应该使用GL_SCISSOR_TEST来修剪自身的外部。您可以轻松地 google 以获取有关它的更多信息,它基本上定义了 arect然后使用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后,您现在可以将其定义为 aCCNodeClip而不是CCLayer.

一些链接...

glScissor << cocos2d 论坛

在 cocos2d 中使用 opengl-es 进行圆形裁剪 << StackOverflow

Cocos2d iPhone - 精灵剪辑/蒙版/框架 << StackOverflow

另一个 Cocos2D gem:ClippingNode << Learn-Cocos2d.com

作为旁注...

如果精灵的锚点居中,则可以避免 CCScaleTo + CCMoveTo,因此图像在缩放时保持在容器的中心。( .anchorPoint = ccp(0.5, 0.5);)

于 2012-03-09T13:43:16.163 回答