횡스크롤 또는 종스크롤 게임을 만들때 케릭터를 중심으로 배경이랑 맵이랑 움직이고 싶을때가 많은데요

이럴때 사용하면 좋을 함수가 있어서 소개하고자 합니다.


아래 화면은 현재 개발중인 게임실제 화면입니다.



케릭터의 위치를 중심으로 맵이 움직이게 됩니다.

또한 화면 최상단의 UI들은 항상 화면에 표시되게 위치를 보정시켰습니다.




[ 사용 예제 ]

void GameScene::init()

{

   _pRoot = CSLoader::createNode("GameScene.csb");

   addChild(_pRoot);


    _pMudman = (Sprite*)_pRoot->getChildrenByName("mudman");

    _pUI = (Node*)_pRoot->getChildrenByName("ui");

    _pTileMap = (TMXTiledMap*)_pRoot->getChildrenByName("tiledmap");

}


void GameScene::update(float dt)

{

      tickMudmanMove();

}


void GameScene::tickMudmanMove()

{

      // 화면의 중심으로 오게 하고 싶은 케릭터의 위치값을 구해서

      // 파라미터로 넘겨줍니다.

      Point pos = _pMudman->getPosition();

      setViewPointCenter(pos);

}


이 함수는 아래 블로그에서 발췌했습니다.

https://www.raywenderlich.com/39113/cocos2d-x-tile-map-tutorial-part-1


다만 추가한 내용은 화면에 항상 표시되어야할 UI들을 위치값을 보정시켰습니다.

void GameScene::setViewPointCenter(Point position)

{

        // 케릭터의 중심위치를 구하는 코드

CCSize winSize = CCDirector::sharedDirector()->getWinSize();

int x = MAX(position.x, winSize.width / 2);

int y = MAX(position.y, winSize.height / 2);

x = MIN(x, (_pTileMap->getMapSize().width * _pTileMap->getTileSize().width) - winSize.width / 2);

y = MIN(y, (_pTileMap->getMapSize().height * _pTileMap->getTileSize().height) - winSize.height / 2);

CCPoint actualPosition = ccp(x, y);

CCPoint centerOfView = ccp(winSize.width / 2, winSize.height / 2);

CCPoint viewPoint = ccpSub(centerOfView, actualPosition);


  // 이 부분에서 케릭터 중심으로 화면을 세팅하게 됩니다.

  // 다만 문제는 이러면 Scene 전체가 움직이게 됨으로, 버튼이나 항상 화면에 표시하고 싶은것 까지

  // 다같이 움직이는 문제가 발생합니다.

this->setPosition(viewPoint);


        // 이럴때 제가 쓰는 방법은 항상 화면위에 표시하고 싶은 UI들을 움직인것 만큼 보정시켜주는 코드를

        // 삽입하는 방법입니다.

        // 이렇게 하면 Tiledmap 화면은 움직이고 화면에 계속 보여주고 싶은 UI들은 항상 화면위에 표시됩니다.

CCPoint uiViewPoint = ccpSub(actualPosition, centerOfView);

_pUI->setPosition(uiViewPoint);

}