0

テクスチャにパーティクルをロードするパーティクルシステムを使用しようとしています。単なる練習なので、「手動で」テクスチャを生成するのは問題ありません。したがって、この場合、データのバッファを割り当てて、それを赤色(RGBA 32ビット形式)で塗りつぶします。

しかし、問題は、プログラムの実行が開始されたときに、黒い画面が表示されるだけで、期待したものが表示されないことです(いくつかの赤い粒子が移動します)。

コメントで私がやろうとしていることを説明します:

if( (self=[super init]))
{
    NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];

    uint32_t mask= 255+pow(255, 4); // This is a 32 bit red pixel
    NSUInteger size=256; // The texture is 256x256
    void* buffer= malloc(size*size*4); // Here I hold the data, it will be all red
    for(NSUInteger i=0; i<size; i++)
    {
        for(NSUInteger j=0; j<size; j++)
        {
            memcpy(buffer+j+i*32, &mask, 4);
        }
    }
    NSData* data=[[[NSData alloc]initWithBytesNoCopy: buffer length: size*size*4 freeWhenDone: YES]autorelease];  // I wrap it into NSData to automatically release it later. 
    CCTexture2D* texture=[[[CCTexture2D alloc]initWithData: data.bytes pixelFormat: kCCTexture2DPixelFormat_RGBA8888 pixelsWide: size pixelsHigh: size contentSize: CGSizeMake(size, size)]autorelease];
    CCParticleSystemQuad* system=[[[CCParticleSystemQuad alloc]initWithTotalParticles: 100]autorelease];
    system.texture= texture;  // I set the texture in a way that it should be load to draw particles
    system.position= ccp(200, 200);
    system.startSize= 10;
    system.endSize= 5;
    system.duration= kCCParticleDurationInfinity;
    system.life= 1;
    [self addChild: system]; 

    [pool drain];
}

画像を使用する

手動で作成したテクスチャの代わりにUIImageを使用する方法でコードを変更しようとしました。

if( (self=[super init]))
{
    // Even with glClearColor() it doesn't work
    //glClearColor(1, 0, 1, 1);
    NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];

    NSBundle* bundle=[NSBundle mainBundle];
    NSString* path=[bundle pathForResource: @"fire" ofType: @"png"];
    UIImage* image=[UIImage imageWithContentsOfFile: path];
    CCTexture2D* texture=[[[CCTexture2D alloc]initWithImage: image]autorelease];
    CCParticleSystemQuad* system=[[[CCParticleSystemQuad alloc]initWithTotalParticles: 100]autorelease];
    system.texture= texture;
    system.startSize= 10;
    system.endSize= 10;
    system.life= 1;
    system.duration= kCCParticleDurationInfinity;
    system.position= ccp(200, 200);
    // Even changing the start/end color it doesn't work
    //system.startColor= (ccColor4F){1.0,0.0,0.0,1.0};
    //system.endColor= (ccColor4F){1.0,0.0,0.0,1.0};
    system.emitterMode= kCCParticleModeGravity;
    system.gravity= ccp(200, 200);
    system.speed=1;
    [self addChild: system];

    [pool drain];
}

アプリバンドルの画像「fire.png」は次のとおりです。

ここに画像の説明を入力してください

他のいくつかのプロパティも設定しましたが、それでも機能しません:黒い画面。

4

2 に答える 2

2

いくつかのことが頭に浮かびます(コードの改善以外に、私のコメントを参照してください):

クリア カラーを変更して、パーティクル システムが実行されているが黒いパーティクルのみがスポーンされているかどうかを確認します。

glClearColor(1, 0, 1, 1);

パーティクル システム自体が適切に構成されていない可能性があります (不完全なデータ、通常は 0 のデフォルト値を使用するプロパティ)。変更していないプロパティが原因で、パーティクル システムが正しくレンダリングされない可能性があります。たとえば、パーティクル システムには startColor プロパティと endColor プロパティがあります。より明るい (白) 色に設定していないために両方とも黒または透明色に初期化されている場合、テクスチャの色に関係なく、パーティクルは黒になります。これがここで起こっている可能性が最も高いと思います。

最初に、イメージ ファイルから通常のテクスチャを使用してパーティクル システムを設定してみてください。パーティクル システムが目に見える非黒のパーティクルを作成することを確認したら、カスタム テクスチャの使用に切り替えることができます。

于 2013-03-09T23:58:07.047 に答える
0

最終的にはパーティクル ミントを使用してパーティクル システムを作成し、次にファクトリ メソッドを使用しました。

CCParticleSystemQuad* system=[[[CCParticleSystemQuad alloc]initWithDictionary: [ParticleFactory makeEffect]]autorelease];
于 2013-03-17T18:50:04.657 に答える