如果你想要程序中自己绘制一些图形,那么只需要重写一下CCNode的draw方法,并在里面实现你的绘制方法就行了:

下面介绍一下常用的绘制函数:

//设置绘制颜色

ccDrawColor4B( GLubyte r, GLubyte g, GLubyte b, GLubyte a )

r : 红色份量  g : 绿色份量   b : 蓝色份量   a : 透明度

4个参数的数值范围:0~255

ccDrawColor4F( GLfloat r, GLfloat g, GLfloat b, GLfloat a );

r : 红色份量  g : 绿色份量   b : 蓝色份量   a : 透明度

4个参数的数值范围:0~1的浮点数

//设置点的大小单位为像素

ccPointSize(GLfloat pointSize)

pointSize:点的大小 (这个只对点有效果)

//绘制一个点

ccDrawPoint(CGPoint point)

point : 点的坐标

//设置绘制线条的宽度

glLineWith(GLfloat width);

width : 线条宽度

//绘制一条线

ccDrawLine(CGPoint origin, CGPoint destination)

origin : 起始坐标

destination : 终点坐标

//绘制多边形

ccDrawPoly(const CGPoint *vertices, NSUInteger numOfVertices, BOOL closePolygon)

vertices:顶点数组

numOfVertices:顶点数量

closePolygon:是否封闭多边形

//绘制填充多边形

ccDrawSolidPoly(const CGPoint *poli, NSUInteger numberOfPoints, ccColor4F color)

vertices:顶点数组

numOfVertices:顶点数量

color:填充颜色

//绘制矩形

ccDrawRect(CGPoint origin, CGPoint destination)

origon:矩形右上角的顶点

destination:矩形左下角的顶点

//绘制填充矩形

ccDrawRect(CGPoint origin, CGPoint destination , ccColor4F color)

origon:矩形右上角的顶点

destination:矩形左下角的顶点

color:填充颜色

//绘制圆形(这个方法可以用于绘制正多边形)

ccDrawCircle(CGPoint center, float radius, float angle, NSUInteger segments, BOOL drawLineToCenter)

center : 圆心点坐标

radius : 半径长度

angle : 圆形旋转角度值的范围是 0~2*M_PI( M_PI = π)为一周(360度)

segments : 顶点数量(边数 = 定点数 - 1),当这个值为1时绘制的是一个点 ,2为一条直线,3为三角形.......定点数越大越趋近于圆,一般来说这个值为2*radius就足够了。

drawLineToCenter : 是否绘制半径线:绘制一条从中心点到第一个定点的线条

//绘制贝塞尔曲线

ccDrawCubicBezier(CGPoint origin, CGPoint control1, CGPoint control2, CGPoint destination, NSUInteger segments)

origin :起始点

control1 :控制点1

control2 :控制点2

destination :结束点

segments :顶点数量

要注意一点你必须把这些方法写在draw方法中,否则不会被绘制到屏幕上。而且这些绘制方法会在每一帧调用一次,如果前一帧绘制的图形,在下一帧没有调用到,那么它们在下一帧就不会被绘制到屏幕上。当场景中添加的图片较多时帧数会降低,是因为图片越多描绘一次的时间越长,帧数就降低了。

下面我们来实现一个简单的画笔功能:

首先新建一个项目,在HelloWorldLayer头文件中添加一个实例变量:

NSMutableArray* drawAllarray;

这个是用来存储画笔痕迹的

并添加两个全局变量:colorType画笔颜色,lineWith画笔宽度

int colorType = 0;

int lineWith = 1;

然后在初始化方法里面添加如下代码:

//存储所有的画笔痕迹

drawAllarray = [[NSMutableArray alloc] init];

//设置菜单字体和颜色

[CCMenuItemFont setFontName:@"AppleGothic"];

[CCMenuItemFont setFontSize:15];

//改变画笔颜色

CCMenuItem* item1 = [CCMenuItemFont itemWithString:@"改变画笔颜色" target:self selector:@selector(updateDrawColor)];

//撤销操作

CCMenuItem* item2 = [CCMenuItemFont itemWithString:@"撤销操作" target:self selector:@selector(cancle)];

//改变画线宽度

CCMenuItem* item3 = [CCMenuItemFont itemWithString:@"改变画线宽度" target:self selector:@selector(updateLineWidth)];

