《Cocos2d-x-3.2 Lua-tests》文件详解 之 截屏CaptreScreen

时间:2022-06-01 18:58:59

截屏是3.2版新加进来的功能。

核心就一句话:cc.utils:captureScreen(CallBack,FileName),接收两个参数,CallBack,用来部署接下来要做的事情,FileName用来命名图片。

  1 local winSize = cc.Director:getInstance():getWinSize()
2 local kTagSprite = 1
3 local childTag = 119
4
5 local function createLayer()
6 local layer = cc.Layer:create()
7 local filename = ""
8 --title界面标题
9 local title = cc.Label:createWithTTF("New Renderer", "fonts/arial.ttf", 36)
10 title:setColor(cc.c3b(255,255,0))
11 layer:addChild(title, 1, 10000)
12 title:setPosition( cc.p(VisibleRect:center().x, VisibleRect:top().y - 30))
13
14 --subTitle副标题
15 local subTitle = cc.Label:createWithTTF("Capture screen test, press the menu items to capture the screen", "fonts/arial.ttf", 12)
16 subTitle:setColor(cc.c3b(255,255,0))
17 layer:addChild(subTitle, 1, 10001)
18 subTitle:setPosition( cc.p(VisibleRect:center().x, VisibleRect:top().y - 60) )
19
20 local left = cc.p(winSize.width / 4, winSize.height / 2)
21 local right = cc.p(winSize.width / 4 * 3, winSize.height / 2)
22
23 --Sprite1
24 local sp1 = cc.Sprite:create("Images/grossini.png")
25 sp1:setPosition(left)
26 local move1 = cc.MoveBy:create(1, cc.p(winSize.width/2, 0))
27 local seq1 = cc.RepeatForever:create(cc.Sequence:create(move1, move1:reverse()))
28 layer:addChild(sp1)
29 sp1:runAction(seq1)
30
31 --Sprite2
32 local sp2 = cc.Sprite:create("Images/grossinis_sister1.png")
33 sp2:setPosition(right)
34 local move2 = cc.MoveBy:create(1, cc.p(-winSize.width/2, 0))
35 local seq2 = cc.RepeatForever:create(cc.Sequence:create(move2, move2:reverse()))
36 layer:addChild(sp2)
37 sp2:runAction(seq2)
38
39 --截屏回调方法
40 --截图成功后,用截到的图创建一个Sprite,添加到Layer上显示出来
41 local function afterCaptured(succeed, outputFile)
42 --captureScreen()会传出两个参数跟回调方法,succeed:表示截屏是否成功,outputFile传出文件名 —— 在onCapture中,已经定义了文件名
43 if succeed then
44 --成功,则用截图创建Sprite,显示出来
45 local sp = cc.Sprite:create(outputFile)
46 layer:addChild(sp, 0, childTag)
47 sp:setPosition(winSize.width / 2, winSize.height / 2)
48 --当然不显示原图了,免得遮住了屏幕上的其他内容,所有缩放一下。
49 sp:setScale(0.45)
50 --将文件名传给fileName,在下次截图的onCapture方法中,你需要删除它
51 fileName = outputFile
52 else
53 --截屏失败,给外界提示
54 cclog("Capture screen failed.")
55 end
56 end
57
58 --本例核心,截图
59 local function onCaptured(tag, sender)
60 --首先将之前截图显示的图片remove掉
61 cc.Director:getInstance():getTextureCache():removeTextureForKey(fileName)
62 layer:removeChildByTag(childTag)
63
64 --给截到的图一个文件名
65 fileName = "CaptureScreenTest.png"
66
67 --[[
68 调用utls中的captreScreen()方法,该方法需要一个回调方法,一个文件名
69 回调用于截图之后的才做,如保存、分享等等 ,文件名用于给截到的图命名
70 --]]
71 cc.utils:captureScreen(afterCaptured, fileName)
72 end
73
74 local ttfConfig = {}
75 ttfConfig.fontFilePath = "fonts/arial.ttf"
76 ttfConfig.fontSize = 24
77 --用ttf文件,创建一个label
78 local label1 = cc.Label:createWithTTF(ttfConfig, "capture all", cc.TEXT_ALIGNMENT_CENTER, winSize.width)
79
80 --创建菜单项,需要用到label,并注册Tap事件侦听器
81 local mi1 = cc.MenuItemLabel:create(label1)
82 mi1:registerScriptTapHandler(onCaptured)
83
84 --创建菜单,将菜单项放进去
85 local menu = cc.Menu:create(mi1)
86 layer:addChild(menu)
87 menu:setPosition(winSize.width / 2, winSize.height / 4)
88
89 return layer
90 end
91
92 --------------------------------
93 -- CaptureScreen
94 --------------------------------
95 function CaptureScreenTestMain()
96 local scene = cc.Scene:create()
97 scene:addChild(createLayer())
98 scene:addChild(CreateBackMenuItem())
99 return scene
100 end

今天事情比较少,一不小心多发了几篇。。