学习简单绘图DrawNode

学习简单绘图DrawNode

尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=1738

绘图的方式有两种:

  • 使用OpenGL的绘图原语DrawPrimitives。
  • 使用DrawNode。

本节中主要学习使用DrawNode来进行图形的绘制。

【小知识】

分段数:即绘制曲线一般都是通过绘制“样条曲线”来实现,而分段数即样条段数。

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

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

【DrawNode】

DrawNode由于在一个单独的批处理中绘制了所有元素,因此它绘制点、线段、多边形都要比“drawing primitives”快。

  • 使用DrawPrimitives绘图原语绘制的图形,可以是实心的,也可以是空心的。
  • 使用DrawNode绘制的图形都是实心的。

1、使用方法

创建一个DrawNode,然后加入到Layer布景层中,即可绘制各种形状的图形。

使用方法如下:

//创建DrawNode,然后后加入到Layer层中
DrawNode* drawNode = DrawNode::create();
this->addChild(drawNode);
//...基本图形绘制... 

2、基本图形绘制

使用DrawNode来绘制图形,可以绘制如下几个图形。

  • 圆点:drawDot
  • 线段:drawSegment
  • 三角形:drawTriangle
  • 多边形:drawPolygon
  • 二次贝塞尔图形:drawQuadraticBezier
  • 三次内塞尔图形:drawCubicBezier

注:绘制的图形都是实心的。

使用方法如下:

//圆点      (‘位置‘ , ‘圆点半径‘ , ‘填充颜色‘)
void drawDot(const Vec2 &pos, float radius, const Color4F &color); 

//线段          (‘起点‘ , ‘终点‘ , ‘半线宽‘ , ‘填充颜色‘)
void drawSegment(const Vec2 &from, const Vec2 &to, float radius, const Color4F &color); 

//三角形         (‘顶点1‘ , ‘顶点2‘ , ‘顶点3‘ , ‘填充颜色‘)
void drawTriangle(const Vec2 &p1, const Vec2 &p2, const Vec2 &p3, const Color4F &color); 

//多边形        (‘顶点数组‘ , ‘顶点个数‘ , ‘填充颜色‘ , ‘轮廓粗细‘ , ‘轮廓颜色‘)
void drawPolygon(Vec2 *verts, int count, const Color4F &fillColor, float borderWidth, const Color4F &borderColor); 

//二次贝塞尔图形        (‘起点‘ , ‘控制点‘ , ‘终点‘ , ‘分段数‘ , ‘填充颜色‘)
void drawQuadraticBezier(const Vec2& from, const Vec2& control, const Vec2& to, unsigned int segments, const Color4F &color); 

//三次贝塞尔图形    (‘起点‘ , ‘控制点1‘ , ‘控制点2‘ , ‘终点‘ , ‘分段数‘ , ‘填充颜色‘)
void drawCubicBezier(const Vec2& from, const Vec2& control1, const Vec2& control2, const Vec2& to, unsigned int segments, const Color4F &color);

3、清除绘图缓存

使用clear(),来清除之前使用drawNode画的所有图形。

drawNode->clear();

4、颜色混合方式

使用setBlendFunc(const BlendFunc &blendFunc),设置颜色混合的方式。详见:《颜色混合BlendFunc用法实例总结

BlendFunc bl = { GL_ONE, GL_ONE };
drawNode->setBlendFunc(bl); 

5、空心多边形绘制

使用DrawNode绘制的图形都是实心的,那么空心的怎么绘制呢?

从绘制图形的函数可以看出:图形绘制的同时,需要设置图形的颜色Color4F,其中也包含了透明度的设置。所以只要控制图形内部的填充颜色Color4F的透明度为透明(值为0),即可绘制出一个空心的图形来。

而能达到这种效果的,就只有多边形的绘制:drawPolygon 。

使用举例:

Color4F(1, 0, 0, 0) :红色透明
Color4F(1, 0, 0, 1) :红色不透明 