CCMenu * menu = [CCMenu menuWithItems:item1,item3,item2, nil];

[menu alignItemsVertically];

menu.position = ccp(50, 150);

[self addChild:menu];

注册和删除单触点接收:

-(void)onEnter

{

[super onEnter];

[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];

}

-(void)onExit

{

[super onExit];

[[[CCDirector sharedDirector] touchDispatcher] removeDelegate:self];

}

接着我们要触摸响应方法中存储画笔痕迹:

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event

{

CGPoint locationPoint = [self convertTouchToNodeSpace:touch];

CCPointArray* pointarray = [[[CCPointArray alloc] init] autorelease];

[pointarray addControlPoint:locationPoint];

NSMutableArray* drawonearray = [[NSMutableArray alloc] init];

[drawonearray addObject:[NSString stringWithFormat:@"%d",colorType]];

[drawonearray addObject:[NSString stringWithFormat:@"%d",lineWith]];

[drawonearray addObject:pointarray];

[drawAllarray addObject:drawonearray];

return YES;

}

-(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event

{

CGPoint locationPoint = [self convertTouchToNodeSpace:touch];

[(CCPointArray*)[[drawAllarray lastObject] lastObject] addControlPoint:locationPoint];

}

首次触摸响应方法里面定义了两个数组:

pointarray : 存储触点位置

drawonearray : 存储当前画笔颜色,宽度和触点位置

接着把存储有当前画笔信息的数组drawonearray添加到drawAllarray中。

在触摸移动的方法里存储当前画笔痕迹(出点位置)

接着在draw方法中把这些画笔描绘出来:

-(void)draw

{

for (NSMutableArray* array in drawAllarray)

{

[self updatedrawcolorWith:[(NSString*)[array objectAtIndex:0] intValue]];

[self lineWidth:[(NSString*)[array objectAtIndex:1] intValue]];

CCPointArray* pointarray = [array lastObject];

int l = pointarray.count;

for (int i = 0; i < l; i++)

{

if (l > 1)

{

ccDrawLine([pointarray getControlPointAtIndex:i-1], [pointarray getControlPointAtIndex:i]);

}

else

{

ccDrawPoint([pointarray getControlPointAtIndex:i]);

}

}

}

}

这里使用ccDrawLine把画笔痕迹连接起来这样我们的画笔功能就实现了。

下面是相关的其它方法:

//改变画笔颜色

-(void)updateDrawColor

{

if (colorType == 3)

{

colorType = 0;

}

else

colorType++;

[self updatedrawcolorWith:colorType];

}

-(void)updatedrawcolorWith:(int) type

{

switch (type)

{

case 0:

ccDrawColor4F(1, 1, 1, 1);

break;

case 1:

ccDrawColor4F(1, 0, 0, 1);

break;

case 2:

ccDrawColor4F(0, 1, 0, 1);

break;

case 3:

ccDrawColor4F(0, 0, 1, 1);

break;

default:

break;

}

}

//改变画线宽度

-(void)updateLineWidth

{

if (lineWith > 4)

{

lineWith = 0;

}

lineWith++;

glLineWidth(lineWith);

}

-(void)lineWidth:(int)type

{

glLineWidth(type);

}

//撤销操作

-(void)cancle

{

[drawAllarray removeLastObject];

}

运行截图2.8-1:

cocos2d实现画笔功能及常用的绘制函数相关推荐

  1. matplotlib.pyplot常用画图方式函数封装(一)——.plot绘制折线图及设置坐标轴箭头完美解决

    matplotlib.pyplot常用画图方式函数封装(一)--.plot绘制折线图及设置坐标轴箭头完美解决 py.plot常见绘图设置函数封装 绘制函数图像(完美解决坐标轴添加箭头) 绘制折线图 p ...

  2. citra 图形设置_功能强大的图形绘制软件

    Canvas Draw mac是一款功能强大的图形绘制软件,轻松帮助您与同事轻松共享项目.Canvas Draw内置大量模板和素材,包括一套全面的矢量对象和高级光栅图像编辑工具,可让你将单一文档中的适 ...

  3. 【Scratch】青少年蓝桥杯_每日一题_11.01_画笔功能

    用心写好每一篇文章 效果图 一.题目背景 通过编程实现具有画笔功能的程序﹐按下鼠标画笔跟随鼠标移动﹐抬起鼠标画笔停止绘制. 二.编程实现 1)运行程序,清空屏幕﹐画笔角色隐藏; 2)在舞台区域按下鼠标 ...

  4. matplotlib 常用图形绘制与官方文档

    matplotlib 常用图形绘制与官方文档 matplotlib.org Python库matplotlib 图形绘制 官方教程目录 matplotlib.pyplot matplotlib.pyp ...

  5. MFC 画笔功能实现

    一.4个消息处理 如果是在VS2012上,我们可以很方便的在对话框的属性栏找到消息页面添加消息 如果是以前的VC6的版本,那还是得老老实实使用Class Wizzard类向导添加消息 左键按下.抬起. ...

  6. 函数图像在图形计算机的应用,Win10计算器迎来重大新功能:可绘制函数图形

    Windows系统的计算器是我们常用的工具,现在Win10中新的计算器应用将迎来重大功能更新!现在大家可以去应用商店里更新计算器应用!新的计算器支持绘制函数图形可帮助用户理解帮线性代数.计算器应用更新 ...

  7. tableau两个不同的图合并_Tableau可视化分析-业务常用图形绘制1

    微信公众号链接: Tableau可视化分析-业务常用图形绘制1​mp.weixin.qq.com 哑铃图VS 火柴图 哑铃图,又名DNA图,横着看是哑铃,竖着看就是DNA,它主要用来表现两个数据点之间 ...

  8. 主流的分布式调度框架、Elastic-job简介、功能和常用介绍

    主流的分布式调度框架.Elastic-job简介.功能和常用介绍 主流的分布式调度框架 Elastic-job简介 功能 常用 主流的分布式调度框架 elastic-job:由当当网基于quartz ...

  9. Solidworks鼠标功能和常用快捷键

    Solidworks鼠标功能和常用快捷键 文章目录 Solidworks鼠标功能和常用快捷键 鼠标 一.鼠标左键 二.中键 三.鼠标右键 Solidworks中常用快捷键 一.与文件相关 二.与编辑操 ...

  10. R 实战| 几种常用的绘制离散变量热图/方块图/华夫图的方法

    R 实战| 几种常用的绘制离散变量热图/方块图/华夫图的方法 前言 常用方法 geom_tile ggwaffle ComplexHeatmap 总结 参考 往期 前言 多组学文章经常出现非连续变量的 ...

