【3.x】

(1)去掉前缀 "cc"

(2)将 ccDraw***() 封装到了 DrawPrimitives 命名空间中。

(3)重写绘图函数:

        draw(Renderer *renderer, const Mat4& transform, uint32_t flags);

        使用变化举例ccDrawPoint() ==> DrawPrimitives::drawPoint()

(4)去掉宏定义 ccc3ccc4ccc4f ,分别改为:Color3BColor4BColor4F

(5)线条宽度 的设置,依然为 glLineWidth()

【v3.3】

DrawNode :添加了和 DrawPrimitives 一样的功能,同时 DrawPrimitives 标识为弃用。


【绘图draw】

cocos2dx引擎提供了大量OpenGL的函数,你可以打开glew.h就知道有多可怕了。当然在这里我只讲讲基本简单图形的绘制。

OpenGL的原语相关的绘图函数在CCDrawingPrimitives.h中定义了。主要分为六大类:点、直线、矩形、多边形、圆形、贝塞尔曲线。

接下来就给大家讲讲类中图形的绘制方法。

1、设置颜色、点大小、线条宽度

玩过画图工具的同学应该都知道,要画一个图形的时候,首先就要定义图形绘制的颜色、点的大小、线条的粗细。

//
/**
* 设置颜色、大小、宽度:
* 点大小 - ccPointSize()
* 线条粗细 - glLineWidth()
* 颜色透明度 - ccDrawColor4B(), ccDrawColor4F()
*/
//画一个点的大小,默认为1
//实际上画出来的是一个实心正方形
ccPointSize(float size); //线条宽度,默认为1
glLineWidth(float width); //红r、绿g、蓝b、透明度a,取值范围0~255
ccDrawColor4B(unsigned char r, unsigned char g, unsigned char b, unsigned char a); //红r、绿g、蓝b、透明度a,取值范围0~1
ccDrawColor4F(float r,float g, float b,float a );
//

2、点

可以绘制一个点,也可以同时绘制多个点。实际上画出来的是一个实心正方形

使用方法:

(1)设置点的大小:   ccPointSize

(2)设置颜色透明度: ccDrawColor4B 或 ccDrawColor4F

(3)画点:           ccDrawPoint

//
ccDrawPoint('点坐标CCPoint'); //绘制一个点
ccDrawPoints('点集合CCPoint','点总个数int'); //绘制多个点
//

3、直线

可以绘制一条直线。

使用方法:

(1)设置线条宽度:   glLineWidth

(2)设置颜色透明度: ccDrawColor4B 或 ccDrawColor4F

(3)画直线:         ccDrawLine

//
ccDrawLine('起点坐标CCPoint','终点坐标CCPoint');
//

4、矩形

可以绘制一个矩形,矩形可以是空心的,也可以是实心的

使用方法:

(1)设置线条宽度:   glLineWidth

(2)设置颜色透明度: ccDrawColor4B 或 ccDrawColor4F

(3)画矩形:         ccDrawRect 或 ccDrawSolidRect

//
ccDrawRect('对角顶点1CCPoint','对角顶点2CCPoint');
ccDrawSolidRect('对角顶点1CCPoint','对角顶点2CCPoint','颜色透明度ccColor4F');
//

5、多边形

可以绘制一个多边形,多边形可以使空心的,也可以是实心的

使用方法:

(1)设置线条宽度:   glLineWidth

(2)设置颜色透明度: ccDrawColor4B 或 ccDrawColor4F

(3)画多边形:       ccDrawPoly 或 ccDrawSolidPoly

//
ccDrawPoly('顶点数组CCPoint*','顶点个数int','是否自动封闭');
ccDrawSolidPoly('顶点数组CCPoint*','顶点个数int','是否自动封闭','颜色透明度ccColor4F');
//

6、椭圆

可以绘制圆形,也可以绘制椭圆。绘制椭圆时,需要设置X轴和Y轴的半径放缩比例。

使用方法:

(1)设置线条宽度:   glLineWidth

(2)设置颜色透明度: ccDrawColor4B 或 ccDrawColor4F

(3)画多边形:       ccDrawCircle

//
//参数说明:
//弧度: 当显示半径true时,连线的点所在弧度。即连线后与X轴的夹角。
//分段数: 即画圆时所使用的参数点数,点数越多话的圆越精确。但是参数点多了,效率就低下了。一般都设置360。
//显示半径:是否显示半径,即圆心和圆上某点连线。
ccDrawCircle('圆心坐标CCPoint','半径float','弧度float','分段数','是否显示半径bool');
ccDrawCircle('圆心坐标CCPoint','半径float','弧度float','分段数','是否显示半径bool','X轴放大倍数float','Y轴放大倍数float');
//