Vec2 point[4];
point[0] = Vec2(100, 100);
point[1] = Vec2(100, 200);
point[2] = Vec2(200, 200);
point[3] = Vec2(200, 100); 

//绘制空心多边形
//填充颜色:Color4F(1, 0, 0, 0), 透明
//轮廓颜色:Color4F(0, 1, 0, 1), 绿色
drawNode->drawPolygon(point, 4, Color4F(1, 0, 0, 0), 1, Color4F(0, 1, 0, 1)); 

【代码实战】

  • 圆点
  • 线段
  • 三角形
  • 实心多边形
  • 空心多边形
  • 二次贝塞尔图形
  • 三次贝塞尔图形
  • 颜色混合测试 { GL_ONE , GL_ONE}
//创建DrawNode
    DrawNode* drawNode = DrawNode::create();
    this->addChild(drawNode); 

    //圆点
    drawNode->drawDot(Vec2(50, 50), 10, Color4F::RED); 

    //线段
    drawNode->drawSegment(Vec2(20, 100), Vec2(100, 100), 5, Color4F(0, 1, 0, 1));
    drawNode->drawSegment(Vec2(20, 150), Vec2(100, 150), 10, Color4F(0, 0, 1, 1)); 

    //三角形
    drawNode->drawTriangle(Vec2(20, 250), Vec2(100, 300), Vec2(50, 200), Color4F(1, 1, 0, 1)); 

    //实心多边形
    Vec2 point1[4];
    point1[0] = Vec2(150, 50);
    point1[1] = Vec2(150, 150);
    point1[2] = Vec2(250, 150);
    point1[3] = Vec2(250, 50);
    drawNode->drawPolygon(point1, 4, Color4F(1, 0, 0, 1), 1, Color4F(0, 1, 0, 1)); 

    //空心多边形
    Vec2 point2[4];
    point2[0] = Vec2(150, 200);
    point2[1] = Vec2(150, 300);
    point2[2] = Vec2(250, 300);
    point2[3] = Vec2(250, 200);
    drawNode->drawPolygon(point2, 4, Color4F(1, 0, 0, 0), 1, Color4F(0, 1, 0, 1)); 

    //二次贝塞尔
    Vec2 from1 = Vec2(300, 20);
    Vec2 to1 = Vec2(450, 20);
    Vec2 control = Vec2(360, 100);
    drawNode->drawQuadraticBezier(from1, control, to1, 100, Color4F::ORANGE); 

    //三次贝塞尔
    Vec2 from2 = Vec2(300, 100);
    Vec2 to2 = Vec2(450, 100);
    Vec2 control1 = Vec2(350, 0);
    Vec2 control2 = Vec2(400, 200);
    drawNode->drawCubicBezier(from2, control1, control2, to2, 100, Color4F::YELLOW); 

    //颜色混合测试
    BlendFunc bl = { GL_ONE, GL_ONE };
    drawNode->setBlendFunc(bl); 

    drawNode->drawSegment(Vec2(300, 250), Vec2(450, 250), 10, Color4F::GREEN);
    drawNode->drawTriangle(Vec2(300, 200), Vec2(400, 300), Vec2(450, 150), Color4F::RED);

截图:

分析:

(1)可以看出,绘制的图形全部都是实心的。

(2)绘制的线段两边端点是一个半圆,这是因为线段是通过圆点画出来的。

(3)看到中间的两个矩形,一个是实心的,一个是空心的。

(4)实心的贝塞尔图形,看起来好奇怪啊。

推荐阅读:

DrawNode绘图API方法总结

贝塞尔曲线原理

时间: 2024-12-30 11:06:55

学习简单绘图DrawNode的相关文章

OpenCV for Python 学习 (一 绘图函数)

