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