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,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,scale = imgScale } local smallImagePath = WeixinShareTips.createWeixinImageFileWithlogoAndTwoDimension("smallWeixinShare.jpg",nil,imgSize) delayDoSomething(function() saveRet = saveRet and (smallImagePath ~= nil) func_next(saveRet,smallImagePath,bigImagePath) end) end) end function WeixinShareTips.createWeixinImageFileWithlogoAndTwoDimension(toFileName,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) 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,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,bigImagePath) if success then WeixinShareTips.sendWeixinImage(cc.const.TOALLFRIENDS,bigImagePath) end end) end) self : getResourceNode() : getChildByName("btn_shareFriend") : addClickEventListener( function () cc.gameSound:playClickSound() self : removeFromParent() WeixinShareTips.createWeixinImageFile(WeixinShareTips.isShareCurrentScene,bigImagePath) if success then WeixinShareTips.sendWeixinImage(cc.const.TOFRIEND,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,rewards) self.root : getChildByName("pnl_posDown") : addChild(node) end --创建奖励,pnl_smallItem: 小项的panle,pnl_hero:英雄背景,itemInterval:列间距,heroInterval英雄间距,rewards:奖励 function WeixinShareTips : createRewardNode(pnl_smallItem,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"],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,"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发给朋友,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,backGroundNode) return createImageFileWithRenderTexture(renderTexture) end return WeixinShareTips