关于cocos2d-x 3.2 版本的绘图方法有两种

  1、使用DrawNode类绘制自定义图形。

  2、继承Layer类重写draw()方法。

  以上两种方法都可以绘制自定义图形,根据自己的需要选择合适的方法。

一、使用DrawNode类绘制自定义图形

  使用DrawNode 类绘制图形是最简单的方法,create一个DrawNode类,然后添加进场景。然后就可以愉快的绘图了。

  

     auto s = Director::getInstance()->getWinSize();
   //创建
auto draw = DrawNode::create();
this->addChild(draw, ); // 画圆
for( int i=; i < ; i++)
{
draw->drawDot(Vec2(s.width/, s.height/), *(-i), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), ));
} // 画多边形
Vec2 points[] = { Vec2(s.height/,), Vec2(s.width,s.height/), Vec2(s.width/*,s.height) };
draw->drawPolygon(points, sizeof(points)/sizeof(points[]), Color4F(,,,0.5), , Color4F(,,,)); // 画线
draw->drawSegment(Vec2(,s.height), Vec2(,s.height/), , Color4F(, , , )); draw->drawSegment(Vec2(,s.height/), Vec2(s.width/, s.height/), , Color4F(, , , 0.5)); // 画三角形
draw->drawTriangle(Vec2(, ), Vec2(, ), Vec2(, ), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5)); // 画贝赛尔曲线
draw->drawQuadraticBezier(Vec2(s.width - , s.height - ), Vec2(s.width - , s.height - ), Vec2(s.width - , s.height - ), , Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5)); draw->drawCubicBezier(Vec2(s.width - , ), Vec2(s.width - , ), Vec2(s.width - , ), Vec2(s.width - , s.height - ), , Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5));

  根据需要可以用这些api创造出自己需要的图像。

二、继承Layer类重写draw()方法

  这种方式可以自定义一个绘图类,用于创作自己需要的图形。

  

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
USING_NS_CC; class HelloWorld : public cocos2d::Layer
{
public:
virtual void draw(Renderer *renderer, const Mat4 &transform, bool transformUpdated) override;
protected:
void onDraw(const kmMat4 &transform, bool transformUpdated);
CustomCommand _customCommand;
};
#endif
#include "HelloWorldScene.h"
#include "VisibleRect.h" void HelloWorld::draw(cocos2d::Renderer *renderer, const kmMat4 &transform, bool transformUpdated)
{
_customCommand.init();
_customCommand.func = CC_CALLBACK_0(HelloWorld::onDraw, this,transform,transformUpdated);
renderer->addCommand(&_customCommand);
} void HelloWorld::onDraw(const kmMat4 &transform, bool transformUpdated)
{
kmGLPushMatrix();
kmGLLoadMatrix(&transform); /*直线*/
CHECK_GL_ERROR_DEBUG();
DrawPrimitives::drawLine(VisibleRect::leftBottom(), VisibleRect::rightTop()); CHECK_GL_ERROR_DEBUG(); glLineWidth( 5.0f );
DrawPrimitives::setDrawColor4B(,,,);
DrawPrimitives::drawLine( Point(, ), Point(, ) ); // draw big point in the center
DrawPrimitives::setPointSize();
DrawPrimitives::setDrawColor4B(, , , );
DrawPrimitives::drawPoint(VisibleRect::center());
CHECK_GL_ERROR_DEBUG(); // draw 4 small points
Point points[] = { Point(,), Point(,), Point(,), Point(,) };
DrawPrimitives::setPointSize();
DrawPrimitives::setDrawColor4B(,,,);
DrawPrimitives::drawPoints( points, ); CHECK_GL_ERROR_DEBUG(); // draw a green circle with 10 segments
glLineWidth();
DrawPrimitives::setDrawColor4B(, , , );
DrawPrimitives::drawCircle( VisibleRect::center(), , , , false); CHECK_GL_ERROR_DEBUG(); // draw a green circle with 50 segments with line to center
glLineWidth();
DrawPrimitives::setDrawColor4B(, , , );
DrawPrimitives::drawCircle( VisibleRect::center(), , CC_DEGREES_TO_RADIANS(), , false); CHECK_GL_ERROR_DEBUG(); // draw a pink solid circle with 50 segments
glLineWidth();
DrawPrimitives::setDrawColor4B(, , , );
DrawPrimitives::drawSolidCircle( VisibleRect::center() + Point(,), , CC_DEGREES_TO_RADIANS(), , 1.0f, 1.0f); CHECK_GL_ERROR_DEBUG(); // open yellow poly
DrawPrimitives::setDrawColor4B(, , , );
glLineWidth();
Point vertices[] = { Point(,), Point(,), Point(,), Point(,), Point(,) };
DrawPrimitives::drawPoly( vertices, , false); CHECK_GL_ERROR_DEBUG(); // filled poly
glLineWidth();
Point filledVertices[] = { Point(,), Point(,), Point(,), Point(,), Point(,) };
DrawPrimitives::drawSolidPoly(filledVertices, , Color4F(0.5f, 0.5f, , ) ); // closed purble poly
DrawPrimitives::setDrawColor4B(, , , );
glLineWidth();
Point vertices2[] = { Point(,), Point(,), Point(,) };
DrawPrimitives::drawPoly( vertices2, , true); CHECK_GL_ERROR_DEBUG(); // draw quad bezier path
DrawPrimitives::drawQuadBezier(VisibleRect::leftTop(), VisibleRect::center(), VisibleRect::rightTop(), ); CHECK_GL_ERROR_DEBUG(); // draw cubic bezier path
DrawPrimitives::drawCubicBezier(VisibleRect::center(), Point(VisibleRect::center().x+,VisibleRect::center().y+), Point(VisibleRect::center().x+,VisibleRect::center().y-),Point(VisibleRect::center().x+,VisibleRect::center().y+),); CHECK_GL_ERROR_DEBUG(); //draw a solid polygon
Point vertices3[] = {Point(,), Point(,), Point(,), Point(,)};
DrawPrimitives::drawSolidPoly( vertices3, , Color4F(,,,) ); CHECK_GL_ERROR_DEBUG(); //end draw
kmGLPopMatrix();
}

  其中涉及到辅助类VisibleRect类得到获取视口。

 #ifndef __VISIBLERECT_H__
#define __VISIBLERECT_H__ #include "cocos2d.h" class VisibleRect
{
public:
static cocos2d::Rect getVisibleRect(); static cocos2d::Vec2 left();
static cocos2d::Vec2 right();
static cocos2d::Vec2 top();
static cocos2d::Vec2 bottom();
static cocos2d::Vec2 center();
static cocos2d::Vec2 leftTop();
static cocos2d::Vec2 rightTop();
static cocos2d::Vec2 leftBottom();
static cocos2d::Vec2 rightBottom();
private:
static void lazyInit();
static cocos2d::Rect s_visibleRect;
}; #endif /* __VISIBLERECT_H__ */

VisibleRect.h

 #include "VisibleRect.h"

 USING_NS_CC;

 Rect VisibleRect::s_visibleRect;

 void VisibleRect::lazyInit()
{
// no lazy init
// Useful if we change the resolution in runtime
s_visibleRect = Director::getInstance()->getOpenGLView()->getVisibleRect();
} Rect VisibleRect::getVisibleRect()
{
lazyInit();
return s_visibleRect;
} Vec2 VisibleRect::left()
{
lazyInit();
return Vec2(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height/);
} Vec2 VisibleRect::right()
{
lazyInit();
return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height/);
} Vec2 VisibleRect::top()
{
lazyInit();
return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width/, s_visibleRect.origin.y+s_visibleRect.size.height);
} Vec2 VisibleRect::bottom()
{
lazyInit();
return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width/, s_visibleRect.origin.y);
} Vec2 VisibleRect::center()
{
lazyInit();
return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width/, s_visibleRect.origin.y+s_visibleRect.size.height/);
} Vec2 VisibleRect::leftTop()
{
lazyInit();
return Vec2(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height);
} Vec2 VisibleRect::rightTop()
{
lazyInit();
return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height);
} Vec2 VisibleRect::leftBottom()
{
lazyInit();
return s_visibleRect.origin;
} Vec2 VisibleRect::rightBottom()
{
lazyInit();
return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y);
}

