您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-lua屏幕截屏的方法,超好用,亲测可行

2016-02-16 16:08 429 查看
cocos2d-x lua系统自带截屏功能,使用方便。代码如下:

local fileName = "printScreen.png"
-- 移除纹理缓存
cc.Director:getInstance():getTextureCache():removeTextureForKey(fileName)
self:removeChildByTag(1000)
-- 截屏
cc.utils:captureScreen(function(succeed, outputFile)
if succeed then
local winSize = cc.Director:getInstance():getWinSize()
local sp = cc.Sprite:create(outputFile)
self:addChild(sp, 0, 1000)
sp:setPosition(winSize.width / 2, winSize.height / 2)
sp:setScale(0.5) -- 显示缩放
print(outputFile)
else
cc.showTextTips("截屏失败")
end
end, fileName)


第二种方法,一帧之内进行截图并把纹理保存到本地的方法

关键代码

function WeixinShareTips.createWeixinImageFile(bShareCurrentScene, func_next)

local imgSize = cc.size(640, 960)
local backGround = {
path = "weixin/background_twoDimension.jpg",
pos = cc.p(imgSize.width / 2, imgSize.height / 2),
scale = 1
}
local logo = {
path = cc.logos[cc.getSDKPlat()],
pos = cc.p(503, 848),
scale = 0.51
}
local twoDimension = {
path = nil,
pos = cc.p(532, 106),
scale = 1
}

if bShareCurrentScene then
backGround = nil
logo.pos = cc.p(117, 550)
twoDimension = nil
imgSize = cc.size(960, 640)
logo.scale = 0.3
elseif cc.getSDKPlat() == "ios_yd" then
twoDimension.path = "weixin/twoDimension_bierangwomaoxian.jpg"
elseif cc.getSDKPlat() == "ios_yd2" then
twoDimension.path = "weixin/twoDimension_maoxianqishituan.jpg"
elseif cc.getSDKPlat() == "ios_yd3" then
twoDimension.path = "weixin/twoDimension_menghuanqishituan.jpg"
else
backGround.path = "weixin/background_noDimension.jpg"
twoDimension = nil
end

local bigImagePath = WeixinShareTips.createWeixinImageFileWithLogoAndTwoDimension("bigWeixinShare.jpg", backGround, logo, twoDimension, imgSize)
local saveRet = bigImagePath ~= nil

local function delayDoSomething(call_todo)
cc.Director : getInstance() : getRunningScene() : runAction(cc.Sequence:create(
cc.DelayTime:create(0.1), cc.CallFunc:create(function ()
call_todo()
end)))
end

delayDoSomething(function()
local imgScale = 1/8
imgSize = cc.size(imgSize.width * imgScale, imgSize.height * imgScale)
backGround = {
path = bigImagePath,
pos = cc.p(imgSize.width / 2, imgSize.height / 2),
scale = imgScale
}

local smallImagePath = WeixinShareTips.createWeixinImageFileWithLogoAndTwoDimension("smallWeixinShare.jpg", backGround, nil, nil, imgSize)
delayDoSomething(function()
saveRet = saveRet and (smallImagePath ~= nil)
func_next(saveRet, smallImagePath, bigImagePath)
end)
end)
end

function WeixinShareTips.createWeixinImageFileWithLogoAndTwoDimension(toFileName, backGround, logo, twoDimension, imgSize)

local function createRenderNodeWithPathPos(pathPos)
local sprite = nil
if pathPos then
sprite = cc.Sprite:create(pathPos.path)
sprite : setPosition(pathPos.pos)
sprite : setScale(pathPos.scale)
end
return sprite
end

local function createRenderTextureWithNodes(logoRenderNode, twoDimensionNode, backGroundNode)
-- body
local renderTexture = cc.RenderTexture:create(imgSize.width, imgSize.height)

renderTexture : beginWithClear(0,0,0,0)

