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);
}
}
}
희망이 도움 :)
다음
변수는 헤더 파일 (LevelScene.h을)에 정의되어 있습니다 나는 "나는 할 수 없다"는 것이 우리가 당신을 도울 수있는 것이 아님을 두려워합니다. 어디서 붙어 있니? 너 무슨 짓을 한거야? – nvoigt나는 그것을 구현하려고하지만 그 사이에는 복구 할 수없는 틈이있다. – Vineet
카메라도 사용해 보았습니다. 그러나 2 개의보기가 만들어집니다. 나는 어떤 괭이에 어떻게해야하는지 모릅니다. – Vineet