《Cocos2d-x-3.2 Lua-tests》文件详解 之 基本绘图DrawPrimitives


绘图API由相应的编程语言提供,cocos2d封装了自己的绘图方法,形成独有的特性。

  1 --[[
  2     cocos2d-x基本图形的绘制
  3 --]]
  4 
  5 local function drawPrimitivesMainLayer()
  6     local kItemTagBasic = 1000
  7     local testCount = 2
  8     local maxCases = testCount
  9     local curCase  = 0
 10     local size = cc.Director:getInstance():getWinSize()
 11     local curLayer = nil
 12 
 13     local  function orderCallbackMenu()
 14         local function backCallback()
 15             curCase = curCase - 1
 16             if curCase < 0 then
 17                 curCase = curCase + maxCases
 18             end
 19             showCurrentTest()
 20         end
 21     
 22         local function restartCallback()
 23             showCurrentTest()
 24         end
 25     
 26         local function nextCallback()
 27             curCase = curCase + 1
 28             curCase = curCase % maxCases
 29             showCurrentTest()
 30         end
 31 
 32         local ordercallbackmenu = cc.Menu:create()
 33         local size = cc.Director:getInstance():getWinSize()
 34         local item1 = cc.MenuItemImage:create(s_pPathB1, s_pPathB2)
 35         item1:registerScriptTapHandler(backCallback)
 36         ordercallbackmenu:addChild(item1,kItemTagBasic)
 37         local item2 = cc.MenuItemImage:create(s_pPathR1, s_pPathR2)
 38         item2:registerScriptTapHandler(restartCallback)
 39         ordercallbackmenu:addChild(item2,kItemTagBasic)
 40         local item3 = cc.MenuItemImage:create(s_pPathF1, s_pPathF2)
 41         ordercallbackmenu:addChild(item3,kItemTagBasic) 
 42         item3:registerScriptTapHandler(nextCallback)
 43                 
 44         item1:setPosition(cc.p(size.width / 2 - item2:getContentSize().width * 2, item2:getContentSize().height / 2))
 45         item2:setPosition(cc.p(size.width / 2, item2:getContentSize().height / 2))
 46         item3:setPosition(cc.p(size.width / 2 + item2:getContentSize().width * 2, item2:getContentSize().height / 2))
 47         
 48         ordercallbackmenu:setPosition(cc.p(0, 0))
 49 
 50         return ordercallbackmenu
 51     end
 52 
 53     local function GetTitle()
 54         if 0 == curCase then
 55             return "Draw primitives"
 56         elseif 1 == curCase then
 57             return "Test DrawNode"
 58         end
 59     end
 60     
 61     local function GetSubTitle()
 62         if 0 == curCase then
 63             return "Drawing Primitives by call gl funtions"
 64         elseif 1 == curCase then
 65             return "Testing DrawNode - batched draws. Concave polygons are BROKEN"
 66         end
 67     end
 68 
 69     local function InitTitle(layer)
 70         --Title
 71         local lableTitle = cc.Label:createWithTTF(GetTitle(), s_arialPath, 40)
 72         layer:addChild(lableTitle, 15)
 73         lableTitle:setAnchorPoint(cc.p(0.5, 0.5))
 74         lableTitle:setPosition(cc.p(size.width / 2, size.height - 32))
 75         lableTitle:setColor(cc.c3b(255, 255, 40))
 76         --SubTitle
 77         local subLabelTitle = cc.Label:createWithTTF(GetSubTitle(), s_thonburiPath, 16)
 78         layer:addChild(subLabelTitle, 15)
 79         subLabelTitle:setAnchorPoint(cc.p(0.5, 0.5))
 80         subLabelTitle:setPosition(cc.p(size.width / 2, size.height - 80)) 
 81     end
 82     --[[
 83         两种大的方法:
 84         1、OpenGL图形库绘图
 85         2、绘图节点绘图
 86     --]]
 87     
 88     --基本绘图API展示
 89     local function createDrawPrimitivesEffect()
 90         local layer = cc.Layer:create()
 91 
 92         InitTitle(layer)
 93         
 94         --创建图形库节点,并设置尺寸和锚点
 95         local glNode  = gl.glNodeCreate()
 96         glNode:setContentSize(cc.size(size.width, size.height))
 97         glNode:setAnchorPoint(cc.p(0.5, 0.5))
 98 
 99         --自定义回调方法
