iPad 앱 설정 : SceneA에 레이어 A - 1024x768이 포함되어 있습니다. 레이어 A의 버튼을 누르면 레이어 B가 CCMoveTo 액션을 사용하여 위에 드롭 다운됩니다. LayerB는 800x600이므로 배후에 layerA를 볼 수 있습니다 (오버레이 된 일시 중지 화면 유형 효과를 생각해보십시오). LayerB에는 사용자가 버튼을 눌러 확대 할 수있는 800x600 스프라이트가 있습니다. 확대/축소 효과는 단순히 CCScaleTo와 CCMoveTo를 조합하여 확대하는 부분의 중앙에 유지합니다. 그러나 스프라이트가 비례 할 때 레이어 A의 레이어 B가 오버랩됩니다. 포함 된 창 내에서 스프라이트의 크기를 조절하는 방법이 있습니까?Cocos2d 스케일을 조정하지 않고 스프라이트를 스케일하는 방법은 무엇입니까? 또는 스프라이트/레이어를 크기 조절하고 자르는 방법은 무엇입니까?
2
A
답변
1
레이어 B는 GL_SCISSOR_TEST
을 사용하여 자체 외부를 트리밍해야합니다. 당신은 쉽게 그것에 대해 더 많은 정보를 google 수 있습니다, 그것은 기본적으로 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.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
, 당신은 지금 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);
)
코드를 사용하면 완벽하게 작동하는 것 같습니다. 그것은 구현하기 쉬운 죽은 사람이었습니다. 내 앱은 가로 방향 일 뿐이므로 코드에서 아무 것도 변경할 필요가 없습니다. CCScaleTo와 MoveTo가가는 한, 실제로 센터가 아닌 사용자가 접촉하는 위치를 기반으로 레이어의 다른 지점을 실제로 확대하고 있습니다. 그래도 좋은 지적. 정말 고마워! – BobbyScon
문제가 해결 되었음에도 불구하고'GlScissor'를 찾아서 어떻게 작동하는지 그리고 무엇이 가능한지 완전히 이해할 것을 권한다. 천만에요. –
네, 게시물을 본 (약 3 분 후) 나는 Google 검색을 수행하고 게시 한 동일한 링크를 많이 발견했습니다. 내 문제는 정말로 무엇을 검색해야할지 모르는 경우입니다. 전에는 GLScissor에 대해 들어 보지 못했습니다. 귀하의 코드는 Learn-Cocos2d.com – BobbyScon