Cocos2d如何缩放sprite而不缩放图层?或者,如何缩放和裁剪精灵/图层?

问题描述:

iPad应用程序设置:SceneA包含layerA - 1024x768。按下layerA中的一个按钮,layerB使用CCMoveTo操作在顶部下拉。 LayerB仅为800x600,因此您可以在其后看到layerA(想想覆盖式暂停屏幕类型效果)。 LayerB包含一个800x600的精灵,用户可以通过按下一个按钮来放大。缩放效果仅仅是CCScaleTo和CCMoveTo的组合,以使其保持居中在放大的部分上。然而,当精灵缩放时,层B在层A的顶端也会变大。有没有办法在包含的窗口中缩放精灵?Cocos2d如何缩放sprite而不缩放图层?或者,如何缩放和裁剪精灵/图层?

LayerB应使用GL_SCISSOR_TEST修剪自身的外部。您可以轻松地谷歌了解更多关于它的信息,它基本上定义了一个rect,然后使用glScissor去除外部。我有一个I类延伸,当我需要做到这一点,那去如下:

// 
// 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);

+0

使用你的代码似乎完美的工作!这很容易实现。我的应用程序仅适用于横向,我不必在代码中改变任何内容。就CCScaleToTo和MoveTo而言,我实际上是根据用户触摸位置而不是中心来放大图层的不同点。虽然好点。非常感谢! – BobbyScon 2012-03-09 14:31:56

+0

尽管问题已解决,但我建议您查看'GlScissor',试着全面了解它是如何工作的以及它可以做什么。不用谢。 – 2012-03-09 14:41:00

+0

是的,只要我看到你的帖子(大约3分钟后你发布)我做了一个谷歌搜索,并找到了许多你发布的相同链接。我的问题确实是一个不知道要搜索什么的情况。我以前没听说过GLScissor。您的代码似乎比Learn-Cocos2d.com上的设置更有效 – BobbyScon 2012-03-09 14:44:52