if backGroundNode and (cc.Director:getInstance():getRunningScene() ~= backGroundNode) then
backGroundNode : getTexture() : setTexParameters(cc.GL_LINEAR, cc.GL_LINEAR, cc.GL_CLAMP_TO_EDGE, cc.GL_CLAMP_TO_EDGE)
end

if backGroundNode then
backGroundNode : visit()
end

if logoRenderNode then
logoRenderNode : visit()
end

if twoDimensionNode then
twoDimensionNode : visit()
end

renderTexture : endToLua()
return renderTexture
end

local function createImageFileWithRenderTexture(renderTexture)
local saveRet = renderTexture : saveToFile(toFileName, cc.IMAGE_FORMAT_JPEG, false)
cc.Director : getInstance() : getTextureCache() : removeTextureForKey(
cc.FileUtils:getInstance():getWritablePath() .. toFileName)
if saveRet then
return cc.FileUtils:getInstance():getWritablePath() .. toFileName
else
cc.showTextTips("保存图片失败")
return nil
end
end

local logoNode = createRenderNodeWithPathPos(logo)
local twoDimensionNode = createRenderNodeWithPathPos(twoDimension)
local backGroundNode = createRenderNodeWithPathPos(backGround)
if not backGroundNode then
backGroundNode = cc.Director:getInstance():getRunningScene()
end

local renderTexture = createRenderTextureWithNodes(logoNode, twoDimensionNode, backGroundNode)
return createImageFileWithRenderTexture(renderTexture)
end

用法代码如下:(WeixinShareTips.lua)
local WeixinShareTips = class("WeixinShareTips", cc.Node)
local EventTips = import(".EventTips")
local NoticeLayer = import(".NoticeLayer")
local EvaluateLayer = import(".EvaluateLayer")
local GuideLayer = import(".GuideLayer")

WeixinShareTips.RESOURCE_FILENAME = "WeixinShareTips.csb"

--一些变量
local lsl = LuaSerialize:getInstance()
local this = nil

function WeixinShareTips : ctor()
self.root = cc.CSLoader:createNode(WeixinShareTips.RESOURCE_FILENAME)
self:addChild(self.root)
self:enableNodeEvents()
this = self
end

function WeixinShareTips : getResourceNode()
return self.root
end

function WeixinShareTips.getShareRewardFromServer()
print("SHARE_SUCCESS")
--请求数据
lsl:clear()
lsl:writeShort(111)
lsl:writeBytes(cc.userSid, 8)
local data = lsl:getBytes()
cc.sendReq(cc.gameServer, data,
function (msg, sc, rc)
if sc == 0 and rc == 0 then
cc.showTextTips("分享成功,请在邮件中查收奖品")
elseif rc == 109 then
print("今日已领取奖励")
else
cc.showTextTips("sc:" .. sc .. " rc:" .. rc)
end
end)
end

function WeixinShareTips.startShareWithNodeAndshareCurrentSece(dstNode, isShareCurrentScene)
local WeixinTips = WeixinShareTips : create()
dstNode : addChild(WeixinTips)
WeixinShareTips.isShareCurrentScene = isShareCurrentScene
end

function WeixinShareTips : onEnter()
--按钮事件
--mask
self : getResourceNode() : getChildByName("pnl_mask") : addClickEventListener(
function ()
cc.gameSound:playClickSound()
self : removeFromParent()
end)

self : getResourceNode() : getChildByName("btn_shareAll") : addClickEventListener(
function ()
cc.gameSound:playClickSound()
self : removeFromParent()

WeixinShareTips.createWeixinImageFile(WeixinShareTips.isShareCurrentScene,
function(success, smallImagePath, bigImagePath)
if success then
WeixinShareTips.sendWeixinImage(cc.const.TOALLFRIENDS, smallImagePath, bigImagePath)
end
end)
end)