7、贝塞尔曲线

贝塞尔曲线这个概念我也还是第一次听到。可以绘制一个控制点的贝塞尔曲线,也可以绘制两个控制点的贝赛尔曲线。

(1)二次贝塞尔曲线:起点终点之间,利用一个控制点来控制抛物线的形状。

(2)三次贝塞尔曲线:起点终点之间,利用两个控制点来控制曲线的形状。

具体的绘制原理请参照博客:http://blog.csdn.net/conmajia/article/details/8543834

使用方法:

(1)设置线条宽度:   glLineWidth

(2)设置颜色透明度: ccDrawColor4B 或 ccDrawColor4F

(3)画多边形:       ccDrawQuadBezier 或 ccDrawCubicBezier

//
//二次贝塞尔曲线
ccDrawQuadBezier('起点CCPoint','控制点CCPoint','终点CCPoint','分段数int'); //三次贝塞尔曲线
ccDrawCubicBezier('起点CCPoint','控制点1CCPoint','控制点2CCPoint','终点CCPoint','分段数int');
//

【代码实战】

1、设置一个背景图片

作为绘图的参照物,不然凸显不出透明度。

//
CCSprite* bg = CCSprite::create("HelloWorld.png");
bg->setPosition(mysize/2);
this->addChild(bg,-1);
//

2、重写CCNode继承下来的绘图draw()函数

//
class HelloWorld : public cocos2d::CCLayer
{
public:
virtual bool init();
static cocos2d::CCScene* scene();
CREATE_FUNC(HelloWorld); //重写draw()函数
virtual void draw();
};
//

3、编写draw()代码

绘制点、直线、矩形、多边形、椭圆、贝赛尔曲线。

//
void HelloWorld::draw()
{ //屏幕尺寸大小
CCSize mysize = CCDirector::sharedDirector()->getVisibleSize(); //点
//一个点
ccPointSize(10);
ccDrawColor4B(255, 25, 200, 250);
ccDrawPoint(mysize/2); //多个点
ccPointSize(30);
ccDrawColor4B(255, 0, 0, 100);
CCPoint Pointarray[] = {ccp(200, 150), ccp(200, 200), ccp(280, 150), ccp(280, 200)};
ccDrawPoints(Pointarray, 4); //直线
glLineWidth(3);
ccDrawColor4B(255, 255, 255, 130);
ccDrawLine(ccp(10, 300), ccp(200, 300) ); //圆
glLineWidth(3);
ccDrawColor4B(255, 255, 100, 190);
ccDrawCircle(ccp(50, 250), 40, 3.14/2, 360, true, 1, 0.5); //矩形
//空心
glLineWidth(5);
ccDrawColor4B(24, 25, 200, 140);
ccDrawRect(ccp(10, 150), ccp(110, 200)); //实心
ccDrawSolidRect(ccp(10, 90), ccp(100, 140), ccc4f(255, 255, 255, 0.5f)); //多边形
//空心
glLineWidth(10);
ccDrawColor4B(240, 225, 100, 130);
CCPoint Polyarray[] = {ccp(20, 20), ccp(50, 0), ccp(250, 100), ccp(300, 100), ccp(250, 50)};
ccDrawPoly(Polyarray, 5, 1); //实心
CCPoint Polyarray2[] = {ccp(250,30), ccp(280,300), ccp(450,0), ccp(410,130), ccp(420,50)};
ccDrawSolidPoly(Polyarray2, 5, ccc4f(142, 245, 70, 0.3f)); //贝赛尔曲线
//平面
glLineWidth(5);
ccDrawColor4B(100, 100, 100, 255);
ccDrawQuadBezier(ccp(0,320), ccp(160,100), ccp(480,320), 100); //立体
glLineWidth(5);
ccDrawColor4B(200, 200, 200, 255);
ccDrawCubicBezier(ccp(0,0), ccp(160,300), ccp(320,20), ccp(480,320), 100);
}
//

4、运行结果

