Cocos2d - 射击游戏问题

时间:2009-11-20 16:00:01

标签: iphone cocos2d-iphone

大家,我做了一个像1942年(经典射击游戏)的射击游戏,但问题是,当战斗机射出直线子弹时,FPS下降到5~6,屏幕上大约有7~8个子弹,实际上,只有8发子弹出现在游戏中,当子弹飞出屏幕时,它们将重置到战斗机的中心并变得不可见,所有子弹都是单独的精灵,就像:

Sprites * bullet1 = [Sprite spriteWithFile:@"bullet.png"];

........

Sprites * bullet8 = [Sprite spriteWithFile:@"bullet.png"];

有没有任何方法可以存储大量的子弹而不是逐个定义它们? 因为敌人也可以射击,我可以想象FPS可能会接近于零.....

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:3)

你可以在那里做一些“子弹池”,因为你正在使用cocos,我要做的就是在开始游戏时分配很多子弹。检查你需要的子弹数量,预先分配。

当游戏中的实体需要发射子弹时,它只需要向该池发出子弹,将属性提供给“预先分配”的子弹,子弹出现在屏幕上,当它影响/消失时然后你将那颗子弹送回你的子弹池。

如果您需要一些代码:

/*You pre-allocate your bullets.*/
for(int i = 0; i < MAX_BULLETS; i++)
{
    Bullet *aBullet = [[Bullet alloc] init];
    [bulletsArray addObject:aBullet];

    [aBullet release];
}

//Then in game when you fire:

Bullet *aBullet = [PoolManager bulletWithSprite:myBulletSprite]; // Where myBulletSprite is PRE allocated and you don't allocate sprites in Game.

答案 1 :(得分:1)

您可以将精灵存储在数组中:

NSMutableArray * bulletsBuilder = [[NSArray alloc] init];

for(int i = 0; i < MAX_NUMBER_OF_SPRITES; ++i) {
    [bullets addObject:[Sprite spriteWithFile:@"bullet.png"]];
}

NSArray * bullets = [NSArray arrayWithArray:bulletsBuilder];
[bulletsBuilder release];

稍后使用其标识符访问它们:

Sprite * spr = [bullets objectAtIndex:spriteIndex];

答案 2 :(得分:0)

有什么问题?使用sprite批处理!它是一种特殊的层,允许您加速多个精灵的渲染。

  1. CCSpriteBatchNode * batch = [CCSpriteBatchNode batchNodeWithFile:@“bullet.png”];
    • 除非你不是纹理图集,否则你不能使用不同的精灵来渲染它们。
  2. 然后加载一个精灵并根据需要添加到批次本身尽可能多的精灵。 for(; i&gt; 10;){[batch addSprite:sprite];}
  3. 加入自我。

答案 3 :(得分:-1)

核心动画图层是轻量级的,可以帮助您提高性能。您可以加载图像一次,然后将项目符号图像加载到CALayers数组的内容中。像这样:

// bulletImage is an instance variable
bulletImage = [UIImage imageNamed:@"bullet.png"];

bulletLayers = [[NSMutableArray alloc] init];
for (i = 0; i < 9; ++i)
{
    CALayer *bulletLayer = [CALayer layer];
    [bulletLayer setBounds:[bulletImage bounds]];
    [bulletLayer setPosition:gunBarrelOrigin];
    [bulletLayer setContents:(id)[bulletImage CGImage]];
    [bulletLayers addObject:bulletLayer];
}

// Use the array of layers.
// ...

您没有指定是否在Sprite类中使用视图或图层,但如果您多次加载相同的图像,则肯定会产生不必要的开销。