When I set a position3D for a Sprite in cocos2dx, it render two times the same sprite, i took a screenshot:


I set the position3D because i want to use the Z position the give an effect of distance, but its rendering these two sprites in the lower left corner, how can I fix that?

Here is my code in .h:

cocos2d::Sprite* mySprite;
cocos2d::Sprite* mySprite2;
cocos2d::Camera* camera;

Here i my code in cpp:

bool HelloWorld::init()

if ( !Layer::init() )
    return false;

auto s = Director::getInstance()->getWinSize();
camera = Camera::createPerspective(60, (GLfloat)s.width / s.height, 1, 100);

camera->setRotation3D(Vec3(0, 0, 0));

mySprite2 = Sprite::create("idle1.png");
mySprite2->setPosition3D(Vec3(5, 0, -41));

this->addChild(mySprite2, 2);

mySprite = Sprite::create("idle1.png");
mySprite->setPosition3D(Vec3(-5, 0, -81));

this->addChild(mySprite, 0);

1 Answer 1


You have to set the camera user to something other than DEFAULT because the DEFAULT camera is used for things like UI, Menus and is rendered last.

// Camera
auto s = Director::getInstance()->getWinSize();
auto camera = Camera::createPerspective(60, (GLfloat) s.width / s.height, 1, 1000);

// set parameters for camera
camera->setPosition3D(Vec3(0, 400, 400));
camera->lookAt(Vec3(0, 0, 0), Vec3(0, 1, 0));
this->addChild(camera); //add camera to the scene

So when you create a new camera the deafult camera is set to DEFAULT, and the new camera is also set to DEFAULT initially. So set it to USER1.


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .