DrawPrimitive真是一个好类!!cocos的开发组干了好事。

如果每次在商业项目中使用opengl命令去绘制特效,工作效率真心低,所以官方包装了这个接口,真实好东西。

draw函数的接口以及改了,新接口不允许重载原先的void draw(void)。

命令模式已是过去,显示列表模式则是将命令放入缓冲池中,在opengl状态机执行绘制命令时从中读取才去绘制,不再是每次绘制就调用opengl状态机立即绘制。

这就要求引擎全局组织绘制命令,即openglcocos2d::CustomCommand

class CustomCommand : public RenderCommand
{
public:
    CustomCommand();
    ~CustomCommand();

public:

    void init(float depth);

    void execute();

    inline bool isTranslucent() { return true; }
    std::function<void()> func;

protected:
};

render执行单个RenderCommand时就是调用execute函数,最后访问额func成员,从而执行下面的onDraw。

最后产生一堆绘制命令。等待真正opengl去执行,实际上每条绘制函数的命令都会去flush一次。

代码是演示效果:VisibleRect来自testCpp,或者说下面整段来自testCpp。

void HelloWorld::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
    m_customCommand.init(_globalZOrder);
    m_customCommand.func = CC_CALLBACK_0(HelloWorld::onDraw, this, transform, flags);
    renderer->addCommand(&m_customCommand);
}

