Я пытаюсь использовать систему частиц, загружающую частицы для текстуры. Так как это всего лишь упражнение, мне хорошо сгенерировать текстуру «вручную». Поэтому в этом случае я просто выделяю буфер данных и заполняю его красным цветом (формат 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" в приложение расслоения:
Я также установил некоторые другие свойства, но он по-прежнему не работает: черный экран.
использование MemSet (буфер, & маска, размер * размер * 4), чтобы заполнить буфер с помощью только одного цвета всех сразу же для циклов for и копирования 4 байта каждая итерация очень неэффективна. – LearnCocos2D
NSData не требуется, передайте буфер CCTexture2D непосредственно и бесплатно (буфер) в строке после этого. Это нормально, потому что CCTexture2D копирует данные из буфера в фактическую текстуру, и буфер больше не нужен. NSAutoreleasePool здесь также совершенно не нужен (и пул протекает, потому что вы его не выпускаете. Рассмотрите возможность использования ARC). – LearnCocos2D
О memset: он берет только первый байт, но у меня есть целое число 4 байта, поэтому я использую цикл. О пуле: следует ли использовать освобождение вместо автореферата и отказаться от пула авторесурсов? Btw [pool drain] освобождает пул. –