Как я могу центрировать маленькую CCTMXTileMap в cocos2d? - PullRequest
5 голосов
/ 14 июля 2011

Я делаю 2d RPG на основе плиток с cocos2d. Я использую CCTMXTileMaps для своих карт. Мой игрок центрируется на экране, и карта движется вокруг него (кроме случаев, когда игрок идет к краю карты, где он уходит от центра и фактически перемещается). Эта система хорошо работает на больших картах. Однако на небольших картах карта привязана к верхнему правому углу экрана. Хотя механика все еще работает, было бы неплохо, чтобы эти маленькие карты автоматически центрировались.

Как сделать так, чтобы карты, размеры которых меньше размеров экрана, были центрированы? Я хочу, чтобы карта центрировалась в "красном поле". (Красное поле приведено только для иллюстрации, на самом деле его нет в коде.)

enter image description here

EDIT:

Так что я разобрался, как это сделать в теории, но у меня проблемы с пониманием системы координат. Я использую следующий код для центрирования карты, но он ведет себя не так, как ожидалось. Карта загружается за пределы экрана.

    if ((self.tileMap.contentSize.height < screenSize.height) && (self.tileMap.contentSize.width < screenSize.width)) {

    CGSize winSize = [[CCDirector sharedDirector] winSize];
    CGPoint centerOfView = ccp(winSize.width/2, winSize.height/2);        


    CGPoint centerOfMap = CGPointMake((self.tileMap.mapSize.width*self.tileMap.tileSize.width)/2, (self.tileMap.mapSize.height*self.tileMap.tileSize.height)/2);

    self.tileMap.anchorPoint = centerOfMap;
    self.tileMap.position = centerOfView;

}

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 15 июля 2011

Хорошо, решение довольно простое, хотя я упустил несколько вещей. Основной код для центрирования карты в родительском коде:

    //
    //  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, если мы отошли в следовании за нашим главным героем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...