cocosLua 之 DrawNode

该文章介绍了在Cocos2d-Lua3.10版本中使用DrawNode进行图形绘制的方法,包括绘制点、线段、矩形、多边形、椭圆、曲线等,以及如何设置颜色和样式。这些内容对于游戏开发中的图形渲染非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境: cocos2d lua 3.10

注: 从个人博客园移植


cocos 绘图的方式有两种:

1. DrawPrimitives

2. DrawNode,比第一种绘制要快,继承于Node


关于DrawNode的使用方法:

-- 创建drawNode,并添加到指定的层中
local drawNode = cc.DrawNode:create()
self:addChild(drawNode, 10)

-- 绘制点
local pointpos = cc.p(460,460)          -- 点位置
local pointSize = 100                   -- 点大小
local color = cc.c4f(0.8, 1, 0.8, 1)    -- 颜色,取值范围0~1之间
drawNode:drawPoint(pointpos, pointSize, color)

-- 绘制一组点
local pointGroup = {                    -- 点位置组
    cc.p(160,160), cc.p(170,170), cc.p(160,170), 
    cc.p(170,160), cc.p(170,180)
}
local pointNum = #pointGroup            -- 点数目
pointSize = 1                           -- 点大小
color = cc.c4f(0.8, 1, 0.8, 1)          -- 颜色,取值范围0~1之间
drawNode:drawPoints(pointGroup, pointNum, pointSize, color)

-- 绘制线段
local origin = cc.p(0,0)                              -- 起始点
local destination = cc.p(size.width, size.height)     -- 结束点
local color = cc.c4f(0,1,0,1)                         -- 线段颜色,取值范围0~1之间
drawNode:drawLine(origin, destination, color)

-- 绘制有粗度的线条
local from = cc.p(size.width*3/4,100)         -- 起始点 
local to = cc.p(size.width*3/4,size.height/2) -- 结束点
local radius = 100                            -- 半径
local color = cc.c4f(0, 1, 1, 1)              -- 线条颜色
drawNode:drawSegment(from, to, radius, color)

-- 绘制空心矩形
local anglepos1 = cc.p(123,123)         -- 对角线原点
local anglepos2 = cc.p(700,400)         -- 对角线终点
local color = cc.c4f(1,1,0,1)           -- 颜色
drawNode:drawRect(anglepos1, anglepos2, color)

-- 绘制实心矩形
local anglepos1 = cc.p(200,200)         -- 对角线原点
local anglepos2 = cc.p(600,300)         -- 对角线终点
local color = cc.c4f(1,1,1,1)           -- 颜色
drawNode:drawSolidRect(anglepos1, anglepos2, color)

-- 绘制空心多边形
local poliGroup = {cc.p(30,130), cc.p(30,230),  -- 点位置组
    cc.p(50,200),cc.p(60,270),cc.p(80,20)
}        
local poliNum = #poliGroup                      -- 点数目
local isClose = true                            -- 是否封闭多边形,true为是
local color = cc.c4f(math.random(0,1), math.random(0,1), math.random(0,1), 1)
drawNode:drawPoly(poliGroup, poliNum, isClose, color)

-- 绘制实心多边形
local poliGroup = {cc.p(130,130), cc.p(130,230),  -- 点位置组
    cc.p(150,200),cc.p(160,270),cc.p(180,20)}        
local poliNum = #poliGroup                        -- 点数目
local color = cc.c4f(math.random(0,1), math.random(0,1), math.random(0,1), 1)
drawNode:drawSolidPoly(poliGroup, poliNum, color)

-- 绘制空心椭圆
local center = cc.p(680 ,360)           -- 圆心
local radius = 50                       -- 半径
local angle = math.pi/2                 -- 角度 
local segments = 100                    -- 段数(数值越大,越精细)
local drawLineToCenter = true           -- 是否绘制原点到圆心的直线
local scaleX, scaleY = 2.0, 1.0         -- 中心缩放值(两值相等就是圆)
local color = cc.c4f(1,1,0,1)           -- 颜色
drawNode:drawCircle(center,radius,angle,segments,drawLineToCenter,scaleX,scaleY,color)

