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