Hello everyone,
When I created a new camera to follow player, this camera only render scene objects, I catch a bug:
the player object was running not smoothly, but like the gif shown somethimes on PC and frequently on Mobile,

And if I do not use the user camera, it’s all OK.
Here is the test code:
- create any new project in v3.x, change the default scripts like:
HelloWorld.h
HelloWorld.cpp
Copying:
HelloWorld.h
void update(float dt);
private:
bool hasInited;
cocos2d::Sprite* player;
cocos2d::Camera* mainCam;
HelloWorld.cpp
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
Size vSize = Director::getInstance()->getVisibleSize();
// set custom camera.
mainCam = Camera::createOrthographic(vSize.width, vSize.height, -10, 10);
mainCam->setCameraFlag(CameraFlag::USER1); // camera layer.
mainCam->setPosition(Vec2::ZERO);
this->addChild(mainCam);
// set player.
player = Sprite::create("CloseNormal.png");
player->setScale(3);
player->setPosition(200, 300);
this->addChild(player);
player->setCameraMask((unsigned short)CameraFlag::USER1); // set mask.
// update.
scheduleUpdate();
hasInited = false;
return true;
}
void HelloWorld::update(float dt)
{
// camera follow smoothly.
float cameraTargetPosX = player->getPositionX() - 200;
Vec2 targetPos = Vec2(cameraTargetPosX, mainCam->getPositionY());
mainCam->setPosition( mainCam->getPosition().lerp(targetPos, 0.1) );
// move player(did not use physics)
if ( player->getPositionX() > 10000 ) {
player->stopAllActions();
player->setPositionX(200);
mainCam->setPositionX(0);
hasInited = false;
}
if ( hasInited == false ) {
MoveBy* move = MoveBy::create(20, Vec2(12000, 0));
player->runAction(Sequence::create(DelayTime::create(2), move, NULL));
hasInited = true;
}
}
- compile and run to test.