最新文章

  1. python无法使用pip_解决无法使用pip命令加载Python的扩展库问题
  2. 扩展系统功能——装饰模式
  3. 「LibreOJ NOI Round #2」不等关系 (dp+NTT分治)
  4. SAP License:SAP Concur是什么?
  5. Google 为中国开发者都带来了什么?
  6. [paper reading] SSD
  7. mysql if join_如何在MySQL中使用JOIN编写正确的If … Else语句?
  8. dingo php,Laravel+Dingo/Api 自定义响应的实现
  9. 【配送路径规划】基于matlab帝企鹅算法求解冷链配送问题【含Matlab源码 201期】
  10. 常用的python科学计算库有哪些_python科学计算常用的数学科学计算库有哪些?
  11. java xsd解析_java dom4j解析XSD文件
  12. python搭建一个后端平台
  13. 手机电源键关不了屏幕_手机关机关不了,屏幕也划不了,怎么办
  14. 计算机处理器i3 i5,realme Book笔记本高清渲染图曝光 配置上搭载11代酷睿i3/i5处理器...
  15. MT9255无法使用mm指令编译某个模块的问题
  16. swfobject2.2参数详解(swfobject.embedSWF)
  17. 好评率超高的9个公众号,值得收藏
  18. 利用Google Map显示指定位置地理位置
  19. python——常见运算符号
  20. word标题前面存在竖线

热门文章

  1. EasyUI - panel 高度自适应
  2. 互联网行业的HR怎么看待30岁以上的基础岗位求职者
  3. springboot+vue+elementUI 公司财务固定资产管理系统#毕业设计
  4. 【HTML5】初识前端页面结构与基本标签
  5. 写给海布里之王—亨利
  6. 项目质量管理的几种常规方法
  7. 洛谷P3110 [USACO14DEC]驮运Piggy Back
  8. 学完后端还要学前端,在这之间还有中间件
  9. 少年中国说 梁启超
  10. Python实现商场管理系统