【问题标题】:Cocos2d - Shooting Game ProblemCocos2d - 射击游戏问题
【发布时间】:2009-11-20 16:00:00
【问题描述】:

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

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

........

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

有什么方法可以存储很多子弹而不是一个一个地定义它们吗? 因为敌人也可能开火,我可以想象FPS可能会接近零......

谁能帮帮我??

【问题讨论】:

    标签: iphone cocos2d-iphone


    【解决方案1】:

    您可以在其中设置一个“子弹池”,因为您正在使用 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.
    

    【讨论】:

      【解决方案2】:

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

      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];
      

      【讨论】:

        【解决方案3】:

        有什么问题?使用精灵批处理!这是一种特殊的层,可让您加快多个精灵的渲染速度。

        1. CCSpriteBatchNode* 批处理 = [CCSpriteBatchNode batchNodeWithFile:@"bullet.png"];
          • 除非您不是 Texture Atlas,否则您不能使用不同的 sprite 来渲染它们。
        2. 然后加载一个精灵并将所需数量的精灵添加到批次本身。 for(;i>10;){[batch addSprite:sprite];}
        3. 添加到自己。

        【讨论】:

          【解决方案4】:

          核心动画层是轻量级的,应该有助于您的表现。您可以加载一次图像,然后将子弹图像加载到 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 类中是使用视图还是层,但如果您多次加载同一个图像,您肯定会产生不必要的开销。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-03
            • 1970-01-01
            • 2017-04-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多