1

テクスチャと glDrawArray を使用して塗りつぶすポリゴンがあります (このチュートリアルで説明されている方法を使用します: http://www.raywenderlich.com/32954/how-to-create-a-game-like-tiny-wings-with -cocos2d-2-x-part-1 )。

ゲームプレイ中にランダムに生成される単色を使用してポリゴンを塗りつぶしたいと考えています。チュートリアルの手法を使用してこれを行うには、単色のテクスチャを動的に作成する必要があります (たとえば、1x1 の赤い正方形を生成し、それを使用してポリゴンを塗りつぶすことができます)。

を使用してスプライトの色を変更する方法と同様に、cocos2d でテクスチャの色を変更する方法はあります[mySprite changeColor:ccRed]か? 最初のテクスチャ、たとえば 1x1 の白い正方形がある場合、そのテクスチャを 1x1 の赤い正方形に変更する方法はありますか?

私はすでにCCRenderTextureを使用してみました(このチュートリアルで説明されているように:http://www.raywenderlich.com/33266/how-to-create-dynamic-textures-with-ccrendertexture-in-cocos2d-2-x)が、多数のポリゴンを塗りつぶしますが、この方法は非常に遅いことがわかります。

また、次のコードを使用してテクスチャを作成しようとしました。

// fill with solid red   
GLubyte buffer[3] = {255, 0, 0};

CCTexture2D *texture = [[CCTexture2D alloc] initWithData:buffer pixelFormat:kCCTexture2DPixelFormat_RGB888 pixelsWide:1 pixelsHigh:1 contentSize:m];

上記はかなりうまく機能しますが、CCSprite からテクスチャを取得するよりもまだ遅くなります。基本的に、動的テクスチャをできるだけ効率的に生成する方法を探しています。

ポリゴンを塗りつぶすために使用しているコードは次のとおりです。

    GLubyte buffer[3] = {arc4random()%256,arc4random()%256,arc4random()%256};

    CGSize size;
    size.width = 2; size.height = 2;

    CCTexture2D *texture = [[CCTexture2D alloc] initWithData:buffer pixelFormat:kCCTexture2DPixelFormat_RGB888 pixelsWide:1 pixelsHigh:1 contentSize:size];

    ccTexParams params = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT};
    [texture setTexParameters:&params];

    ccGLBindTexture2D([texture name]);

    glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, array); //where array is an array of points defining a polygon
    glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, array);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei)4);

    [texture dealloc];

どんな助けでも大歓迎です。

4

1 に答える 1

1

多分あなたが探しているのは可変テクスチャですか?

これは、CCMutableTextures http://www.cocos2d-iphone.org/pixel-based-destructible-ground-with-cocos2d/を利用した素晴らしいブログ投稿です。

これが私のオープンソースプロジェクトですhttps://github.com/crebstar/PWNDestructibleTerrain

これは、破壊可能な地形環境を作成するために夏に取り組んできたオープン ソース プロジェクトです。投稿したばかりのレポには物理演算が含まれていません (近日公開予定) が、スプライトの変更可能なテクスチャをラップするインターフェイスを提供します。1 か月前に作業を開始したのでかなり原始的ですが、CCMutableTexture クラスの使用方法を示しています。

約 2 年前、Lam Hoang Pham が CCMutableTexture クラスをオープン ソースとしてリリースしました。私は彼のライブラリを基に構築し、より多くの描画ユーティリティとその他のさまざまな小さな機能を提供しました。CCMutableTexture クラスを使用する際の 1 つの注意点は、PVR を使用できず、UIImage を使用してテクスチャを提供する必要があることです。この方法で多くのパフォーマンスの問題に気付いたことはありません。主な問題は、スプライトシートを使用できないことです。

とにかく、ここにそれがどのように使用されるかのいくつかの例があります:

 // FROM THE GAME LAYER
 [destTerrainSystem drawCircle:ccp(300,100) withRadius:30.0f withColor:ccc4(0, 0, 0, 0)];
 [destTerrainSystem drawSquare:ccp(500,100) withRadius:30.0f withColor:ccc4(0, 0, 0, 0)];


 // IN DESTTERRAIN
 -(void) drawCircle:(CGPoint)circleOrigin withRadius:(float)radius withColor:(ccColor4B)color {

int localXOrigin = circleOrigin.x - self.position.x;
int localYOrigin = self.contentSize.height - (circleOrigin.y - self.position.y);

CCMutableTexture2D * terrainTexture = (CCMutableTexture2D *) [self texture];

[terrainTexture drawCircle:ccp(localXOrigin, localYOrigin) withRadius:radius withColor:color];

if ([delegate shouldApplyAfterEachDraw] || self.applyAfterDraw) [terrainTexture apply];

} // end drawCircle

-(void) drawSquare:(CGPoint)squareOrigin withRadius:(float)radius withColor:(ccColor4B)color {

int localXOrigin = squareOrigin.x - self.position.x;
int localYOrigin = self.contentSize.height - (squareOrigin.y - self.position.y);

CCMutableTexture2D * terrainTexture = (CCMutableTexture2D *) [self texture];

[terrainTexture drawSquare:ccp(localXOrigin, localYOrigin) withRadius:radius withColor:color];

if ([delegate shouldApplyAfterEachDraw] || self.applyAfterDraw) 
    [terrainTexture apply];
} // end drawSquare


// IN CCMUTABLETEXTURE
-(void) drawCircle:(CGPoint)circleOrigin withRadius:(float)radius withColor:(ccColor4B)color {
/*
 Draws a circle. There is some overlap here but it is fairly efficient
 */
int x = radius;
int y = 0;
int radiusError = 1 - x;

while (x >= y) {

    // Bottom half
    [self drawHorizontalLine:(x + circleOrigin.x) :(circleOrigin.x - x) :(y + circleOrigin.y) withColor:color];

    // Top half
    [self drawHorizontalLine:(x + circleOrigin.x) :(circleOrigin.x - x) :(circleOrigin.y - y) withColor:color];

    // left side
    [self drawVerticalLine:(x + circleOrigin.y) endY:(circleOrigin.y - x) atX:(-y + circleOrigin.x) withColor:color];

    // right side
    [self drawVerticalLine:(x + circleOrigin.y) endY:(circleOrigin.y - x) atX:(y + circleOrigin.x) withColor:color];

    y++;

    if (radiusError < 0) {
        radiusError = radiusError +  ((2 * y) +1);
    } else {
        x--; // Comment this out to draw a square
        radiusError = radiusError + (2 * (y - x + 1));
    } // end if

} // end while

// Cache the altered col values
for (int col = circleOrigin.x - radius; col <= circleOrigin.x + radius; col++) {
    if (col < 0 || col >= size_.width) continue;
    [alteredColumns addObject:[NSNumber numberWithInt:col]];
} // end for

} // end draw circle

CCMutableTexture は、テクスチャのモデルをピクセルの配列 (行優先ストレージ) に保持します。その後、各ピクセルのプロパティにアクセス、変更、およびポーリングできます。配列を変更したら、apply を呼び出して変更を適用できます。apply は高価な呼び出しになる可能性があるため、これにより、ある程度の柔軟性とパフォーマンスの調整が可能になります。

できることは他にもたくさんありますが、これは良い出発点になるはずです。どちらのリンクにも、CCMutableTexture の使用方法に関するサンプル コードがあります。

お役に立てれば

于 2013-07-22T01:15:44.373 に答える