void HelloWorld::onDraw(const Mat4 &transform, uint32_t flags)
{
    Director* director = Director::getInstance();
    director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, transform);

    //draw
    CHECK_GL_ERROR_DEBUG();

    // draw a simple line
    // The default state is:
    // Line Width: 1
    // color: 255,255,255,255 (white, non-transparent)
    // Anti-Aliased
    //  glEnable(GL_LINE_SMOOTH);
    DrawPrimitives::drawLine( VisibleRect::leftBottom(), VisibleRect::rightTop() );

    CHECK_GL_ERROR_DEBUG();

    // line: color, width, aliased
    // glLineWidth > 1 and GL_LINE_SMOOTH are not compatible
    // GL_SMOOTH_LINE_WIDTH_RANGE = (1,1) on iPhone
    //  glDisable(GL_LINE_SMOOTH);
    glLineWidth( 5.0f );
    DrawPrimitives::setDrawColor4B(255,0,0,255);
    DrawPrimitives::drawLine( VisibleRect::leftTop(), VisibleRect::rightBottom() );

    CHECK_GL_ERROR_DEBUG();

    // TIP:
    // If you are going to use always thde same color or width, you don't
    // need to call it before every draw
    //
    // Remember: OpenGL is a state-machine.

    // draw big point in the center
    DrawPrimitives::setPointSize(64);
    DrawPrimitives::setDrawColor4B(0,0,255,128);
    DrawPrimitives::drawPoint( VisibleRect::center() );//中心的圆点,蓝色正方向

    CHECK_GL_ERROR_DEBUG();

    // draw 4 small points
    Vec2 points[] = { Vec2(60,60), Vec2(70,70), Vec2(60,70), Vec2(70,60) };
    DrawPrimitives::setPointSize(4);
    DrawPrimitives::setDrawColor4B(0,255,255,255);
    DrawPrimitives::drawPoints( points, 4);//四个青色点

    CHECK_GL_ERROR_DEBUG();

    // draw a green circle with 10 segments
    glLineWidth(16);
    DrawPrimitives::setDrawColor4B(0, 255, 0, 255);
	DrawPrimitives::drawCircle( VisibleRect::center(), 100, 2, 10, false);

    CHECK_GL_ERROR_DEBUG();

    // draw a green circle with 50 segments with line to center
    glLineWidth(2);
    DrawPrimitives::setDrawColor4B(0, 255, 255, 255);
    DrawPrimitives::drawCircle( VisibleRect::center(), 200, CC_DEGREES_TO_RADIANS(90), 50, true);

    CHECK_GL_ERROR_DEBUG();

    // draw a pink solid circle with 50 segments
    glLineWidth(2);
    DrawPrimitives::setDrawColor4B(255, 0, 255, 255);
    DrawPrimitives::drawSolidCircle( VisibleRect::center() + Vec2(140,0), 40, CC_DEGREES_TO_RADIANS(90), 50, 1.0f, 1.0f);

    CHECK_GL_ERROR_DEBUG();

    // open yellow poly
    DrawPrimitives::setDrawColor4B(255, 255, 0, 255);
    glLineWidth(10);
    Vec2 vertices[] = { Vec2(0,0), Vec2(50,50), Vec2(100,50), Vec2(100,100), Vec2(50,100) };
    DrawPrimitives::drawPoly( vertices, 5, false);//左下角的方形

    CHECK_GL_ERROR_DEBUG();

    // filled poly
    glLineWidth(1);//五角星
    Vec2 filledVertices[] = { Vec2(0,120), Vec2(50,120), Vec2(50,170), Vec2(25,200), Vec2(0,170) };
    DrawPrimitives::drawSolidPoly(filledVertices, 5, Color4F(0.5f, 0.5f, 1, 1 ) );

    // closed purble poly
    DrawPrimitives::setDrawColor4B(255, 0, 255, 255);
    glLineWidth(2);
    Vec2 vertices2[] = { Vec2(30,130), Vec2(30,230), Vec2(50,200) };
    DrawPrimitives::drawPoly( vertices2, 3, true);

    CHECK_GL_ERROR_DEBUG();

    // draw quad bezier path 中间这条线
    DrawPrimitives::drawQuadBezier(VisibleRect::leftTop(), VisibleRect::center(), VisibleRect::rightTop(), 50);

    CHECK_GL_ERROR_DEBUG();

    // draw cubic bezier path 上面的线
    DrawPrimitives::drawCubicBezier(VisibleRect::center(), Vec2(VisibleRect::center().x+30,VisibleRect::center().y+50), Vec2(VisibleRect::center().x+60,VisibleRect::center().y-50),VisibleRect::right(),100);

    CHECK_GL_ERROR_DEBUG();

    //draw a solid polygon
    Vec2 vertices3[] = {Vec2(60,160), Vec2(70,190), Vec2(100,190), Vec2(90,160)};
    DrawPrimitives::drawSolidPoly( vertices3, 4, Color4F(1,1,0,1) );

    // restore original values
    glLineWidth(1);
    DrawPrimitives::setDrawColor4B(255,255,255,255);
    DrawPrimitives::setPointSize(1);

    CHECK_GL_ERROR_DEBUG();

    //end draw
    director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}

西。

const Vec2& center,

float radius,

float angle,---------这个参数有什么用?没看懂,测试了也感觉不出区别。。终于找到了,相对于x轴正方向旋转方向。比如:从90*pi/180度即y轴正方向与圆交点的位置

unsigned int segments,:圆边被切成多少段线段

bool drawLineToCenter:圆心到起始绘制点是否绘制线段

void drawCircle( const Vec2& center, float radius, float angle, unsigned int segments, bool drawLineToCenter)
{
    drawCircle(center, radius, angle, segments, drawLineToCenter, 1.0f, 1.0f);
}

待续

时间: 2024-09-30 16:35:17

DrawPrimitive真是一个好类!!cocos的开发组干了好事。的相关文章

【Android开发VR实战】三.开发一个寻宝类VR游戏TreasureHunt

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53939303 本文出自[DylanAndroid的博客] [Android开发VR实战]三.开发一个寻宝类VR游戏TreasureHunt VR即Virtual Reality虚拟现实.虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中. 那么,如何在Androi

NX二次开发-UFUN获取一个图层类别的tag UF_LAYER_ask_category_tag