VisibleRect.cpp

Cocos2d-x 3.2学习笔记(三)学习绘图API的更多相关文章

  1. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  2. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  3. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  4. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  5. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  6. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  7. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. vb小菜一枚--------早期绑定和后期绑定

    早期绑定和后期绑定 Visual Studio 2005   其他版本   将对象分配给对象变量时,Visual Basic 编译器会执行一个名为 binding 的进程.如果将对象分配给声明为特定对 ...

  2. 嵌入式linux开发环境构建

    2.1硬件环境构建 2.1.1主机与目标板结合的交叉开发模式 在主机上编辑.编译软件,然后再目标办上运行.验证程序. 对于S3C2440.S3C2410开发板,进行嵌入式Linux开发时一般可以分为以 ...

  3. phpcms V9二次开发之联动菜单筛选 包括box字段的多选 单选 筛选教程

    {php $theurl = "index.php?m=content&c=index&a=lists&catid=$catid";} {php $bran ...

  4. 链接报error LNK2019: unresolved external symbol错误,解决

    http://blog.163.com/aiding_001/blog/static/22908192011102224344450/ 某次编写一个COM组件,接口定义好之后,增加了ZRX代码后编译链 ...

  5. 关于css3媒体查询和响应式布局

    响应式设计 响应式设计可根据所显示的屏幕大小而改变, 它呈现的每个屏幕看起来并不相同.按照可用的屏幕属性,响应式设计提供了 UI 的最佳效果. 例如,如果网站布局上有一个占据 25% 的屏幕宽度的侧边 ...

  6. Android Meun 用法

    Android Meun 用法 点击菜单实体键弹出菜单:如下图 main_activity.xml <?xml version="1.0" encoding="ut ...

  7. ZabbixCPU温度监视-Centos

    ZabbixCPU温度监视 1, lm_sensors安装 #yum install lm_sensors … #sensors-detect 出来的选项全部选yes 重启服务器 2, lm_sens ...

  8. \(\S1\) 描述性统计

    在认识客观世界的过程中,统计学的思想和方法经常起着不可替代的作用.在许多工程及自然科学的专业领域中,包括可靠性分析.质量控制.生物信息.脑科学.心理分析.经济分析.金融风险管理.社会科学推断.行为科学 ...

  9. Java提高篇(三五)-----Java集合细节(一):请为集合指定初始容量

    集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许).当这个海.容器的量变得非常大的时候,它的初始容量就会显得很重 ...

  10. Unity3D使用经验总结 缺点篇

    不论是从官方手册,还是各种第三方教程,几乎涉及到的,都是讲如何使用U3D,以及U3D的优点. 虽然我是用的一个让步语气,但请不要否认U3D的这些优点,它们的确存在. 但对于一个引擎的特性来说,优点与缺 ...