Хорошо, решение довольно простое, хотя я упустил несколько вещей. Основной код для центрирования карты в родительском коде:
//
// Get the center of the
// screen/map layer (which are the same)
//
CGPoint centerOfSelf = CGPointMake(self.contentSizeInPixels.width/2, self.contentSizeInPixels.height/2);
//
// Position the map in the center
//
tileMap.position = CGPointMake(centerOfSelf.x - (tileMap.contentSizeInPixels.width/2), centerOfSelf.y - (tileMap.contentSizeInPixels.height/2));
Вышеупомянутый код будет работать, если вы загрузите одну карту на сцену. Однако, если у вас есть (как и у меня) одна «мировая» сцена, которая загружает карты и связанные с ними данные, то вам нужно сделать что-то немного по-другому. Видите ли, загрузка карты, которая больше экрана, приведет к тому, что слой «растянется» и изменит свой размер, чтобы соответствовать большей карте. При этом приведенный выше код будет центрировать и впоследствии загружать карты в «растянутую» сцену карты. Итак, чтобы противостоять этому, я сначала должен изменить размер слоя "мировой сцены", чтобы он соответствовал размеру экрана. Для этого я использую следующий код:
//
// Reset the size of the bounding
// area so that we can properly
// center maps that are smaller than
// the bounding area of the screen.
//
CGSize screenSize = [[CCDirector sharedDirector] winSize];
self.contentSizeInPixels = screenSize;
//move camera
self.position = CGPointZero;
Обратите внимание, что я также перемещаю «камеру» обратно в положение 0,0, если мы отошли в следовании за нашим главным героем.