原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/18978237

最近忙出翔了,这年过的也揪心。好久没来更新博客了,今天就来写一写cocos2d-x中图形的绘制。

1.概述

其实cocos2d-x封装了大量的opengl的绘图函数,我们可以很轻松的在游戏中调用。但是实际上我们很少会这么做,因为编码绘图的方式效率实在太低了,尤其是诸如一些高阶贝塞尔曲线之类的,官方也不建议这么做,使用图像能更有效的提高绘图效率,同时也会更为的美观,也减少了一些精灵遮挡问题和边缘锯齿问题。cocos2d-x中绘图主要有两种方式:CCDrawingPrimitives和CCDrawNode。它们都在cocos2dx\draw_nodes目录下。

2.CCDrawingPrimitives(原生绘图)

2.1.特点

CCDrawingPrimitives必须在节点的draw函数中调用,draw函数每帧被调用一次,主要做一些绘制的工作。但这并不意味着它就是静态不可改变的,我们完全可以通过修改描绘内容的方式来动态绘图。比如可以直接在用触摸的方式在屏幕上绘图。

另外,使用CCDrawingPrimitives绘图默认的Z-Order是0,所以可能会被其他节点覆盖,因为它无法设置Z-Order,所以只能通过设置其他节点的Z-Order为负值使得绘图在最前端得以看见。

2.2.API

[cpp] view plaincopy
  1. //绘制一个给定x,y值的点
  2. void CC_DLL ccDrawPoint( const CCPoint& point );
  3. //绘制一组点
  4. void CC_DLL ccDrawPoints( const CCPoint *points, unsigned int numberOfPoints );
  5. //绘制一条给定起始点和目标点的直线
  6. void CC_DLL ccDrawLine( const CCPoint& origin, const CCPoint& destination );
  7. //绘制一个给定起始点和目标点的矩形
  8. void CC_DLL ccDrawRect( CCPoint origin, CCPoint destination );
  9. //绘制一个给定起始点和目标点和颜色的矩形
  10. void CC_DLL ccDrawSolidRect( CCPoint origin, CCPoint destination, ccColor4F color );
  11. //绘制一个给定一组点的多边形,可以是闭合或开放
  12. void CC_DLL ccDrawPoly( const CCPoint *vertices, unsigned int numOfVertices, bool closePolygon );
  13. //绘制一个给定一组点和颜色的多边形
  14. void CC_DLL ccDrawSolidPoly( const CCPoint *poli, unsigned int numberOfPoints, ccColor4F color );
  15. //绘制一个给定中心,半径,分段数的圆
  16. void CC_DLL ccDrawCircle( const CCPoint& center, float radius, float angle, unsigned int segments, bool drawLineToCenter, float scaleX, float scaleY);
  17. void CC_DLL ccDrawCircle( const CCPoint& center, float radius, float angle, unsigned int segments, bool drawLineToCenter);
  18. //绘制一个带一个控制点的贝塞尔曲线(二次)
  19. void CC_DLL ccDrawQuadBezier(const CCPoint& origin, const CCPoint& control, const CCPoint& destination, unsigned int segments);
  20. //绘制一个带两个控制点的贝塞尔曲线(高阶)
  21. void CC_DLL ccDrawCubicBezier(const CCPoint& origin, const CCPoint& control1, const CCPoint& control2, const CCPoint& destination, unsigned int segments);
  22. //绘制默认曲率的基数样条
  23. void CC_DLL ccDrawCatmullRom( CCPointArray *arrayOfControlPoints, unsigned int segments );
  24. //绘制指定曲率的基数样条
  25. void CC_DLL ccDrawCardinalSpline( CCPointArray *config, float tension,  unsigned int segments );
  26. //设置绘制颜色,4个byte型
  27. void CC_DLL ccDrawColor4B( GLubyte r, GLubyte g, GLubyte b, GLubyte a );
  28. //设置绘制颜色,4个float型
  29. void CC_DLL ccDrawColor4F( GLfloat r, GLfloat g, GLfloat b, GLfloat a );
  30. //设置点大小,默认为1
  31. void CC_DLL ccPointSize( GLfloat pointSize );

2.3.示例

代码使用的是TestCpp中代码。

3.CCDrawNode(绘图节点)

3.1.特点

CCDrawNode从CCNode继承而来,是一个图形绘制的节点类,它提供了几个常用的点线面函数方便绘图,其实在之前的游戏遮罩一文中就有写过。相较于CCDrawingPrimitives,这里更推荐使用CCDrawNode,

(1)它将绘图封装为普通节点的方式进行处理,符合cocos2d-x树状编程的思想,同时也避免了一些遮盖的问题。

(2)不需要在draw函数中调用。

(3)使用批处理绘图,提高了绘图效率。

3.2.API

