2

iPadアプリのセットアップ:SceneAにはlayerA(1024x768)が含まれています。layerAのボタンを押すと、CCMoveToアクションを使用してlayerBが上にドロップダウンします。LayerBはわずか800x600なので、その背後にlayerAが表示されます(オーバーレイされた一時停止画面タイプの効果を考えてみてください)。LayerBには、ユーザーがボタンを押すことでズームインできる800x600のスプライトが含まれています。ズーム効果は、CCScaleToとCCMoveToを組み合わせたもので、ズームインしている部分の中央に配置されます。ただし、スプライトがスケーリングすると、layerAの上にあるlayerBもスケーリングします。含まれているウィンドウ内でスプライトをスケーリングする方法はありますか?

4

1 に答える 1

1

LayerBは、を使用しGL_SCISSOR_TESTてそれ自体の外側をトリミングする必要があります。あなたはそれについてのより多くの情報を簡単にグーグルで検索することができます、それは基本的にを定義し、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として定義できるようになります。CCNodeClipCCLayer

いくつかのリンク...

glScissor<<cocos2dフォーラム

cocos2dのopengl-esによる円形状のクリッピング<<StackOverflow

Cocos2diPhone-スプライトクリッピング/マスク/フレーム<<StackOverflow

別のCocos2Dジェム:ClippingNode << Learn-Cocos2d.com

補足として...

CCScaleTo + CCMoveToは、スプライトのアンカーポイントが中央に配置されている場合は回避できるため、画像は拡大縮小時にコンテナの中央に留まります。(.anchorPoint = ccp(0.5, 0.5);

于 2012-03-09T13:43:16.163 に答える