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

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

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

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

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

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

  

  1. auto s = Director::getInstance()->getWinSize();
  2.    //创建
  3. auto draw = DrawNode::create();
  4. this->addChild(draw, );
  5.  
  6. // 画圆
  7. for( int i=; i < ; i++)
  8. {
  9. draw->drawDot(Vec2(s.width/, s.height/), *(-i), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), ));
  10. }
  11.  
  12. // 画多边形
  13. Vec2 points[] = { Vec2(s.height/,), Vec2(s.width,s.height/), Vec2(s.width/*,s.height) };
  14. draw->drawPolygon(points, sizeof(points)/sizeof(points[]), Color4F(,,,0.5), , Color4F(,,,));
  15.  
  16. // 画线
  17. draw->drawSegment(Vec2(,s.height), Vec2(,s.height/), , Color4F(, , , ));
  18.  
  19. draw->drawSegment(Vec2(,s.height/), Vec2(s.width/, s.height/), , Color4F(, , , 0.5));
  20.  
  21. // 画三角形
  22. draw->drawTriangle(Vec2(, ), Vec2(, ), Vec2(, ), Color4F(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 0.5));
  23.  
  24. // 画贝赛尔曲线
  25. 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));
  26.  
  27. 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()方法

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

  

  1. #ifndef __HELLOWORLD_SCENE_H__
  2. #define __HELLOWORLD_SCENE_H__
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5.  
  6. class HelloWorld : public cocos2d::Layer
  7. {
  8. public:
  9. virtual void draw(Renderer *renderer, const Mat4 &transform, bool transformUpdated) override;
  10. protected:
  11. void onDraw(const kmMat4 &transform, bool transformUpdated);
  12. CustomCommand _customCommand;
  13. };
  14. #endif
  1. #include "HelloWorldScene.h"
  2. #include "VisibleRect.h"
  3.  
  4. void HelloWorld::draw(cocos2d::Renderer *renderer, const kmMat4 &transform, bool transformUpdated)
  5. {
  6. _customCommand.init();
  7. _customCommand.func = CC_CALLBACK_0(HelloWorld::onDraw, this,transform,transformUpdated);
  8. renderer->addCommand(&_customCommand);
  9. }
  10.  
  11. void HelloWorld::onDraw(const kmMat4 &transform, bool transformUpdated)
  12. {
  13. kmGLPushMatrix();
  14. kmGLLoadMatrix(&transform);
  15.  
  16. /*直线*/
  17. CHECK_GL_ERROR_DEBUG();
  18. DrawPrimitives::drawLine(VisibleRect::leftBottom(), VisibleRect::rightTop());
  19.  
  20. CHECK_GL_ERROR_DEBUG();
  21.  
  22. glLineWidth( 5.0f );
  23. DrawPrimitives::setDrawColor4B(,,,);
  24. DrawPrimitives::drawLine( Point(, ), Point(, ) );
  25.  
  26. // draw big point in the center
  27. DrawPrimitives::setPointSize();
  28. DrawPrimitives::setDrawColor4B(, , , );
  29. DrawPrimitives::drawPoint(VisibleRect::center());
  30. CHECK_GL_ERROR_DEBUG();
  31.  
  32. // draw 4 small points
  33. Point points[] = { Point(,), Point(,), Point(,), Point(,) };
  34. DrawPrimitives::setPointSize();
  35. DrawPrimitives::setDrawColor4B(,,,);
  36. DrawPrimitives::drawPoints( points, );
  37.  
  38. CHECK_GL_ERROR_DEBUG();
  39.  
  40. // draw a green circle with 10 segments
  41. glLineWidth();
  42. DrawPrimitives::setDrawColor4B(, , , );
  43. DrawPrimitives::drawCircle( VisibleRect::center(), , , , false);
  44.  
  45. CHECK_GL_ERROR_DEBUG();
  46.  
  47. // draw a green circle with 50 segments with line to center
  48. glLineWidth();
  49. DrawPrimitives::setDrawColor4B(, , , );
  50. DrawPrimitives::drawCircle( VisibleRect::center(), , CC_DEGREES_TO_RADIANS(), , false);
  51.  
  52. CHECK_GL_ERROR_DEBUG();
  53.  
  54. // draw a pink solid circle with 50 segments
  55. glLineWidth();
  56. DrawPrimitives::setDrawColor4B(, , , );
  57. DrawPrimitives::drawSolidCircle( VisibleRect::center() + Point(,), , CC_DEGREES_TO_RADIANS(), , 1.0f, 1.0f);
  58.  
  59. CHECK_GL_ERROR_DEBUG();
  60.  
  61. // open yellow poly
  62. DrawPrimitives::setDrawColor4B(, , , );
  63. glLineWidth();
  64. Point vertices[] = { Point(,), Point(,), Point(,), Point(,), Point(,) };
  65. DrawPrimitives::drawPoly( vertices, , false);
  66.  
  67. CHECK_GL_ERROR_DEBUG();
  68.  
  69. // filled poly
  70. glLineWidth();
  71. Point filledVertices[] = { Point(,), Point(,), Point(,), Point(,), Point(,) };
  72. DrawPrimitives::drawSolidPoly(filledVertices, , Color4F(0.5f, 0.5f, , ) );
  73.  
  74. // closed purble poly
  75. DrawPrimitives::setDrawColor4B(, , , );
  76. glLineWidth();
  77. Point vertices2[] = { Point(,), Point(,), Point(,) };
  78. DrawPrimitives::drawPoly( vertices2, , true);
  79.  
  80. CHECK_GL_ERROR_DEBUG();
  81.  
  82. // draw quad bezier path
  83. DrawPrimitives::drawQuadBezier(VisibleRect::leftTop(), VisibleRect::center(), VisibleRect::rightTop(), );
  84.  
  85. CHECK_GL_ERROR_DEBUG();
  86.  
  87. // draw cubic bezier path
  88. 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+),);
  89.  
  90. CHECK_GL_ERROR_DEBUG();
  91.  
  92. //draw a solid polygon
  93. Point vertices3[] = {Point(,), Point(,), Point(,), Point(,)};
  94. DrawPrimitives::drawSolidPoly( vertices3, , Color4F(,,,) );
  95.  
  96. CHECK_GL_ERROR_DEBUG();
  97.  
  98. //end draw
  99. kmGLPopMatrix();
  100. }

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

  1. #ifndef __VISIBLERECT_H__
  2. #define __VISIBLERECT_H__
  3.  
  4. #include "cocos2d.h"
  5.  
  6. class VisibleRect
  7. {
  8. public:
  9. static cocos2d::Rect getVisibleRect();
  10.  
  11. static cocos2d::Vec2 left();
  12. static cocos2d::Vec2 right();
  13. static cocos2d::Vec2 top();
  14. static cocos2d::Vec2 bottom();
  15. static cocos2d::Vec2 center();
  16. static cocos2d::Vec2 leftTop();
  17. static cocos2d::Vec2 rightTop();
  18. static cocos2d::Vec2 leftBottom();
  19. static cocos2d::Vec2 rightBottom();
  20. private:
  21. static void lazyInit();
  22. static cocos2d::Rect s_visibleRect;
  23. };
  24.  
  25. #endif /* __VISIBLERECT_H__ */

