cocos2d实现画笔功能及常用的绘制函数
如果你想要程序中自己绘制一些图形,那么只需要重写一下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实现画笔功能及常用的绘制函数相关推荐
- matplotlib.pyplot常用画图方式函数封装(一)——.plot绘制折线图及设置坐标轴箭头完美解决
matplotlib.pyplot常用画图方式函数封装(一)--.plot绘制折线图及设置坐标轴箭头完美解决 py.plot常见绘图设置函数封装 绘制函数图像(完美解决坐标轴添加箭头) 绘制折线图 p ...
- citra 图形设置_功能强大的图形绘制软件
Canvas Draw mac是一款功能强大的图形绘制软件,轻松帮助您与同事轻松共享项目.Canvas Draw内置大量模板和素材,包括一套全面的矢量对象和高级光栅图像编辑工具,可让你将单一文档中的适 ...
- 【Scratch】青少年蓝桥杯_每日一题_11.01_画笔功能
用心写好每一篇文章 效果图 一.题目背景 通过编程实现具有画笔功能的程序﹐按下鼠标画笔跟随鼠标移动﹐抬起鼠标画笔停止绘制. 二.编程实现 1)运行程序,清空屏幕﹐画笔角色隐藏; 2)在舞台区域按下鼠标 ...
- matplotlib 常用图形绘制与官方文档
matplotlib 常用图形绘制与官方文档 matplotlib.org Python库matplotlib 图形绘制 官方教程目录 matplotlib.pyplot matplotlib.pyp ...
- MFC 画笔功能实现
一.4个消息处理 如果是在VS2012上,我们可以很方便的在对话框的属性栏找到消息页面添加消息 如果是以前的VC6的版本,那还是得老老实实使用Class Wizzard类向导添加消息 左键按下.抬起. ...
- 函数图像在图形计算机的应用,Win10计算器迎来重大新功能:可绘制函数图形
Windows系统的计算器是我们常用的工具,现在Win10中新的计算器应用将迎来重大功能更新!现在大家可以去应用商店里更新计算器应用!新的计算器支持绘制函数图形可帮助用户理解帮线性代数.计算器应用更新 ...
- tableau两个不同的图合并_Tableau可视化分析-业务常用图形绘制1
微信公众号链接: Tableau可视化分析-业务常用图形绘制1mp.weixin.qq.com 哑铃图VS 火柴图 哑铃图,又名DNA图,横着看是哑铃,竖着看就是DNA,它主要用来表现两个数据点之间 ...
- 主流的分布式调度框架、Elastic-job简介、功能和常用介绍
主流的分布式调度框架.Elastic-job简介.功能和常用介绍 主流的分布式调度框架 Elastic-job简介 功能 常用 主流的分布式调度框架 elastic-job:由当当网基于quartz ...
- Solidworks鼠标功能和常用快捷键
Solidworks鼠标功能和常用快捷键 文章目录 Solidworks鼠标功能和常用快捷键 鼠标 一.鼠标左键 二.中键 三.鼠标右键 Solidworks中常用快捷键 一.与文件相关 二.与编辑操 ...
- R 实战| 几种常用的绘制离散变量热图/方块图/华夫图的方法
R 实战| 几种常用的绘制离散变量热图/方块图/华夫图的方法 前言 常用方法 geom_tile ggwaffle ComplexHeatmap 总结 参考 往期 前言 多组学文章经常出现非连续变量的 ...
最新文章
- python无法使用pip_解决无法使用pip命令加载Python的扩展库问题
- 扩展系统功能——装饰模式
- 「LibreOJ NOI Round #2」不等关系 (dp+NTT分治)
- SAP License:SAP Concur是什么?
- Google 为中国开发者都带来了什么?
- [paper reading] SSD
- mysql if join_如何在MySQL中使用JOIN编写正确的If … Else语句?
- dingo php,Laravel+Dingo/Api 自定义响应的实现
- 【配送路径规划】基于matlab帝企鹅算法求解冷链配送问题【含Matlab源码 201期】
- 常用的python科学计算库有哪些_python科学计算常用的数学科学计算库有哪些?
- java xsd解析_java dom4j解析XSD文件
- python搭建一个后端平台
- 手机电源键关不了屏幕_手机关机关不了,屏幕也划不了,怎么办
- 计算机处理器i3 i5,realme Book笔记本高清渲染图曝光 配置上搭载11代酷睿i3/i5处理器...
- MT9255无法使用mm指令编译某个模块的问题
- swfobject2.2参数详解(swfobject.embedSWF)
- 好评率超高的9个公众号,值得收藏
- 利用Google Map显示指定位置地理位置
- python——常见运算符号
- word标题前面存在竖线