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
。
一些链接...
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);
)
使用你的代码似乎完美的工作!这很容易实现。我的应用程序仅适用于横向,我不必在代码中改变任何内容。就CCScaleToTo和MoveTo而言,我实际上是根据用户触摸位置而不是中心来放大图层的不同点。虽然好点。非常感谢! – BobbyScon 2012-03-09 14:31:56
尽管问题已解决,但我建议您查看'GlScissor',试着全面了解它是如何工作的以及它可以做什么。不用谢。 – 2012-03-09 14:41:00
是的,只要我看到你的帖子(大约3分钟后你发布)我做了一个谷歌搜索,并找到了许多你发布的相同链接。我的问题确实是一个不知道要搜索什么的情况。我以前没听说过GLScissor。您的代码似乎比Learn-Cocos2d.com上的设置更有效 – BobbyScon 2012-03-09 14:44:52