1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_ui.h> 5 #include <uf_layer.h> 6 7 8 9 UF_initialize(); 10 11 //获取一个图层类别的tag 12 tag_t category = NULL_TAG; 13 UF_LAYER_ask_category_tag("01.Tangkl_Solids", &category); 14 15 /

《招一个靠谱的移动开发》iOS面试题及详解(上篇)

多线程.特别是NSOperation 和 GCD 的内部原理. 运行时机制的原理和运用场景. SDWebImage的原理.实现机制.如何解决TableView卡的问题. block和代理的,通知的区别.block的用法需要注意些什么. strong,weak,retain,assign,copy nomatic 等的区别. 设计模式,mvc,单利,工厂,代理等的应用场景. 单利的写法.在单利中创建数组应该注意些什么. NSString 的时候用copy和strong的区别. 响应值链. NSTi

第一个Windows Phone 8 程序开发之后台音频播放

对于播客的音频应该是连续多个的列表,作为在后台连续播放.在网上搜了一下,通过wp8后台音频代理播放,而且例子都是静态的播放列表,不满足动态生成列表播放. 尝试着将播放列表对象声明为公有静态的,在外部对列表进行操作,发现这个静态的播放列表在agent里和我的操作类不是同一个引用,此方法行不通. 最后在 http://www.devdiv.com/forum.php?mod=redirect&goto=findpost&ptid=199381&pid=960706 找到了思路: 在wp

不能继承于QObject的类就一定不能使用信号槽?(用一个代理类进行发射就行了)

首先不能继承QObject的情况在开发中遇到得并不多,笔者在一年多的Qt项目开发中只遇到两三次.而且都是因为引进了第三方库导致编译过程中报错. 要想解决这个问题其实不难,因为笔者遇到的问题都是想定义一个信号,定义的槽情况没有遇到过,可以提出一个想法,有需要的朋友试一下. 要想实现信号发送,可以定义一个信号发射器类继承于QObject,然后在想要发送信息的类里定义一个信号发射器: 图1 图2 只要在想触发信号的地方调用信号发射器的sendMsg()函数就可以让信号发射器将信号发出. 要想实现槽的话

实体类作为另一个实体类的属性

如果一个实体类作为另一个实体类的属性,如果对该属性赋值的时候直接赋一个对象就行了,如果有多个对象同时赋给那个属性 就可以用List集合去接收,就像微信开发里面的图文消息 ,如果回复的是多条图文消息就用list集合去装t它们. 今天早上被技术总监说了一顿,就是他将很多种类都写在一个文件里面,而我一般都是将类写在一个单独的文件里面,我很奇怪这种写法.在QQ群里和人讨论了一下,觉得类应该是单独的建一个文件去写,这样不管是后期维护,还是查阅修改,都会很方便.还有一种所有实体类加partial.需要手动改

分享一个SqliteHelper类

分享一个SqliteHelper类 SQLite作为一个本地文件数据库相当好用,小巧.快速.支持事务.关系型,甚至可以运行在Android上.在很久以前的一个项目中,我们用过它来将接收到的数据做本地统计,数据量很大,甚至于我们想自己搞个内存空间专门做缓存,缓存满后再一点点地往SQLite中移,现在看起来是多余的,这也不符合开发的过程.在开发中,应该先把功能做出来,如果有性能问题,再找出解决方法.直接在SQLite中做插入而不是先在内存中做,它的效率已经达到了要求. 现在跟大家分享一个对SQLit

第一个OC类、解析第一个OC程序

01第一个OC 类 本文目录 • 一.语法简介 • 二.用Xcode创建第一个OC的类 • 三.第一个类的代码解析 • 四.添加成员变量 • 五.添加方法 • 六.跟Java的比较 • 七.创建对象 • 八.访问公共成员变量和方法说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C.如果你还没有编程经验,或者对Objective-C.iOS开发不感兴趣,请忽略.学习本专题之前,建议先学习C语言专题.OC是一门面向

分装一个SqlHelper类方便使用,着重理解params Sql

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using System.Configuration; using _17