Cocos3.x截屏

Cocos3.x 怎么实现截屏功能啊 截屏之后的图片怎么才能拿到呢 比如我截屏之后用此截屏图片创建一个精灵显示在屏幕上

utils::captureScreen

void StartGame::captureScreenShot()
{
//截游戏图

Vec2 origin = Director::getInstance()->getVisibleOrigin();
Size size = Director::getInstance()->getVisibleSize();



RenderTexture *renderTexture = RenderTexture::create(size.width, size.height, Texture2D::PixelFormat::RGBA8888);

Scene *scene = Director::getInstance()->getRunningScene();
renderTexture->begin();
scene->visit();
renderTexture->end();


if (renderTexture->saveToFile("ScreenShot.png", Image::Format::PNG)) {
   
    scheduleOnce(schedule_selector(StartGame::showScreenShot),0.1);
   
}

}

void StartGame::showScreenShot(float dt)
{
const char *fileName = “ScreenShot.png”;
std::string filePath = FileUtils::getInstance()->getWritablePath()+fileName;
log(“image path is %s”,filePath.c_str());

Size size = Director::getInstance()->getVisibleSize();


auto layer = LayerColor::create(Color4B(128, 128, 128, 255), size.width, size.height);
layer->setPosition(Vec2(0, 0));
this->addChild(layer,5);
//从图片中截取需要的那部分
Sprite *contentSprite = Sprite::create(filePath, Rect(16, 263, 612, 612));
contentSprite->setPosition(visibleSize.width/2, visibleSize.height/2);
layer->addChild(contentSprite);
Director::getInstance()->getTextureCache()->removeUnusedTextures();

}

多谢 根据您这个我实现了截屏 但是有个问题 我用了这句 Director::getInstance()->getTextureCache()->removeUnusedTextures(); 但是还是每次截屏的图片都是一样的 每次都是第一次截屏的图

给你来个功能强一点的截图,支持缩放,无需保存到硬盘即可用截取的图片创建Sprite:

void snapshot(const std::string& fileName, float scale, const std::function& callback)
{
    RenderTexture* finalRtx = nullptr;
    cocos2d::Size visibleSize = Director::getInstance()->getVisibleSize();
    cocos2d::Point visibleOrigin = Director::getInstance()->getVisibleOrigin();
    
    // Director::getInstance()->setNextDeltaTimeZero(true);
    
    RenderTexture* rtx = RenderTexture::create(visibleSize.width, visibleSize.height, Texture2D::PixelFormat::RGBA8888, GL_DEPTH24_STENCIL8);
    cocos2d::Scene* scene = Director::getInstance()->getRunningScene();
    cocos2d::Point savedPos = scene->getPosition();
    scene->setPosition(-visibleOrigin);
    rtx->begin();
    Director::getInstance()->getRunningScene()->visit();
    rtx->end();
    scene->setPosition(savedPos);
    
    if (std::abs(scale - 1.0f) < 1e-6/* no scale */)
        finalRtx = rtx;
    else {
        /* scale */
        cocos2d::Rect finalRect = cocos2d::Rect(0, 0, visibleSize.width, visibleSize.height);
        Sprite *sprite = Sprite::createWithTexture(rtx->getSprite()->getTexture(), finalRect);
        sprite->setAnchorPoint(cocos2d::Point(0, 0));
        sprite->setFlipY(true);

        finalRtx = RenderTexture::create(visibleSize.width * scale, visibleSize.height * scale,  Texture2D::PixelFormat::RGBA8888);
        sprite->setScale(scale);
        finalRtx->begin();
        sprite->visit();
        finalRtx->end();
    }

    /// Gets snapshot Image
    cocos2d::CustomCommand* command = new cocos2d::CustomCommand();
    command->init(finalRtx->getGlobalZOrder());
    command->func = {
        auto image = finalRtx->newImage();
        if (!fileName.empty())
            image->saveToFile(fileName);
        if (callback)
            callback(image);
        image->release();

        delete command;
        // finalRtx->release(); will destructed by command->func
    };

    finalRtx->retain();
    Director::getInstance()->getRenderer()->addCommand(command);
}

// 用法:
snapshot(""/*不保存*/, 1.0f, ](cocos2d::Image* snapImage){
    auto texture2d = TextureCache::getInstance()->addImage(snapImage, "snapshot_000113242.png");
    auto sprite = Sprite::createWithTexture(texture2d);
});


```