Система частиц из текстуры не загружается

Я пытаюсь использовать систему частиц, загружающую частицы для текстуры. Так как это всего лишь упражнение, я могу генерировать текстуру "вручную". Поэтому в этом случае я просто выделяю буфер данных и заполняю его красным цветом (32-битный формат RGBA).

Но проблема в том, что когда программа запускается, я просто вижу черный экран, и я не вижу того, что ожидаю увидеть (движутся некоторые красные частицы).

Я объясняю, что я пытаюсь сделать в комментариях:

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" в комплекте приложений:

Я также установил некоторые другие свойства, но они все еще не работают: черный экран.

2 ответа

Решение

В итоге я использовал мяту частиц для создания системы частиц, а затем фабричный метод:

CCParticleSystemQuad* system=[[[CCParticleSystemQuad alloc]initWithDictionary: [ParticleFactory makeEffect]]autorelease];

Несколько вещей приходят мне на ум (помимо улучшений кода, см. Мои комментарии):

Измените чистый цвет, просто чтобы увидеть, может ли система частиц работать, но порождает только черные частицы:

glClearColor(1, 0, 1, 1);

Сама система частиц может быть неправильно сконфигурирована (неполные данные, свойства, использующие значения по умолчанию, которые обычно равны 0). Возможно, что свойства, которые вы не изменили, приводят к некорректной визуализации системы частиц. Например, система частиц имеет свойства startColor и endColor. Если они оба инициализированы в черный или прозрачный цвет, потому что вы не установили их в более яркий (белый) цвет, не имеет значения, какой цвет имеет ваша текстура, частицы будут черными. Я считаю, что это, скорее всего, то, что здесь происходит.

Попробуйте сначала настроить систему частиц с обычной текстурой из файла изображения. Если вы подтвердили, что система частиц создает видимые, не черные частицы, вы можете переключиться на использование собственной текстуры.

Другие вопросы по тегам