Я работаю над такой игрой, как 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;
}
Если вам нужна дополнительная информация, просто спросите.