2013-03-09 3 views
0

Я пытаюсь использовать систему частиц, загружающую частицы для текстуры. Так как это всего лишь упражнение, мне хорошо сгенерировать текстуру «вручную». Поэтому в этом случае я просто выделяю буфер данных и заполняю его красным цветом (формат 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" в приложение расслоения:

enter image description here

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

+0

использование MemSet (буфер, & маска, размер * размер * 4), чтобы заполнить буфер с помощью только одного цвета всех сразу же для циклов for и копирования 4 байта каждая итерация очень неэффективна. – LearnCocos2D

+2

NSData не требуется, передайте буфер CCTexture2D непосредственно и бесплатно (буфер) в строке после этого. Это нормально, потому что CCTexture2D копирует данные из буфера в фактическую текстуру, и буфер больше не нужен. NSAutoreleasePool здесь также совершенно не нужен (и пул протекает, потому что вы его не выпускаете. Рассмотрите возможность использования ARC). – LearnCocos2D

+0

О memset: он берет только первый байт, но у меня есть целое число 4 байта, поэтому я использую цикл. О пуле: следует ли использовать освобождение вместо автореферата и отказаться от пула авторесурсов? Btw [pool drain] освобождает пул. –

ответ

0

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

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

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

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

glClearColor(1, 0, 1, 1); 

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

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

+0

Я попытался с текстурой, созданной с изображения, и она не работает, я отредактировал вопрос. –

Смежные вопросы