2012-03-07 22 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

関連する問題