VisibleRect.h

  1. #include "VisibleRect.h"
  2.  
  3. USING_NS_CC;
  4.  
  5. Rect VisibleRect::s_visibleRect;
  6.  
  7. void VisibleRect::lazyInit()
  8. {
  9. // no lazy init
  10. // Useful if we change the resolution in runtime
  11. s_visibleRect = Director::getInstance()->getOpenGLView()->getVisibleRect();
  12. }
  13.  
  14. Rect VisibleRect::getVisibleRect()
  15. {
  16. lazyInit();
  17. return s_visibleRect;
  18. }
  19.  
  20. Vec2 VisibleRect::left()
  21. {
  22. lazyInit();
  23. return Vec2(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height/);
  24. }
  25.  
  26. Vec2 VisibleRect::right()
  27. {
  28. lazyInit();
  29. return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height/);
  30. }
  31.  
  32. Vec2 VisibleRect::top()
  33. {
  34. lazyInit();
  35. return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width/, s_visibleRect.origin.y+s_visibleRect.size.height);
  36. }
  37.  
  38. Vec2 VisibleRect::bottom()
  39. {
  40. lazyInit();
  41. return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width/, s_visibleRect.origin.y);
  42. }
  43.  
  44. Vec2 VisibleRect::center()
  45. {
  46. lazyInit();
  47. return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width/, s_visibleRect.origin.y+s_visibleRect.size.height/);
  48. }
  49.  
  50. Vec2 VisibleRect::leftTop()
  51. {
  52. lazyInit();
  53. return Vec2(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height);
  54. }
  55.  
  56. Vec2 VisibleRect::rightTop()
  57. {
  58. lazyInit();
  59. return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height);
  60. }
  61.  
  62. Vec2 VisibleRect::leftBottom()
  63. {
  64. lazyInit();
  65. return s_visibleRect.origin;
  66. }
  67.  
  68. Vec2 VisibleRect::rightBottom()
  69. {
  70. lazyInit();
  71. return Vec2(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y);
  72. }

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. 【C++】自绘控件基础

    由于我们对控件的功能.外观的需求,公共控件并不能很好地满足这一点,所以我们就得自绘控件. 自绘控件有许多方法,比如:处理WM_PAINT消息,设置ownDraw风格,处理WM_CTLCOLOR消息,等 ...

  2. Runtime消息传送

    person.h #import<Foundation/Foundation.h> @interfacePerson :NSObject + (void)eat; - (void)run: ...

  3. linux-9基本命令之-wget

    1.wget 命令用于下载网络文件,格式:"wget[参数] 下载地址" wget 参数 -b 后台下载模式 -O 下载到指定的目录 -t 最大尝试次数 -p 下载页面内所有的资源 ...

  4. C++混合编程之idlcpp教程Python篇(7)

    上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同 ...

  5. CentOs笔记

    系统 CentOs7,最小安装,使用 Ext4,/ ,/boot,/swap 使用标准分区,另一个分区做为数据分区,使用 LVM. 更新: http://mirrors.163.com/.help/c ...

  6. Unity多单位战斗寻路问题的一种解决办法

    Unity多单位战斗寻路问题的一种解决办法 Unity提供了NavMesh 导航组件   NavMesh是在实践中通用性最好的一种导航方式,但是Unity的实现并没有完全提供一个开放自由的API. 主 ...

  7. SQL Server 性能优化之——T-SQL 临时表、表变量、UNION

    这次看一下临时表,表变量和Union命令方面是否可以被优化呢? 阅读导航 一.临时表和表变量 二.本次的另一个重头戏UNION 命令 一.临时表和表变量 很多数据库开发者使用临时表和表变量将代码分解成 ...

  8. 如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢?

    一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计硬件积木的! ...

  9. Canny算子边缘检测(cvCanny)

    Canny是常用的边缘检测方法,其特点是试图将独立边的候选像素拼装成轮廓. John Canny于1986年提出Canny算子,它与Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法. ...

  10. 基础才是重中之重~C#中标准的IDispose模式

    回到目录 IDispose模式在C++中用的很多,用来清理资源,而在C#里,资源分为托管和非托管两种,托管资源是由C#的CLR帮助我们清理的,它是通过调用对象的析构函数完成的对象释放工作,而对于非托管 ...