self : getResourceNode() : getChildByName("btn_shareFriend") : addClickEventListener(
function ()
cc.gameSound:playClickSound()
self : removeFromParent()
WeixinShareTips.createWeixinImageFile(WeixinShareTips.isShareCurrentScene,
function(success, smallImagePath, bigImagePath)
if success then
WeixinShareTips.sendWeixinImage(cc.const.TOFRIEND, smallImagePath, bigImagePath)
end
end)
end)

self : initUI()
end

--重置UI
function WeixinShareTips : initUI()
local pnl_smallItem = self.root : getChildByName("pnl_smallItem")
local pnl_hero = self.root : getChildByName("pnl_hero")
local itemInterval = 82
local heroInterval = 110

local rewards = cc.parseCombainCfg(cc.csvData["global"]["wxShareRewardShow"])
local node = self : createRewardNode(pnl_smallItem, pnl_hero, itemInterval, heroInterval, rewards)
self.root : getChildByName("pnl_posTop") : addChild(node)

rewards = cc.parseCombainCfg(cc.csvData["global"]["wxShareFirstRewardShow"])
node = self : createRewardNode(pnl_smallItem, pnl_hero, itemInterval, heroInterval, rewards)
self.root : getChildByName("pnl_posDown") : addChild(node)
end

--创建奖励,pnl_smallItem: 小项的panle, pnl_hero:英雄背景, itemInterval:列间距, heroInterval英雄间距, rewards:奖励
function WeixinShareTips : createRewardNode(pnl_smallItem, pnl_hero, itemInterval, heroInterval, rewards)

--创建角色等待动画
local function createARoleWithShadow(name, qlty, scale)
local node = ccui.Widget : create()
local anim = cc.createRoleAnim(name, qlty == "6")
anim:setName("anim")
anim:getAnimation():play("wait", -1, 1)
anim:setScale(scale)
node:addChild(anim)
anim:setPosition(45,13)
node : setContentSize(cc.size(100, 100))
return node
end

local function func_showHero(sender)
-- body
local heroCode = tostring(sender : getTag())
local hero = cc.csvData["heros"][heroCode]
EventTips.getInstance():showTips(this)
hero.new = false

hero.hit = 0 --命中
hero.crit = 0 --暴击
hero.def = 0 --防御
hero.dodge = 0 --闪避
hero.ethos = 0 --王者
hero.speed = 0 --速度

EventTips.getInstance():showHero(hero, true)
end

local function setHeroPanelInfoWithCode(panel, heroCode)
local qlty = cc.csvData["heros"][heroCode]["qlty"]
local anim = createARoleWithShadow(cc.csvData["heros"][heroCode]["appearance"], qlty, 0.35)
anim : setPosition(cc.p(47, 45))

panel : setVisible(true)
panel : getChildByName("img_anim") : removeChildByTag(1024)
panel : getChildByName("img_anim") : addChild(anim)
anim : setTag(1024)
panel : getChildByName("img_anim") : setTag(heroCode)
panel : getChildByName("img_anim") : loadTexture("icon/ui_ctn_layer_box0" .. qlty ..".png")
panel : getChildByName("img_anim") : addClickEventListener(func_showHero)
end

local function func_showItemTips(sender, touchType)
local code = tostring(sender : getTag())

if touchType == cc.const.TOUCH_EVENT_BEGAN then
local img_boxSize = sender : getContentSize()
--began
cc.gameSureTips:showItemTips(
sender,
code,
cc.p(img_boxSize.width / 2, img_boxSize.height + 6)
)
elseif touchType == 1 then
--moved
else
--ended or canceled
local tips = sender : getChildByName("showItemTips")
if tips then
tips.close()
end
end
end

local function setItemInfoWithReward(pnl_item, reward, img_boxName)
local img_box = pnl_item : getChildByName("img_box")
img_box : setName(img_boxName)
img_box : loadTexture(cc.getResIconName(reward.aType)) --icon
img_box : setTouchEnabled(true)

--数值类型
if reward.code == "0" then
reward.code = tostring(900000 + tonumber(reward.aType))
end

