我正在尝试使用粒子系统加载粒子作为纹理。因为它只是一个练习,所以我可以“手动”生成纹理。所以在这种情况下,我只是分配一个数据缓冲区并用红色填充(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”是:
我还设置了一些其他属性,但它仍然不起作用:黑屏。
答案 0 :(得分:2)
我想到了一些事情(除了代码改进,请参阅我的评论):
更改清晰颜色,只是为了查看粒子系统是否正在运行但只生成黑色粒子:
glClearColor(1, 0, 1, 1);
可能没有正确配置粒子系统本身(不完整的数据,使用默认值的属性,通常只有0)。您未修改的属性可能会导致粒子系统无法正确渲染。例如,粒子系统具有startColor和endColor属性。如果它们都被初始化为黑色或透明颜色,因为您没有将它们设置为更亮(白色)的颜色,那么纹理的颜色无关紧要,颗粒将是黑色的。我相信这很有可能发生在这里。
首先尝试使用图像文件中的常规纹理设置粒子系统。如果您已确认粒子系统会创建可见的非黑色粒子,则可以切换到使用自定义纹理。
答案 1 :(得分:0)
我最终使用粒子mint来创建一个粒子系统,然后使用工厂方法:
CCParticleSystemQuad* system=[[[CCParticleSystemQuad alloc]initWithDictionary: [ParticleFactory makeEffect]]autorelease];