Cocos2d如何在不缩放图层的情况下缩放精灵?或者,如何缩放和裁剪精灵/图层?

时间:2012-03-07 21:21:19

标签: xcode cocos2d-iphone scale cclayer

iPad App设置:SceneA包含layerA - 1024x768。按下layerA中的按钮,使用CCMoveTo操作将layerB下降到顶部。 LayerB只有800x600,所以你可以看到它背后的layerA(想想一个重​​叠的暂停屏幕类型效果)。 LayerB包含一个800x600精灵,用户可以通过按下按钮放大。缩放效果只是CCScaleTo和CCMoveTo的组合,使其以放大的部分为中心。但是,当精灵缩放时,layerB的layerB也是如此。有没有办法在包含的窗口内缩放精灵?

1 个答案:

答案 0 :(得分:1)

LayerB应该使用GL_SCISSOR_TEST修剪自身的外部。您可以轻松地谷歌搜索有关它的更多信息,它基本上定义了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

Circle shape clipping with opengl-es in cocos2d << StackOverflow

Cocos2d iPhone - Sprite cliping/mask/frame << StackOverflow

Another Cocos2D gem: ClippingNode << Learn-Cocos2d.com

作为旁注......

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