2012-03-07 5 views
2

iPad 앱 설정 : SceneA에 레이어 A - 1024x768이 포함되어 있습니다. 레이어 A의 버튼을 누르면 레이어 B가 CCMoveTo 액션을 사용하여 위에 드롭 다운됩니다. LayerB는 800x600이므로 배후에 layerA를 볼 수 있습니다 (오버레이 된 일시 중지 화면 유형 효과를 생각해보십시오). LayerB에는 사용자가 버튼을 눌러 확대 할 수있는 800x600 스프라이트가 있습니다. 확대/축소 효과는 단순히 CCScaleTo와 CCMoveTo를 조합하여 확대하는 부분의 중앙에 유지합니다. 그러나 스프라이트가 비례 할 때 레이어 A의 레이어 B가 오버랩됩니다. 포함 된 창 내에서 스프라이트의 크기를 조절하는 방법이 있습니까?Cocos2d 스케일을 조정하지 않고 스프라이트를 스케일하는 방법은 무엇입니까? 또는 스프라이트/레이어를 크기 조절하고 자르는 방법은 무엇입니까?

답변

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의로 정의 할 수 있습니다 .

일부 링크 ...

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

코드를 사용하면 완벽하게 작동하는 것 같습니다. 그것은 구현하기 쉬운 죽은 사람이었습니다. 내 앱은 가로 방향 일 뿐이므로 코드에서 아무 것도 변경할 필요가 없습니다. CCScaleTo와 MoveTo가가는 한, 실제로 센터가 아닌 사용자가 접촉하는 위치를 기반으로 레이어의 다른 지점을 실제로 확대하고 있습니다. 그래도 좋은 지적. 정말 고마워! – BobbyScon

+0

문제가 해결 되었음에도 불구하고'GlScissor'를 찾아서 어떻게 작동하는지 그리고 무엇이 가능한지 완전히 이해할 것을 권한다. 천만에요. –

+0

네, 게시물을 본 (약 3 분 후) 나는 Google 검색을 수행하고 게시 한 동일한 링크를 많이 발견했습니다. 내 문제는 정말로 무엇을 검색해야할지 모르는 경우입니다. 전에는 GLScissor에 대해 들어 보지 못했습니다. 귀하의 코드는 Learn-Cocos2d.com – BobbyScon