一种计算屏幕上节点数量的方法

时间:2015-01-29 15:11:54

标签: ios objective-c sprite-kit core-graphics

有人请我朝正确的方向努力。

事情就是这样:我想要做的就是限制可以在屏幕上投射的射弹(由玩家射击)。该限制记录在常数中。因此,虽然屏幕上的射弹节点的数量等于该常数,但是玩家将无法再射击。

一旦射弹离开屏幕,该弹丸就会被移除,减少屏幕上节点的数量,玩家应该能够再次射击,当然不会超出限制。 (只需按一下按钮即可完成拍摄,如果这很重要,则不要按照想要拍摄的方向拍摄屏幕。一次只拍一张。)

我可以用什么样的算法来解决这个问题?如何保持目前屏幕上的射弹数量?如何让系统知道什么时候减少这个数量(我一直在使用碰撞检测,有一个"屏幕边界节点")和要移除的WHAT节点(我已经记录了节点ID在名称中,但看起来像这样做错误的方式)?请建议一个坚实的解决方案。希望我所要求的是可能的。

2 个答案:

答案 0 :(得分:0)

你在这里提出两项要求:

  1. 当玩家射击时会产生射弹。
  2. 当一个射弹离开屏幕时会被删除。
  3. 如果你已经有代码在屏幕关闭时移除了射弹,你可以利用一个简单的static计数:

    @implementation Projectile
    static NSUInteger projectileCount = 0;
    + (instancetype)fireProjectile {
      if (projectileCount < MAX_PROJECTILES) {
        projectileCount++;
        return [[Projectile alloc] init];
      }
      return nil;
    }
    - (void)dealloc {
      projectileCount--;
    }
    @end
    

答案 1 :(得分:0)

不确定我是否完全理解你想要的东西,但根据我所读到的内容,你可以拥有一系列包含你想要允许的射弹数量的射弹。

// create an array
NSMutableArray *projectiles = [NSMutableArray array];

// populate the array with your projectiles

for (int index = 0;index < kMaxProjectiles;index++)
{
    Projectile *projectile = [[Projectile alloc]init];
    [projectiles addObject:projectile]
}

现在,无论何时想射击射弹,都要将其从阵列中移除并射击。

Projectile *projectile = [projectiles objectAtIndex:0];
[projectiles removeObjectAtIndex:0];

当它离开屏幕时,将其从父母移开并将其向右推回到阵列中。

[projectile removeFromParent];
[projectiles addObject:projectile];

它基本上是一个汇集系统,您可以在其中创建一次射弹并回收它们。选择射击时,您只需检查阵列的数量,以确定是否有射弹可用:

if (projectiles.count > 0)
{
   // yep, there are projectiles in the pool, fire away
}

增加池的优势在于你不会经常创造和杀死你的射弹,这会导致垃圾收集发生时暂停,或者你曾试图立刻创造大量射弹。