-- 绘制实心椭圆
local center = cc.p(480 ,360)           -- 圆心
local radius = 100                      -- 半径
local angle = math.pi/2                 -- 角度 
local segments = 100                    -- 段数(数值越大,越精细)
local scaleX, scaleY = 2.0, 1.0         -- 中心缩放值(两值相等就是圆)
local color = cc.c4f(1,0,0,1)           -- 颜色
drawNode:drawSolidCircle(center, radius, angle, segments, scaleX, scaleY, color)

-- 绘制贝塞尔曲线
local origin = cc.p(size.width - 150, size.height - 150)               -- 原点
local control = cc.p(size.width - 70, size.height - 10)                -- 控制点
local destination = cc.p(size.width - 10, size.height - 10)            -- 终点
local color = cc.c4f(1,0,0,1)                                          -- 颜色
drawNode:drawQuadBezier(origin, control, destination, 10, color)

-- 绘制三次贝塞尔曲线
local origin = cc.p(480,360)        -- 原点
local control = cc.p(10,410)        -- 控制点1
local control2 = cc.p(40,310)       -- 控制点2
local destination = cc.p(0,640)     -- 终点
local segments = 100                -- 段数(数值越大,越精细)
local color = cc.c4f(1,1,1,1)       -- 颜色
drawNode:drawCubicBezier(origin, control, control2, control2, segments, color)
    
--绘制画基数样条
local pointArray = {                -- 数组点
    cc.p(200, 80),              
    cc.p(size.width - 130, 80),
    cc.p(size.width - 130, size.height - 180),
    cc.p(0, size.height - 180),
    cc.p(200, 80) 
}
local tension = 0.1                 -- 张力(数值越大,越平整)
local segments = 50                 -- 段数(数值越大,越精细)
local color = cc.c4f(0.8, 0.7, 1, 1)-- 样条颜色
drawNode:drawCardinalSpline(pointArray,tension,segments,color)

-- 
local pointArray = {                           -- 指向控制点的点数组
    cc.p(size.width/2, 30),
    cc.p(size.width - 80, 30),
    cc.p(size.width - 80, size.height - 80),
    cc.p(size.width/2, size.height - 80),
    cc.p(size.width/2, 30) 
}
local segments = 50                             -- 段数(数值越大,越精细)
local color = cc.c4f(1, 0, 1, 1)                -- 颜色
drawNode:drawCatmullRom(pointArray, segments, color)

-- 绘制圆
for i=1, 10 do
    local pos = cc.p(size.width/4, size.height*3/4)     -- 原点
    local radius = 10*(10-i)                            -- 半径
    local color = cc.c4f(math.random(0,1),math.random(0,1),math.random(0,1),1)
    drawNode:drawDot(pos, radius, color)
end

-- 绘制一个带有填充色和线条色的多边形
local o, w, h = 80, 20, 50
local verts = {                        -- 点坐标组
    cc.p(o, o), cc.p(o + w, o - h), cc.p(o + w*2, o),   -- lower spike
    cc.p(o + w*2 + h, o + w ), cc.p(o + w*2, o + w*2),  -- right spike
    cc.p(o + w, o + w*2 + h), cc.p(o, o + w*2),         -- top spike
    cc.p(o - h, o + w),                                 -- left spike
}
local count = #verts                    -- 点数目
local fillColor = cc.c4f(1,0,0,0.5)     -- 填充颜色
local borderWidth = 1                   -- 线条宽度
local borderColor = cc.c4f(0,0,1,1)     -- 线条颜色
drawNode:drawPolygon(verts, count, fillColor, borderWidth, borderColor)

效果图如下:
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹤九日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值