Objective-C, сортировка массива на основе переменной экземпляра объекта.

Я работаю над такой игрой, как 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;
}

Если вам нужна дополнительная информация, просто спросите.


person Avizz    schedule 05.11.2009    source источник
comment
Ответил здесь около получаса назад: stackoverflow.com/ вопросы/1684157/сортировка-в-nsmutable-массиве/   -  person Chuck    schedule 06.11.2009


Ответы (1)


Как указано в справочнике NSMutableArray:

Сообщение компаратора отправляется каждому объекту в приемнике и имеет в качестве единственного аргумента другой объект в массиве. Метод компаратора должен возвращать NSOrderedAscending, если получатель меньше аргумента, NSOrderedDescending, если получатель больше аргумента, и NSOrderedSame, если они равны.

Таким образом, ваш компаратор должен быть примерно таким и должен быть добавлен в класс BlueBlock:

- (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;
 }
person Jack    schedule 05.11.2009
comment
Спасибо, просто пришлось немного настроить его для моих нужд, сработало отлично! - person Avizz; 06.11.2009
comment
:D рад быть полезным! Но не забудьте отметить ответ, если он правильный. - person Jack; 13.11.2009