2016-06-30 4 views
0

아주 오래 전부터 cocos2d-x를 사용하고 있습니다. 재미 있고 손을 잡는 것은 꽤 쉽습니다. 하지만 최근에는 뭔가를 구현하는 동안 막혔어요. (지금은 꽤 오래되었습니다.)cocos2d-x에서 Z 축 시차 구현 V310

저는 Parllax를 X 축과 Y 축에 구현했습니다. 쉬운 직업이었습니다. 그러나 Z 축 (전망보기를 상상해보십시오)에서 그것을 구현하려고하면 나는 할 수 없습니다. Imagine this view

뭔가를 제안하십시오. cocos2d-x의 문맥에서 설명은 크게 감사 할 것입니다. 나는 C++과 함께 사용한다. 고맙습니다 !

+0

다음

변수는 헤더 파일 (LevelScene.h을)에 정의되어 있습니다 나는 "나는 할 수 없다"는 것이 우리가 당신을 도울 수있는 것이 아님을 두려워합니다. 어디서 붙어 있니? 너 무슨 짓을 한거야? – nvoigt

+0

나는 그것을 구현하려고하지만 그 사이에는 복구 할 수없는 틈이있다. – Vineet

+0

카메라도 사용해 보았습니다. 그러나 2 개의보기가 만들어집니다. 나는 어떤 괭이에 어떻게해야하는지 모릅니다. – Vineet

답변

1

Z 축에서 무한 스크롤링 배경 코드를 작성했습니다.
가장 중요한 팁은 배경 타일 간의 거리를 계산하는 곳입니다. 나는 배경 이미지의 높이를 타일 사이의 거리로 사용하지만 X 축 주위로 스프라이트를 회전하기 전에 저장합니다.

... 
private: 
    std::vector<Sprite*> mBackgrounds; // background tiles 
    Layer* mlayer;      // main layer where background tiles are in 
    Camera* mMainCamera;    // main camera 
    int count = 0;      // number of tiles that fills distance between camera and its far plane 
    float height = 1;     // this is distance between each tile indeed 
... 

LevelScene.cpp 파일이 포함되어 있습니다 :

bool LevelsScene::init() 
{ 
    if(!Layer::init()) 
    { 
     return false; 
    } 

    auto visibleSize = Director::getInstance()->getVisibleSize(); 
    auto origin = Director::getInstance()->getVisibleOrigin(); 

    mlayer = Layer::create(); 
    mlayer->setCameraMask((unsigned short)CameraFlag::USER2); 
    addChild(mlayer); 
    float far = 3500; 
    mMainCamera = Camera::createPerspective(80, (float)visibleSize.width/visibleSize.height, 
             1.0, far); 
    mMainCamera->setCameraFlag(CameraFlag::USER2); 
    this->addChild(mMainCamera); 

    auto bg = Sprite::create(); 
    bg->initWithFile("asphalt.png"); 
    //The line below is very important. We use height of image as distance between tiles. We store height before rotating sprite. 
    height = bg->getBoundingBox().size.height; 

    bg->setRotation3D(Vec3(-90,0,0)); 
    bg->setPosition3D(Vec3(visibleSize.width/2,0,-200)); 
    bg->setCameraMask((unsigned short)CameraFlag::USER2); 
    mlayer->addChild(bg); 

    mMainCamera->setPosition3D(bg->getPosition3D() + Vec3(0,150,300)); 
    mMainCamera->lookAt(bg->getPosition3D()+Vec3(0,100,0), Vec3(0.0,1.0,0.0)); 

    float lastZ = bg->getPositionZ() - height; 
    count = ceil(far/height) + 2; 

    mBackgrounds.push_back(bg); 
    for(int i = 0; i< count; i++) 
    { 
     auto bg = Sprite::create(); 
     bg->initWithFile("asphalt.png"); 
     bg->setRotation3D(Vec3(-90,0,0)); 
     bg->setPosition3D(Vec3(visibleSize.width/2,0, lastZ)); 
     bg->setCameraMask((unsigned short)CameraFlag::USER2); 
     mlayer->addChild(bg); 
     lastZ = bg->getPositionZ() - height; 
     mBackgrounds.push_back(bg); 
    } 

    scheduleUpdate(); 
    return true; 
} 

void LevelsScene::update(float dt) 
{ 
    mMainCamera->setPosition3D(mMainCamera->getPosition3D() + 
          Vec3(0, 0, -10)); 
    for(std::vector<Sprite*>::iterator bgit = mBackgrounds.begin(); 
    bgit != mBackgrounds.end(); bgit++) 
    { 
     Sprite* bg = (Sprite*)*bgit; 
     if(bg->getPositionZ() > mMainCamera->getPositionZ()) 
     { 
      bg->setPositionZ(bg->getPositionZ() - height * count); 
     } 
    } 
} 

희망이 도움 :)