Objective-C,基于对象实例变量对数组进行排序。

时间:2009-11-05 23:09:35

标签: objective-c arrays sorting cocos2d-iphone nsmutablearray

我正在开发像Rodents Revenge这样的游戏,只是为了指出我来自这个问题的地方。我正在使用cocos2d游戏引擎......

我有一个包含大约168个块的层,这些块是Sprite的子类。每个块包含两个整数实例变量,一个用于xGridLocation和yGridLocation。我有一个方法,我调用它返回一个数组,其中包含与控制(鼠标)主角相同的x或y行上的所有块。只要块保持相同的顺序(最小x / y值到最大值),此方法就可以工作,但是当我开始将块从原始行中推出并将它们混合一点时(在玩游戏时)我的逻辑没有更长的工作原因是因为它基于以下事实:数组中的块根据其xGridLocation或yGridLocation从最小到最大索引。 xGridLocation和yGridLocation不是基于它们的位置,当图层首次加​​载时,它们被赋予预设的网格位置,并且当块在任何方向上移动时,网格位置根据它们移动的方向而改变。

我的问题是如何根据实例变量xGridLocation或yGridLocation按顺序返回数组之前对数组进行排序。我在考虑使用sortUsingSelector:@selector(compareValues :)方法,但不确定如何实现将进行排序的compareValues方法。

这是我用来获取块数组的方法。

//I have another one for x. The y parameter is the mouses y value.
-(NSMutableArray *)getBlocksForY:(int)y
{
 NSMutableArray *blocks = [[NSMutableArray alloc] init];

 int tagNum = 0;

        //tagNum starts at 0, and goes up to 168, the numer of children (blocks) on
        //this layer...

 for(tagNum; tagNum<=168; tagNum++)
 {
  BlueBlock *currentBlock = (BlueBlock *)[self getChildByTag:tagNum];
  int currentY = [currentBlock getBlockLocationY];

                //Checks to see if the current block has same y value as the mouse, if
                //so it adds it to the array.
  if(currentY == y)
  {
   [blocks addObject:currentBlock];
  }
 }

        //I want to sort before returning...
 return blocks;
}

如果您需要更多信息,请询问。

1 个答案:

答案 0 :(得分:4)

如NSMutableArray参考中所述:

  

比较器消息被发送给每个人   接收器中的物体并具有其作用   单个参数中的另一个对象   阵列。比较法应该   返回NSOrderedAscending如果   接收器小于参数,   如果接收者是NSOrderedDescending   大于论点,和   NSOrderedSame如果他们是平等的。

所以你的比较器应该是这样的,应该添加到BlueBlock class:

- (NSInteger) compareBlocks:(BlueBlock)block
{
     if ([self getBlockLocationX] < [block getBlockLocationX])
          return NSOrderedAscending;
     else if ([self getBlockLocationX] == [block getBlockLocationX])
     {
          if ([self getBlockLocationY] < [block getBlockLocationY])
              return NSOrderedAscending;
          else if ([self getBlockLocationY] == [block getBlockLocationY])
              return NSOrderedSame;
          else
              return NSOrderedDescending;
     }
     else
         return NSOrderedDescending;
 }