Cocos2d, как масштабировать спрайт без масштабирования слоя? Или, Как масштабировать и обрезать спрайт / слой? - PullRequest
2 голосов
/ 08 марта 2012

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

1 Ответ

1 голос
/ 09 марта 2012

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

Обрезка в форме круга с открытыми окнами в cocos2d << StackOverflow </a>

Cocos2d iPhone - Спрайт клип / маска / рамка << StackOverflow </a>

Другой драгоценный камень Cocos2D: ClippingNode << Learn-Cocos2d.com </a>

В качестве примечания ...

CCScaleTo + CCMoveTo можно избежать, еслиточка привязки спрайта центрируется, поэтому изображение остается в центре в контейнере по мере его масштабирования.(.anchorPoint = ccp(0.5, 0.5);)

...