cocos2dx基础篇(16) 基本绘图DrawPrimitives的更多相关文章

  1. cocos2dx基础篇(3) 常用重要类

    ---------------------------------------- 入口类main.cpp 主要控制类AppDelegate.cpp -------------------------- ...

  2. 【Cocos2d入门教程二】Cocos2d-x基础篇

    上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...

  3. cocos2dx基础篇(23) 粒子系统CCParticleSystem

    [3.x]     (1)去掉"CC"     (2)粒子位置模式 tPositionType 改为强枚举类型 ParticleSystem::PositionType:: // ...

  4. cocos2dx基础篇(22) 基本动画CCAnimation/CCAnimate

    [小知识] CCSpriteFrame     :精灵帧.    它是相对动画而产生的,其实就是一张纹理图片. CCAnimationFrame  :动画帧.    由精灵帧与间隔帧数组成,是动画CC ...

  5. cocos2dx基础篇(1) Cocos2D-X项目创建

    已经入行工作半年多时间了,以前都是把这些东西记录在有道云上面的,现在抽出些时间把以前的笔记腾过来. 具体的环境配置就不用说了,因为现在已经是2018年,只需要下载对应版本解压后就能使用,不用再像多年前 ...

  6. cocos2dx基础篇(18) 数据存储CCUserDefault

    在cocos2dx中提供了一个数据存储类CCUserDefault,可以作为一个轻量级的数据库来使用.它支持五种数据bool.int.float.double.string的存储. [3.x]     ...

  7. cocos2dx基础篇(17) 音乐音效SimpleAudioEngine

    [3.x]     (1)获取单例:sharedEngine() 改为 getInstance()     (2)实现了:音量的调节.     (3)修改了播放音效 playEffect() 的参数: ...

  8. cocos2dx基础篇(15) 列表视图CCTableView

    [3.x] (1)去掉 "CC" (2)TableViewCell 中: > unsigned int getIdx() 返回类型改为 ssize_t(类型为 long) ( ...

  9. python 基础篇 16 递归和二分数查找与编码补充回顾

    编码回顾补充: 回顾编码问题:        编码相当于密码本,关系到二进制与看懂的文字的的对应关系.    最早期的密码本:        ascii码:只包含英文字母,数字,特殊字符.       ...

随机推荐

  1. fastjson的方法应用与java JSONObject

    Fastjson是一个Java语言编写的高性能功能完善的JSON库.fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson.并且还超越了go ...

  2. java高并发核心要点|系列文章

    java高并发核心要点|系列1|开篇 java高并发核心要点|系列2|锁的底层实现原理 java高并发核心要点|系列3|锁的底层实现原理|ABA问题 java高并发核心要点|系列4|CPU内存指令重排 ...

  3. oracle sql 高级编程 历史笔记整理

    20130909 周一 oracle sql 开发指南 第7章 高级查询 1.层次化查询select level,ttt.*,sys_connect_by_path(ttt.col1,',') fro ...

  4. squid之------基础知识

    squid是什么? 缓存服务器,即用来存储(内存及硬盘)用户访问的网页.图片.文件等等信息的专用服务器,这种服务器不仅可以使用户最快的得到他们想要的信息,而且大大减少了网络传输的数据量,缓存服务器经常 ...

  5. web性能优化--减少DOM操作(三)

    减少DOM数量 减少DOM操作 批量处理DOM操作 批量处理样式修改 尽量不要使用tabel布局 尽量不要使用css表达式 string用数组join css选择符优化 1.减少DOM数量 在HTML ...

  6. Oracal数据库安装配置教程

    官网注册账号登录 https://www.oracle.com/technetwork/database/enterprise-edition/downloads/oracle12c-windows- ...

  7. 从mysql8.0.15升级到8.0.16

    从mysql8.0.15升级到8.0.16 环境简介 操作系统:Centos 6.10 64位 目前版本:8.0.15 MySQL Community Server 二进制 目的:升级为8.0.16 ...

  8. jmeter测试文件上传功能

    最近为了完成自动化KPI开始慢慢接触jmeter,其中遇到了不少问题,今天就遇到了文件上传的问题,在这里记录下加深记忆,也可供jmeter初级使用者作为一个参考.另外论坛上已有同事发过关于jmeter ...

  9. mysql存储ip数值

    字段使用 int unsigned 类型就可以满足存贮ip2long(ip)的数值 插入时,可以使用inet_aton('100.200.30.22') 将ip地址转换为数值 查询时,使用inet_n ...

  10. OI多项式 简单学习笔记

    咕咕咕 先开个坑(其实是存模板来了) 一些特别简单的前置东西qwq 复数的计算 复数相加:向量相加,复数相乘.复数相乘:模长相乘,旋转量相加(就是复平面坐标轴逆时针旋转的角度) (当然也可以直接使用c ...