img_box:loadTexture("icon/ui_icon_box"..cc.csvData["items"][reward.code]["qlty"]..".png")
img_box:getChildByName("img_icon")
:loadTexture("icon/"..cc.csvData["items"][reward.code]["icon"]..".png")
img_box:getChildByName("txt_count"):setString(reward.count)

img_box : addTouchEventListener(func_showItemTips)
img_box : setTag(reward.code)
img_box : setSwallowTouches(false)
end

local startPos = cc.p(0, 0) --起点位置
local node = ccui.Widget : create()

for i = 1, #rewards, 1 do
local isHero = (rewards[i][1] == "100") --是否为英雄

if isHero then
--创建角色
local pnl_isHero = pnl_hero : clone()
node : addChild(pnl_isHero)
pnl_isHero : setPosition(startPos)
local heroCode = rewards[i][2]
setHeroPanelInfoWithCode(pnl_isHero, heroCode)
startPos.x = startPos.x + heroInterval
else
local pnl_item = pnl_smallItem : clone()
pnl_item : setVisible(true)
node : addChild(pnl_item)

local reward = {
aType = rewards[i][1],
code = rewards[i][2],
count = rewards[i][3]
}
setItemInfoWithReward(pnl_item, reward, "img_box_" .. i)
pnl_item : setPosition(startPos)
startPos.x = startPos.x + itemInterval
end

end

return node
end

function WeixinShareTips : onExit()
self : removeAllChildren()
end

function WeixinShareTips.addShareButtonTo(dstNode)

local function func_btnShare()
WeixinShareTips.startShareWithNodeAndshareCurrentSece(dstNode, true)
end

local shareOpen = not(cc.weixinID == nil or cc.weixOpen == nil or cc.weixOpen == "0")
if not shareOpen then
return nil
else
dstNode : removeChildByName("weixinShareButton")

local btn = ccui.Button : create()
dstNode : addChild(btn)

btn : setName("weixinShareButton")
btn : loadTextures("weixin/ui_btn_share_normal.png", "weixin/ui_btn_share_selected.png", "")
btn : setLocalZOrder(12345)
btn : setPosition(cc.p(898, 54))

btn : setTouchEnabled(true)
btn : addClickEventListener(func_btnShare)

return btn
end
end

--mode:0发给朋友, 1发到朋友圈, smallPng:小图片, bigPng:大图
function WeixinShareTips.sendWeixinImage(mode, smallPng, bigPng)
-- body
-- local mode = "1"
-- local smallPng = "test.png"
-- local bigPng = "testBig.png"
local info = "8;" .. mode .. ";" ..smallPng .. ";" ..bigPng .. ";" .. cc.weixinID
cc.dataEye(info)
end

--mode:0发给朋友, 1发到朋友圈, Png:图片
function WeixinShareTips.sendWeixinURL(mode, png, title, desc, url)
-- body
-- local mode = "1"
-- local png = "test.png"
-- local title = "TITLE-------TITLE"
-- local desc = "DESC--------DESC"
-- local url = "http://www.baidu.com"
-- local mode = "1"
local info = "9;" .. png .. ";" ..title .. ";" ..desc .. ";" .. url .. ";" .. mode .. ";" ..cc.weixinID
cc.dataEye(info)
end

function WeixinShareTips.createWeixinImageFile(bShareCurrentScene, func_next)

local imgSize = cc.size(640, 960)
local backGround = {
path = "weixin/background_twoDimension.jpg",
pos = cc.p(imgSize.width / 2, imgSize.height / 2),
scale = 1
}
local logo = {
path = cc.logos[cc.getSDKPlat()],
pos = cc.p(503, 848),
scale = 0.51
}
local twoDimension = {
path = nil,
pos = cc.p(532, 106),
scale = 1
}

