cocos2dx的截图功能如何截取屏幕的一部分?

如题:cocos2dx的截图功能如何截取屏幕的一部分?用CCRenderTexture它的create函数前两个参数设置的宽度和高度,截出来的图片都是从屏幕的左下角开始算起,如果我想截取屏幕的中间的内容就不行了,在网上看了下说用saveBuffer这个函数,但是在CCRenderTexture这个类没有这个函数,只有saveToFile这个函数,这怎么弄啊?请高人指点一下。

我也遇到过,但是目前还是有几个参数不清楚 要调用CCRenderTexture里的函数

void Director::saveScreenshot(const std::string& fileName,const std::function<void(const std::string&)>& callback){

Image::Format format;
if(std::string::npos != fileName.find_last_of(".")){
    auto extension = fileName.substr(fileName.find_last_of("."),fileName.length());
    if (!extension.compare(".png")) {
        format = Image::Format::PNG;
    } else if(!extension.compare(".jpg")) {
        format = Image::Format::JPG;
    } else{
        CCLOG("cocos2d: the image can only be saved as JPG or PNG format");
        return;
    }
} else {
    CCLOG("cocos2d: the image can only be saved as JPG or PNG format");
    return ;
}
auto origin=Director::getInstance()->getVisibleOrigin();
RenderTexture *renderTexture = RenderTexture::create(getWinSize().width, getWinSize().height*0.88, Texture2D::PixelFormat::RGBA8888);

Rect fullRect;
fullRect.setRect(origin.x,origin.y+getWinSize().height*0.18,getWinSize().width,getWinSize().height*0.7);

Rect virtualViewPort;
virtualViewPort.setRect(origin.x,origin.y+getWinSize().height*0.4,getWinSize().width,getWinSize().height*0.95);

renderTexture->setVirtualViewport(Point(origin.x,origin.y+getWinSize().height*0.325),fullRect,virtualViewPort);
renderTexture->beginWithClear(0.0f, 0.0f, 0.0f, 0.0f);
Director::getInstance()->getRunningScene()->visit();
renderTexture->end();
renderTexture->saveToFile(fileName , format);
auto fullPath = FileUtils::getInstance()->getWritablePath() + fileName;
auto scheduleCallback = &,fullPath,callback](float dt){
    callback(fullPath);
};
auto _schedule = Director::getInstance()->getRunningScene()->getScheduler();
_schedule->schedule(scheduleCallback, this, 0.0f,0,0.0f, false, "screenshot");

}
给你参考下,反正我是部分截图

最重要的是这句 renderTexture->setVirtualViewport(Point(origin.x,origin.y+getWinSize().height*0.325),fullRect,virtualViewPort);

谢谢你,明天试下看看

不对啊,你这是3.0以上版本的吧?我用的是2.2.3的,没有这个函数啊,晕

这是自己写的,在director里的类自己写

你说的是没有哪个函数?

没有这个函数renderTexture->setVirtualViewport(Point(origin.x,origin.y+getWinSize().height*0.325),fullRect,virtualViewPort);

我也遇到同样的问题,我的方法比较傻瓜,用得到的全屏截图的一部分RECT创建精灵,然后在visit该精灵。我是在quick里面做的,代码可以参考下:
local size = cc.Director:getInstance():getWinSize()
local render1 = cc.RenderTexture:create(size.width, size.height)
local runningScene = cc.Director:getInstance():getRunningScene()
render1:beginWithClear(0,0,0,0,0)
runningScene:visit() --访问整个场景
render1:endToLua()

        local render2 = cc.RenderTexture:create(size.width, size.height/2)
        --以render1的texture创建精灵,rect即为所需要的截图部分
        local tempSp = cc.Sprite:createWithTexture(render1:getSprite():getTexture(), cc.rect(0, size.height * 0.5, size.width, size.height * 0.5))

        tempSp:setAnchorPoint(0, 0)
        tempSp:setPosition(0, 0)
        tempSp:setFlippedY(true)
        
        render2:beginWithClear(0,0,0,0,0)
        tempSp:visit()      --访问精灵
        render2:endToLua()
        
        local pathsave = "share.png"
        if render2:saveToFile('share.png', 0) == true then      --render2保存为文件
            print(pathsave)
        end
1赞

我碰到的可能也是这个问题

local pRT = cc.RenderTexture:create(150, 50); --创建渲染纹理对象,并确定宽度

pRT:begin()

    local rect=CCRect(26,0,52,50);
    temp:setTextureRect(rect)         
    temp:visit()

    rect=CCRect(0,0,52,50)
    temp2:setTextureRect(rect)
    temp2:setPosition(cc.p(10,0))
    temp2:visit()
pRT:endToLua()

单个sprite只会渲染最后的位置,所以我用了多个sprite解决

你这截屏后屏幕上的图像显示会变化,3.0测试

请问renderTexture->setVirtualViewport(Point(origin.x,origin.y+getWinSize().height*0.325),fullRect,virtualViewPort);
这个函数什么作用啊,
我是先截取整个屏幕,得到截取的Sprite, 这个Sprite->setTextureRect截取你想要的区域,
然后这个Sprite->setPosition(sp->getContentSize()/2);
再创建个RenderTexture visit这个Sprite