CCRenderTexture是Cocos2d-x提供的一個渲染紋理類最疆,利用這個類可以將繪圖設備從屏幕轉移到一張紋理上奠货,從而使得一段連續(xù)的繪圖被保存到紋理中,我們可以使用這個渲染> 紋理類配合主動調(diào)用的繪圖實現(xiàn)截圖效果夏伊。
現(xiàn)在我們來看一下怎么把屏幕上顯示的內(nèi)容截圖并保存下來刑峡。
【 lua代碼】:
function M:saveScreenToRenderTexture()
-- 首先創(chuàng)建一個紋理 傳入的兩個參數(shù)分別為 寬度和高度
local render = CCRenderTexture:create(960, 640)
-- 獲取當前顯示層上面的所有節(jié)點
local nodes = self:getChildren()
local len = nodes:count()
render:begin()
for i = 0, len-1 do
local child = tolua.cast(nodes:objectAtIndex(i), "CCNode")
if child then
child:visit()
end
end
render:endToLua()
return render
end
在上述代碼中,CCRenderTexture 的 begin 和 endToLua 接口規(guī)定了繪圖轉移的時機阐污,在這兩次函數(shù)調(diào)用之間的 OpenGL 繪圖都會被繪制到一張紋理上休涤。只要調(diào)用上面的方法,我們便可以獲取到繪制好的紋理笛辟。
● CCRenderTexture 提供了兩個導出紋理的接口功氨,分別可以導出紋理為 CGImage 和文件,
它們的定義如下:
CCImage* newCCImage();
bool saveToFile(const char *name, tCCImageFormat format);
有了這兩個接口手幢,我們就可以把紋理導出來捷凄,保存成一張圖片,這樣就可以隨時對屏幕進行截圖并保存了围来。
【 lua代碼】:
local render = self:saveScreenToRenderTexture()
local image = render:newCCImage()
-- 把圖片保存在 res目錄下跺涤,命名為 1.png
image:saveToFile("res/1.png")
用 CCRenderTexture,可以動態(tài)創(chuàng)建紋理监透,并且可以在游戲中重用這些紋理桶错。只需要 5個步驟:
- 創(chuàng)建一個新的CCRenderTexture. 這里,你可以指定將要創(chuàng)建的紋理的寬度和高度胀蛮。
- 調(diào)用 CCRenderTexture:begin. 這個方法會啟動OpenGL院刁,并且接下來,任何繪圖的命令都會渲染到 CCRenderTexture里面去醇滥,而不是畫到屏幕上黎比。
- 繪制紋理. 你可以使用原始的OpenGL調(diào)用來繪圖,或者你也可以使用cocos2d對象里面已經(jīng)定義好的visit方法鸳玩。(這個visit方法就會調(diào)用一些opengl命令來繪制cocos2d對象)
- 調(diào)用 CCRenderTexture:end. 這個方法會渲染紋理阅虫,并且會關閉渲染至CCRenderTexture的通道。
- 從生成的紋理中創(chuàng)建一個sprite. 你現(xiàn)在可以用CCRenderTexture的sprite.texture屬性>來輕松創(chuàng)建新的精靈了不跟。
● CCRenderTexture 繼承自 CCNode颓帝,如果我們每幀都去調(diào)用上面的 saveScreenToRenderTexture()方法, 并且把得到的紋理添加到游戲中,我們就可以看到一個動態(tài)的屏幕預覽了购城, 就像一些游戲中的小地圖一樣吕座。
【 lua代碼】:
function M:onDraw()
if self.render then
self.render:removeFromParent()
self.render = nil
end
self.render = self:saveScreenToRenderTexture()
self.render:setScale(0.2)
self.render:setPosition(960 - 96, 640 - 64)
self:addChild(self.render, 100)
end
如圖:
Paste_Image.png
在上面的圖中,我們可以看到右上角黑色框中有一個縮略圖瘪板∥馀浚可以實時的顯示屏幕中的動態(tài)。