[cpp] view plaincopy
  1. //绘制一个指定位置,大小,颜色的点
  2. void drawDot(const CCPoint &pos, float radius, const ccColor4F &color);
  3. //绘制一个指定起点终点,大小,颜色的点
  4. void drawSegment(const CCPoint &from, const CCPoint &to, float radius, const ccColor4F &color);
  5. //绘制一个指定点,填充颜色,边框颜色的,边框宽度的多边形
  6. void drawPolygon(CCPoint *verts, unsigned int count, const ccColor4F &fillColor, float borderWidth, const ccColor4F &borderColor);

3.3.示例

代码也是TestCpp中的代码。

4.源码下载

可以自己看TestCpp示例,也可以从这里下载:http://download.csdn.net/detail/jackyvincefu/6903357

【玩转cocos2d-x之三十四】绘图:CCDrawingPrimitives和CCDrawNode相关推荐

  1. SAP UI5 应用开发教程之三十四 - SAP UI5 应用基于设备类型的页面适配功能(Device Adaptation)试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  2. BetaFlight模块设计之三十四:OSD模块分析

    BetaFlight模块设计之三十四:OSD模块分析 1. OSD模块 1.1 osd状态机子模块 1.2 osd_warnings检查子模块 1.3 osd_elements子模块 2. OSD设备 ...

  3. PX4模块设计之三十四:ControlAllocator模块

    PX4模块设计之三十四:ControlAllocator模块 1. ControlAllocator模块简介 2. 模块入口函数 2.1 主入口control_allocator_main 2.2 自 ...

  4. 【codecombat】 试玩全攻略 第十四关 已知敌人

    第十四关 已知敌人 在这一关里,我们的英雄获得了一副可以看见敌人的眼镜,所以他很强势的学会了"发现敌人"的技能. hero.findNearestEnemy()命令,单词多了,首字 ...

  5. VS2013/MFC编程入门之三十四(工具栏:工具栏资源及CToolBar类)

    上一节中讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程序会执 ...

  6. 全民一起玩Python提高篇第十四课:函数式编程初步(上)

    函数与数字.字符串.列表等一样,本质上都是某种存放在内存中的数据类型,都可以用一个名字(变量名.函数名 -- )指向它 一个函数与一个数字.字符串等一样,都可以赋值给一个变量.比如,如果 f 是一个函 ...

  7. 应用安全系列之三十四:数值溢出

    应用程序中难免会遇到数字的处理,针对数字的处理如果不当也会造成严重的问题,著名的Heartbleed漏洞也是没有验证数字的有效性导致的. 数值处理不好的,轻则产生异常,重则影响整个程序的正常运行,因此 ...

  8. Java经典编程题50道之三十四

    输入3个数a,b,c,按大小顺序输出. public class Example34 {     public static void main(String[] args) {         so ...

  9. 嵌入式Linux系统编程学习之三十四 Socket 编程

    文章目录 一.使用 TCP 的流程图 1.1 头文件包含 1.2 socket 函数 1.3 bind 函数 1.4 listen 函数 1.5 accept 函数 1.6 recv 函数 1.7 s ...

最新文章

  1. 6. matlab中case语句的使用
  2. 甲骨文们是怎么被干掉的
  3. 大学生英语fif测试系统_英语听力解题技巧
  4. C++11使用互斥量保护共享数据
  5. 【GOF23设计模式】迭代器模式
  6. 使用 jQuery Mobile 与 HTML5 开发 Web App (六) —— jQuery Mobile 内容格式
  7. 静态变量(static)
  8. 解决django前端使用iframe标签报错127.0.0.1 refused to connect.
  9. [Erlang07] Erlang 做图形化编程的尝试:纯Erlang做2048游戏
  10. 如何在 Exchange Server 2010 SP1 下将用户邮箱导出到PST中
  11. yum提示Another app is currently holding the yum lock; waiting for it to exit...处理办法
  12. 爬虫学习——大碗宽面b站和网易云可视化分析代码
  13. 重回第一!没想到300w了...
  14. w10系统的服务器属性在哪,DNS设置在哪里、设置什么好?Win10电脑DNS设置指南
  15. 寒假第一周 总结与反思
  16. 大数据实战第十二课之-Scala知识05
  17. android adb连接多个夜神模拟器,夜神安卓模拟器连接adb的具体操作流程
  18. 对HANA的认识与相关测试案例
  19. HR不得不知的Excel技能——模板篇
  20. 怎么远程控制他人电脑

热门文章

  1. springSecurity源码分析-springSecurityFilterChain
  2. ThreadLocal - Java多线程编程
  3. ad09只在一定范围内查找相似对象_kafka日志段中的二分查找
  4. linux电视改安卓,mstar安卓智能电视方案源代码常用修改
  5. verilog设计简易正弦波信号发生器_电子设计竞赛教程-信号源类
  6. 【报错笔记】eclipse启动出现错误
  7. 【F3简介】一张图看懂FPGA-F3实例
  8. golang ffmpeg 做网络直播
  9. Java多线程同步代码块
  10. SQL Server 审核(Audit)-- 创建数据库级别的审核