100         local function primitivesDraw(transform, transformUpdated)
101             --不懂OpenGL的,就只能先记住  了
102             kmGLPushMatrix()
103             kmGLLoadMatrix(transform)
104             --指定两个点,画线
105             cc.DrawPrimitives.drawLine(VisibleRect:leftBottom(), VisibleRect:rightTop() )
106             
107             --指定两个点,画线。还可以设置颜色、透明度和线宽
108             gl.lineWidth( 5.0 )--线宽
109             cc.DrawPrimitives.drawColor4B(255,0,0,255)--颜色
110             cc.DrawPrimitives.drawLine( VisibleRect:leftTop(), VisibleRect:rightBottom() )
111             
112             --在某一个坐标上画点
113             cc.DrawPrimitives.setPointSize(64)
114             cc.DrawPrimitives.drawColor4B(0, 0, 255, 128)
115             cc.DrawPrimitives.drawPoint(VisibleRect:center())
116 
117             --画多个点
118             local points = {cc.p(60,60), cc.p(70,70), cc.p(60,70), cc.p(70,60) }
119             cc.DrawPrimitives.setPointSize(4)
120             cc.DrawPrimitives.drawColor4B(0,255,255,255)
121             --drawPoints()第二个参数表示从table中依次取多少个
122             cc.DrawPrimitives.drawPoints(points,4)
123 
124             gl.lineWidth(5)
125             cc.DrawPrimitives.drawColor4B(0, 255, 0, 255)
126             --5个参数:圆心,半径,逆时针旋转的角度(弧度制),正几边形,是否显示半径
127             --也许你觉得旋转的角度没有意义,但当你明白这里的Circle是由正多边形模拟的,就懂了
128            -- cc.DrawPrimitives.drawCircle( VisibleRect:center(), 110, math.pi, 100, true)
129            -- cc.DrawPrimitives.drawCircle( VisibleRect:center(), 150, 90, 100, true)
130            -- cc.DrawPrimitives.drawCircle( VisibleRect:center(), 135, 45, 100, true)
131             cc.DrawPrimitives.drawCircle( VisibleRect:center(), 120, 0, 100, false)
132             
133             --画圆,同上
134             gl.lineWidth(2)
135             cc.DrawPrimitives.drawColor4B(0, 255, 255, 255)
136             cc.DrawPrimitives.drawCircle( VisibleRect:center(), 50, math.pi / 2, 50, true)
137 
138             --画实圆,参数:圆心,半径,旋转角度(弧度,边数,x轴缩放,y轴缩放
139             gl.lineWidth(2)
140             cc.DrawPrimitives.drawColor4B(255, 0, 255, 255)
141             cc.DrawPrimitives.drawSolidCircle( cc.p(VisibleRect:center().x + 140 ,VisibleRect:center().y), 40, math.rad(90), 10, 1.0, 1.0)
142             
143             --任意空多边形
144             gl.lineWidth(10)
145             cc.DrawPrimitives.drawColor4B(255, 255, 0, 255)
146             local yellowPoints = { cc.p(0,0), cc.p(50,50), cc.p(100,50), cc.p(100,100), cc.p(50,100)}
147             --3参数:顶点列表,点数,是否封闭(首尾相连)
148             cc.DrawPrimitives.drawPoly( yellowPoints, 5, true)
149             
150             --任意实多边形,
151             gl.lineWidth(1)
152             local filledVertices = { cc.p(0,120), cc.p(50,120), cc.p(50,170), cc.p(25,200), cc.p(0,170) }
153             --3参数:顶点列表,顶点数,颜色
154            cc.DrawPrimitives.drawSolidPoly(filledVertices, 5, cc.c4f(0.5, 0.5, 1, 1))
155 
156             --任意空多边形,同上
157             gl.lineWidth(2)
158             cc.DrawPrimitives.drawColor4B(255, 255, 255, 255)
159             local closePoints= { cc.p(30,130), cc.p(30,230), cc.p(50,200) }
160             cc.DrawPrimitives.drawPoly( closePoints, 3, true)
161             
162             --基本贝赛尔曲线,4参数:起点,控制点,终点,边数。
163             --普及一下:计算机是用首尾连接的线段模拟曲线和圆,分段越多,就越圆滑,越象曲线。
164             cc.DrawPrimitives.drawQuadBezier(VisibleRect:leftTop(), VisibleRect:center(), VisibleRect:rightTop(), 50)
165             
166             --多段贝赛尔曲线:起点,控制点...控制点,终点,边数
167             cc.DrawPrimitives.drawCubicBezier(VisibleRect:center(), cc.p(VisibleRect:center().x + 30, VisibleRect:center().y + 50), cc.p(VisibleRect:center().x + 60,VisibleRect:center().y - 50), VisibleRect:right(), 100)
168 
169             --实任意多边形:顶点列表,边数,颜色
170             local solidvertices = {cc.p(60,160), cc.p(70,190), cc.p(100,190), cc.p(90,160)}
171             cc.DrawPrimitives.drawSolidPoly( solidvertices, 4, cc.c4f(1, 1, 0, 1) )
172 
173             local array = {
174                 cc.p(0, 0),
175                 cc.p(size.width / 2 - 30, 0),
176                 cc.p(size.width / 2 - 30, size.height - 80),
177                 cc.p(0, size.height - 80),
178                 cc.p(0, 0),
179             }
180             cc.DrawPrimitives.drawColor4B(255,0,0,255)
181            cc.DrawPrimitives.drawCatmullRom( array, 20)
182             --基样线条:参照点列表,精度,边数
183            cc.DrawPrimitives.drawCardinalSpline( array, 0,100)
184 
185             gl.lineWidth(1)
186             cc.DrawPrimitives.drawColor4B(255,255,255,255)
187             cc.DrawPrimitives.setPointSize(1)
188 
189             kmGLPopMatrix()
190         end
191         --给图形库节点注册绘图回调
192         glNode:registerScriptDrawHandler(primitivesDraw)
193         --将图形库节点(glNode)添加到Layer,并设置位置
194         layer:addChild(glNode,-10)
195         glNode:setPosition( size.width / 2, size.height / 2)
196 
197         return layer
198     end
199     
200     --
201     local function createDrawNodeTest()
202         local layer = cc.Layer:create()
203 
204         InitTitle(layer)
205         
206         --cocos2d-x绘图节点
207         --下面的绘图,直接调用DrawNode节点的相关方法:drawDot
208         local draw = cc.DrawNode:create()
209         layer:addChild(draw, 10)
210 
211         --Draw 10 circles
212         --画十个同心圆点
213         for i=1, 10 do
214             --参数:位置,半径,颜色和透明度 -
215             draw:drawDot(cc.p(size.width/2, size.height/2 + i*10), 10*(10-i), cc.c4f(math.random(0,1), math.random(0,1), math.random(0,1), 1))
216         end
217 
218         --Draw polygons多边形:顶点列表,顶点数,填充颜色,边的颜色
219         points = { cc.p(size.height/4, 0), cc.p(size.width, size.height / 5), cc.p(size.width / 3 * 2, size.height) }
220        -- draw:drawPolygon(points, table.getn(points), cc.c4f(1,0,0,0.5), 4, cc.c4f(0,0,1,1))
221 
222         local o = 80
223         local w = 20
224         local h = 50
225         local star1 = { cc.p( o + w, o - h), cc.p(o + w * 2, o), cc.p(o + w * 2 + h, o + w), cc.p(o + w * 2, o + w * 2) }
226         
227         --draw:drawPolygon(star1, table.getn(star1), cc.c4f(0,1,0,0.5), 1, cc.c4f(0,0,1,1))
228 
229         o = 180
230         w = 20
231         h = 50
232         local star2 = {
233             cc.p(o, o), cc.p(o + w, o - h), cc.p(o + w * 2, o),        --lower spike
234             cc.p(o + w * 2 + h, o + w ), cc.p(o + w * 2, o + w * 2),      --right spike
235             cc.p(o + w, o + w * 2 + h), cc.p(o, o + w * 2),               --top spike
236             cc.p(o - h, o + w),                                              --left spike
237         };
238         
239         --draw:drawPolygon(star2, table.getn(star2), cc.c4f(1,0,0,0.5), 1, cc.c4f(0,0,1,1))
240 
241         --画线段:起点,终点,线宽,颜色
242         draw:drawSegment(cc.p(20,size.height), cc.p(20,size.height/2), 10, cc.c4f(0, 1, 1, 0.5))
243 
244         draw:drawSegment(cc.p(10,size.height/2), cc.p(size.width, size.height/2), 40, cc.c4f(1, 0, 0, 0.5))
245 
246         return layer
247     end
248     
249     --[[
250         总结:
251         绘图两种方法及各自的步骤:
252         方法一:
253         1、创建图形库节点:local glNode  = gl.glNodeCreate()
254         2、给该节点注册封装了绘图方法的回调 glNode:registerScriptDrawHandler(primitivesDraw),然后你就可以在primitiesDraw()中自由发挥了
255            直接调用cc.DrawPrimitives.下的一系列方法。其中设置线宽的方法为:gl.lineWidth(int),颜色:cc.DrawPrimitives.drawColor4B(255,0,0,255)
256         3、将图形库节点添加到层中显示
257         
258      方法二:
259         1、创建cocos2d-x绘图节点,local drawNode = cc.DrawNode:create()
260         2、添加到层,layer:addChild(drawNode)
261         3、直接调用绘图节点下的方法绘图,如:drawNode:drawSegment(cc.p()...cc.p(),int,cc.c4f())
262         
263         至于说这两种方法的区别,等我有空慢慢研究吧。
264     --]]
265 
266 
267     --下面的是通用界面布局,不解释
268     local function createLayerByCurCase(curCase)
269         if 0 == curCase then
270             return createDrawPrimitivesEffect()
271         elseif 1 == curCase then
272             return createDrawNodeTest()
273         end
274     end
275 
276     function showCurrentTest()    
277         local curScene = cc.Scene:create()
278         if nil ~= curScene then
279             curLayer = createLayerByCurCase(curCase)
280             if nil ~= curLayer then
281                 curScene:addChild(curLayer)
282                 curLayer:addChild(orderCallbackMenu(),15)
283                 curScene:addChild(CreateBackMenuItem())
284                 cc.Director:getInstance():replaceScene(curScene)
285             end            
286         end 
287     end
288 
289     curLayer = createLayerByCurCase(curCase)
290     curLayer:addChild(orderCallbackMenu(),15)
291     return curLayer
292 end
293 
294 function DrawPrimitivesTest()
295     local scene = cc.Scene:create()
296     scene:addChild(drawPrimitivesMainLayer())
297     scene:addChild(CreateBackMenuItem())
298     return scene
299 end

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM