5

このようなアウトラインを動的に作成する必要があります。

赤の 2px アウトライン

CCSprite 用ではなく、1 つの CCNode に統合された複数のアニメーション化された CCSprite 用です。私は考えています:

  1. CCNode のコンテンツをテクスチャにコピーする ( canvasBitmapData.draw(sourceDisplayObject)AS3 のように)
  2. 結果のテクスチャで CCSprite を作成する
  3. スプライトを輪郭の色に着色し、少し拡大します
  4. ノード内の他のスプライトの後ろにスプライトを配置する

ステップ 1 の実行方法がわかりません。また、ステップ 3 のティント スケールではなく、テクスチャの不透明なピクセルの周りに「真のストローク」を描画する方が速いのではないでしょうか?

4

2 に答える 2

1

私はさまざまな情報源から構築した汎用関数を持っています (ここで参照できないと言うのは恥ずかしいことです)。それが行うことは、CCSprite を取得し、その背後に置くことができるストロークを作成し、CCRenderTexture に返すことです。渡されたスプライトに子がいる場合 (あなたのもののように)、あなたが望むことをしない理由はわかりませんが、試したことはありません。

それが機能する場合は次のとおりです。

@implementation Cocosutil

+(CCRenderTexture*) createStrokeForSprite:(CCSprite*)sprite  size:(float)size  color:(ccColor3B)cor
{
    CCRenderTexture* rt = [CCRenderTexture renderTextureWithWidth:sprite.texture.contentSize.width+size*2  height:sprite.texture.contentSize.height+size*2];
    CGPoint originalPos = [sprite position];
    ccColor3B originalColor = [sprite color];
    BOOL originalVisibility = [sprite visible];
    [sprite setColor:cor];
    [sprite setVisible:YES];
    ccBlendFunc originalBlend = [sprite blendFunc];
    [sprite setBlendFunc:(ccBlendFunc) { GL_SRC_ALPHA, GL_ONE }];
    CGPoint bottomLeft = ccp(sprite.texture.contentSize.width * sprite.anchorPoint.x + size, sprite.texture.contentSize.height * sprite.anchorPoint.y + size);
    CGPoint positionOffset = ccp(sprite.texture.contentSize.width * sprite.anchorPoint.x - sprite.texture.contentSize.width/2,sprite.texture.contentSize.height * sprite.anchorPoint.y - sprite.texture.contentSize.height/2);
    CGPoint position = ccpSub(originalPos, positionOffset);

    [rt begin];
    for (int i=0; i<360; i+=30)
    {
        [sprite setPosition:ccp(bottomLeft.x + sin(CC_DEGREES_TO_RADIANS(i))*size, bottomLeft.y + cos(CC_DEGREES_TO_RADIANS(i))*size)];
        [sprite visit];
    }
    [rt end];
    [sprite setPosition:originalPos];
    [sprite setColor:originalColor];
    [sprite setBlendFunc:originalBlend];
    [sprite setVisible:originalVisibility];
    [rt setPosition:position];
    return rt;
}

@end

そして、ここに私がそれを使用するコードがあります:

- (id) initWithSprite:(CCSprite*)sprite color:(ccColor3B)color strokeSize:(float)strokeSize strokeColor:(ccColor3B)strokeColor {
    self = [super init];

    if (self != nil) {
        strokeColor_ = strokeColor;
        strokeSize_ = strokeSize;
        CCRenderTexture *stroke = [CocosUtil createStrokeForSprite:sprite size:strokeSize color:strokeColor];
        [self addChild:stroke z:kZStroke tag:kStroke];
        [self addChild:sprite z:kZLabel tag:kLabel];
        [self setContentSize:[sprite contentSize]];
    }    

    return self;
}
于 2013-03-20T02:29:58.567 に答える