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

Xcode Cocos2d如何在不缩放图层的情况下缩放精灵?或者,如何缩放和裁剪精灵/图层?,xcode,cocos2d-iphone,scale,cclayer,Xcode,Cocos2d Iphone,Scale,Cclayer,iPad应用程序设置:SceneA包含layerA-1024x768。按下layerA中的按钮,layerB使用CCMoveTo动作从顶部下降。LayerB只有800x600,因此您可以看到它后面的layerA(想想叠加的暂停屏幕类型效果)。LayerB包含一个800x600精灵,用户可以通过按下按钮放大该精灵。缩放效果只是CCScaleTo和CCMoveTo的组合,以使其集中在其放大的零件上。然而,当精灵缩放时,layerB覆盖layerA的顶部。有没有办法在包含的窗口内缩放精灵 LayerB

iPad应用程序设置:SceneA包含layerA-1024x768。按下layerA中的按钮,layerB使用CCMoveTo动作从顶部下降。LayerB只有800x600,因此您可以看到它后面的layerA(想想叠加的暂停屏幕类型效果)。LayerB包含一个800x600精灵,用户可以通过按下按钮放大该精灵。缩放效果只是CCScaleTo和CCMoveTo的组合,以使其集中在其放大的零件上。然而,当精灵缩放时,layerB覆盖layerA的顶部。有没有办法在包含的窗口内缩放精灵

LayerB应使用
GL_剪刀测试
来修剪自身的外部。你可以很容易地在谷歌上搜索更多关于它的信息,它基本上定义了一个
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
将其导入到
LayerB
,现在可以将其定义为
CCNodeClip
,而不是
CCLayer

一些链接…


glScissor使用您的代码似乎工作完美!这非常容易实现。我的应用程序只是横向的,我不需要修改你代码中的任何内容。至于CCScaleTo和MoveTo,我实际上是根据用户触摸的位置放大图层的不同点,而不仅仅是中心。不过这一点很好。非常感谢!即使问题已经解决,我建议您一定要查找
GlScissor
,尝试并充分了解它是如何工作的以及它可以做什么。不客气。是的,我一看到你的帖子(大约在你发布后3分钟),就在谷歌上搜索了一下,找到了很多与你发布的相同的链接。我的问题其实是不知道该找什么。我以前没听说过GLScissor。您的代码似乎比Learn-Cocos2d.com上的设置更有效。这取决于您需要什么@LearnCos2D的代码解释了缩放、方向和方向更改。此外,文章本身也提供了很好的提示和链接。
//
//  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