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);
});
```