2011-07-13 12 views
5

Tworzę opartą na kaflach 2d grę RPG z cocos2d. Używam CCTMXTileMaps dla moich map. Mój gracz jest wyśrodkowany na ekranie, a mapa porusza się wokół niego (z wyjątkiem sytuacji, gdy gracz podchodzi do krawędzi mapy, gdzie odchodzi od centrum i faktycznie się porusza). Ten system działa dobrze na dużych mapach. Jednak na małych mapach mapa jest zakotwiczona w prawym górnym rogu ekranu. Podczas gdy mechanika nadal działa, dobrze byłoby, gdyby te małe mapy automatycznie były wycentrowane.Jak mogę wyśrodkować małą CCTMXTileMap w cocos2d?

Jak wyśrodkować mapy mniejsze od wymiarów ekranu? Chcę, aby mapa była wyśrodkowana w "czerwonym polu". (Czerwona skrzynka jest tu tylko dla celów poglądowych, nie jest to faktycznie istnieje w kodzie.)

enter image description here

EDIT:

więc zorientowali się, jak to zrobić w teorii, ale I” m nie rozumiem układu współrzędnych. Używam następującego kodu, aby wyśrodkować mapę, ale nie zachowuje się ona zgodnie z oczekiwaniami. Mapa ładuje się z ekranu.

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; 

} 

Co ja tu robię źle?

+0

zdefiniować "łamanie czegoś", czy to się zawiesza lub nie działa tak, jak chcesz? –

+0

@FraserGraham Edytowane. Działa, ale nie zachowuje się tak, jak bym chciał. – Moshe

Odpowiedz

0

OK, rozwiązanie jest dość proste, chociaż brakowało mi kilku rzeczy. Kod najbardziej podstawowy do centrowania mapę w dominującej jest następujący:

// 
    // 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)); 

Powyższa kod będzie działać, jeśli załadować jedną mapę na scenę. Jeśli jednak masz (tak jak ja) jedną scenę "światową", która ładuje mapy i powiązane dane, musisz zrobić to trochę inaczej. Załadowanie mapy większej niż ekran spowoduje, że warstwa "rozciągnie się" i zmieni rozmiar, dopasowując ją do większej mapy. W ten sposób powyższy kod wyśrodkuje, a następnie załaduje mapy w "rozciągniętej" scenie mapy. Aby temu przeciwdziałać, najpierw muszę zmienić rozmiar warstwy "sceny światowej", aby dopasować ją do rozmiaru ekranu. Aby to zrobić, używam następujący kod:

pamiętać, że również przesunąć „aparat” z powrotem do pozycji 0,0, w przypadku mamy odsunął się w następujących naszego głównego bohatera.

Powiązane problemy