2012-03-07 3 views
2

iPad App setup: SceneA содержит layerA - 1024x768. Нажмите кнопку в layerA, слой B опустится сверху, используя действие CCMoveTo. LayerB - всего 800x600, поэтому вы можете видеть layerA за ним (подумайте о эффекте типа наложенного эффекта паузы). LayerB содержит спрайт 800x600, который пользователь может увеличить, нажав кнопку. Эффект масштабирования - это просто комбинация CCScaleTo и CCMoveTo, чтобы он был сосредоточен на части, в которой он масштабируется. Однако, когда масштаб спрайтов, так же, как и верхний слой layerB слоя layerA. Есть ли способ масштабирования спрайта внутри содержащегося окна?Cocos2d как масштабировать спрайт без масштабирования слоя? Или, как масштабировать и обрезать спрайт/слой?

ответ

1

LayerB должен использовать 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 

-

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

Использование вашего кода, похоже, отлично работает! Это было очень легко реализовать. Мое приложение имеет только ориентацию на ландшафт, и мне не нужно ничего менять в коде. Что касается CCScaleTo и MoveTo, я на самом деле масштабируюсь в разных точках слоя, основываясь на том, куда касается пользователя, а не только в центре. Хороший момент. Спасибо! – BobbyScon

+0

Несмотря на то, что проблема решена, я рекомендую вам посмотреть 'GlScissor', чтобы попытаться полностью понять, как это работает и что он может сделать. Добро пожаловать. –

+0

Да, как только я увидел ваше сообщение (примерно через 3 минуты после того, как вы его разместили), я сделал поиск в Google и нашел много тех же ссылок, что и вы. Моя проблема была действительно случай, когда вы не знали, что искать. Раньше я не слышал о GLScissor. Ваш код кажется более эффективным, чем настройка на Learn-Cocos2d.com. – BobbyScon

Смежные вопросы