本人的学习笔记主要记录的是学习opencv-python-tutorials这本书中的笔记 今天晚上简单学习OpenCV for Python如何绘图,主要用了这几个函数(这几个函数可在:http://docs.opencv.org/modules/core/doc/drawing_functions.html 找到): cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) cv2.circle(img, center,

spring4.0.6最新稳定版新特性学习,简单学习教程(一)

Spring Framework 4.0 学习整理. Spring框架的核心部分就是Ioc容器,而Ioc控制的就是各种Bean,一个Spring项目的水平往往从其XML配置文件内容就能略知一二,很多项目,往往是外包公司的项目,配置文件往往是乱七八糟,抱着能跑就行,不报错就行的态度去写,然后在项目中后期发现各种缺失又去一通乱补,其结果就是,整个文档可读性极差,毫无章法.这也不能怪写这个XML的人,拿着苦逼程序员的工资干着架构师的工作必然是这个结果.为了程序员的幸福,我认为有必要来一套简单快速的官方

HTML DOM学习------简单介绍

DOM:w3c文档对象模型. 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容.结构和样式. HTML DOM :定义了所有 HTML 元素的对象和属性,以及访问它们的方法. 换言之,HTML DOM 是关于如何获取.修改.添加或删除 HTML 元素的标准. DOM节点:HTML文档中所有内容都是节点: 整个文档是一个文档节点: 每个HTML元素是一个元素节点: HTML元素内的文本是一个文本节点: 每个HTML属性是一个属性节点: 注释是注释节点: HTML DOM将HTM

JAVA学习AWT绘图

package com.graphics; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; /** * 1:Graphics类是所有图形上下文的抽象基类. * * 2:Graphics2D继承了Graphics类,实现了功能更加强大的绘图操作的集合. * 由于Graphics2D类是Graphics类的扩展,也是推荐使用的java绘图类 * 所以本章主要介绍使用Graphics2D类实

GTK进阶学习:绘图事件

GTK界面只要有图片的地方,其底层实际上是通过绘图实现的,所以,我们很有必要学习一下绘图,这里我们使用 Cairo 进行相应的绘图操作. Cairo是用于绘制二维矢量图形的跨平台图形库,采用 C 语言实现,又被许多其它计算机语言所绑定.我们可以使用Cairo库在窗口中绘图,也可以用于生成PNG图片.PDF.PostScript.SVG文件.Cairo同时也是自由软件库,自GTK+2.8版本开始,Cairo成为GTK+库的一部分. 绘图实际上也是事件的一种,GTK中,绘图事件也叫曝光事件. 绘图时

WPF学习之绘图和动画

如今的软件市场,竞争已经进入白热化阶段,功能强.运算快.界面友好.Bug少.价格低都已经成为了必备条件.这还不算完,随着计算机的多媒体功能越来越强,软件的界面是否色彩亮丽.是否能通过动画.3D等效果是否吸引用户的眼球也已经成为衡量软件的标准. 软件项目成功的三个要素是:资源.成本.时间.无论是为了在竞争中保持不败还是为了激发起用户对软件的兴趣,提高软件界面的美化程度.恰当的将动画和3D等效果引入应用程序都是一个必然趋势.然而使用传统的桌面应用程序开发工具和框架(如Winform.MFC.VB.D

Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自己理解的东西. 1.首先是对Winsock的一点介绍:Winsock是一种标准的API(应用程序编程接口),主要用于网络中的数据通信,它允许两个应用程序在同一台机器上或通过网络相互通信.需要注意的是Winsock和协议无关,使用Winsock编程接口,应用程序可通过普通网络协议如:TCP/IP(网络

MyBatis学习--简单的增删改查

jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 1 Public static void main(String[] args) { 2 Connection connection = null; 3 PreparedStatement preparedStatement = null; 4 ResultSet resultSet = null; 5 6 try { 7 //加载数据库驱动 8 Class.forName

003.[python学习] 简单抓取豆瓣网电影信息程序

声明:本程序仅用于学习爬网页数据,不可用于其它用途. 本程序仍有很多不足之处,请读者不吝赐教. 依赖:本程序依赖BeautifulSoup4和lxml,如需正确运行,请先安装.下面是代码: 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 5 import sys 6 reload(sys) 7 sys.setdefaultencoding('utf-8') #解决编码问题 8 9 10 """一个简单的从豆瓣网获取电