if bShareCurrentScene then
backGround = nil
logo.pos = cc.p(117, 550)
twoDimension = nil
imgSize = cc.size(960, 640)
logo.scale = 0.3
elseif cc.getSDKPlat() == "ios_yd" then
twoDimension.path = "weixin/twoDimension_bierangwomaoxian.jpg"
elseif cc.getSDKPlat() == "ios_yd2" then
twoDimension.path = "weixin/twoDimension_maoxianqishituan.jpg"
elseif cc.getSDKPlat() == "ios_yd3" then
twoDimension.path = "weixin/twoDimension_menghuanqishituan.jpg"
else
backGround.path = "weixin/background_noDimension.jpg"
twoDimension = nil
end

local bigImagePath = WeixinShareTips.createWeixinImageFileWithLogoAndTwoDimension("bigWeixinShare.jpg", backGround, logo, twoDimension, imgSize)
local saveRet = bigImagePath ~= nil

local function delayDoSomething(call_todo)
cc.Director : getInstance() : getRunningScene() : runAction(cc.Sequence:create(
cc.DelayTime:create(0.1), cc.CallFunc:create(function ()
call_todo()
end)))
end

delayDoSomething(function()
local imgScale = 1/8
imgSize = cc.size(imgSize.width * imgScale, imgSize.height * imgScale)
backGround = {
path = bigImagePath,
pos = cc.p(imgSize.width / 2, imgSize.height / 2),
scale = imgScale
}

local smallImagePath = WeixinShareTips.createWeixinImageFileWithLogoAndTwoDimension("smallWeixinShare.jpg", backGround, nil, nil, imgSize)
delayDoSomething(function()
saveRet = saveRet and (smallImagePath ~= nil)
func_next(saveRet, smallImagePath, bigImagePath)
end)
end)
end

function WeixinShareTips.createWeixinImageFileWithLogoAndTwoDimension(toFileName, backGround, logo, twoDimension, imgSize)

local function createRenderNodeWithPathPos(pathPos)
local sprite = nil
if pathPos then
sprite = cc.Sprite:create(pathPos.path)
sprite : setPosition(pathPos.pos)
sprite : setScale(pathPos.scale)
end
return sprite
end

local function createRenderTextureWithNodes(logoRenderNode, twoDimensionNode, backGroundNode)
-- body
local renderTexture = cc.RenderTexture:create(imgSize.width, imgSize.height)

renderTexture : beginWithClear(0,0,0,0)

if backGroundNode and (cc.Director:getInstance():getRunningScene() ~= backGroundNode) then
backGroundNode : getTexture() : setTexParameters(cc.GL_LINEAR, cc.GL_LINEAR, cc.GL_CLAMP_TO_EDGE, cc.GL_CLAMP_TO_EDGE)
end

if backGroundNode then
backGroundNode : visit()
end

if logoRenderNode then
logoRenderNode : visit()
end

if twoDimensionNode then
twoDimensionNode : visit()
end

renderTexture : endToLua()
return renderTexture
end

local function createImageFileWithRenderTexture(renderTexture)
local saveRet = renderTexture : saveToFile(toFileName, cc.IMAGE_FORMAT_JPEG, false)
cc.Director : getInstance() : getTextureCache() : removeTextureForKey(
cc.FileUtils:getInstance():getWritablePath() .. toFileName)
if saveRet then
return cc.FileUtils:getInstance():getWritablePath() .. toFileName
else
cc.showTextTips("保存图片失败")
return nil
end
end

local logoNode = createRenderNodeWithPathPos(logo)
local twoDimensionNode = createRenderNodeWithPathPos(twoDimension)
local backGroundNode = createRenderNodeWithPathPos(backGround)
if not backGroundNode then
backGroundNode = cc.Director:getInstance():getRunningScene()
end

local renderTexture = createRenderTextureWithNodes(logoNode, twoDimensionNode, backGroundNode)
return createImageFileWithRenderTexture(renderTexture)
end

return WeixinShareTips
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x lua android cocos