(译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.4绘制OpenGL图形

来源:互联网 发布:防辐射服有没有用 知乎 编辑:程序博客网 时间:2024/06/05 16:38

(译)Cocos2d_for_iPhone_1_Game_Development_Cookbook

著作声明:本文由iam126 翻译,欢迎转载分享。

请尊重作者劳动,转载时保留该声 明和作者博客链接,谢谢!

相关程序代码下载:http://download.csdn.net/detail/iam126/4068610

或搜索“Cocos2d_for_iPhone_1_Game_Development_Cookbook代码”于CSDN;

新手翻译,不准确请见谅,参考代码与原书。

 

1.4绘制OpenGL图形

 

  
有些时候在2D游戏开发中,我们需要绘制过时的OpenGL图形。我们可以绘制一些例如子弹的轨迹效果、雷击的爆炸效果等等。在接下来的这个场景中,我们将创建一个通过Cocos2d的绘图功能所绘制的组合图形。

 

做好准备

 

请打开整个 RecipeCollection01项目文件。

 

如何工作:

 

为了代码的整洁,我们省略了一部分代码。

 

//绘制一个实心圆

void ccDrawSolidCircle( CGPoint center/*圆心坐标*/,float r, float a, NSUInteger segs/*绘制密集度(隔断)*/,BOOL drawLineToCenter/*是否画中心线*/)

{

   //检测我们是否需要绘制一条中心线

   int additionalSegment = 1;

   if (drawLineToCenter)//BOOL属性

   {

       additionalSegment++;

   }

   const float coef = 2.0f * (float)M_PI/segs;

   GLfloat *vertices = calloc( sizeof(GLfloat)*2*(segs+2), 1);

   /*

    函数名:sizeof()

    c语言中判断数据类型长度符的关键字。

    运算符,可用于任何变量名、类型名或常量值,当用于变量名或者常量时,不需要加入圆括号。

    在编译时起作用,而不是运行时。

 

    函数名:calloc

    void *calloc(unsigned n, unsigned size);

    功能:在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

    */

   if( !vertices )

   {

       return;

   }

   //计算线段

    for(NSUInteger i=0;i<=segs;i++)

    {

        float rads = i*coef;

        GLfloat j = r * cosf(rads + a) +center.x;

        GLfloat k = r * sinf(rads + a) +center.y;

        vertices[i*2] = j *CC_CONTENT_SCALE_FACTOR();

//CC_CONTENT_SCALE_FACTOR()==1

        vertices[i*2+1] =k *CC_CONTENT_SCALE_FACTOR();

    }

    vertices[(segs+1)*2] = center.x *CC_CONTENT_SCALE_FACTOR();

    vertices[(segs+1)*2+1] = center.y *CC_CONTENT_SCALE_FACTOR();

    //绘制填充的图形

   glDisable(GL_TEXTURE_2D);

   glDisableClientState(GL_TEXTURE_COORD_ARRAY);

   glDisableClientState(GL_COLOR_ARRAY);

   glVertexPointer(2, GL_FLOAT, 0, vertices);

   glDrawArrays(GL_TRIANGLE_FAN, 0, segs+additionalSegment);

   glEnableClientState(GL_COLOR_ARRAY);

   glEnableClientState(GL_TEXTURE_COORD_ARRAY);

   glEnable(GL_TEXTURE_2D);

   //释放内存

   free(vertices);

}

-(void) draw

{

   //设置线宽度.

   glLineWidth(4.0f);

   //设置点大小

   glPointSize(16);

   //允许线平滑

   glEnable(GL_LINE_SMOOTH);//使用此句时,绘制线的重复线段垂直于线的行走方向

   //绘制蓝色的Bezier曲线

   glColor4ub(0, 0, 255, 255);

   ccDrawQuadBezier(ccp(100,0), ccp(240,70), ccp(380,0), 10/*绘制密集度(隔断)*/);

   //绘制空心粉色圆

   glColor4ub(255, 0, 255, 255);

   ccDrawCircle(ccp(240,160), 125.0f, 0.0f, 100, NO);

   //绘制红色的实线

   glColor4ub(255, 0, 0, 255);

   ccDrawLine(ccp(170,220), ccp(220,190));

   ccDrawLine(ccp(260,190), ccp(310,220));

   //绘制绿点

   glColor4ub(0, 255, 0, 255);

   ccDrawPoint(ccp(200,180));

   ccDrawPoint(ccp(280,180));

   //绘制绿色的实心圆*2

   glColor4ub(0, 128, 255, 50);

   ccDrawSolidCircle(ccp(200,180), 25.0f, 0.0f, 20, NO);

   ccDrawSolidCircle(ccp(280,180), 25.0f, 0.0f, 20, NO);

   //绘制棕色的空心圆*2

   glColor4ub(64,32, 0, 255);

   ccDrawCircle(ccp(200,180), 25.0f, 0.0f, 100, NO);

   ccDrawCircle(ccp(280,180), 25.0f, 0.0f, 100, NO);

   //绘制棕色线*3

   glColor4ub(64,32, 0, 255);

   ccDrawLine(ccp(225,180), ccp(255,180));

   ccDrawLine(ccp(305,180), ccp(370,160));

   ccDrawLine(ccp(175,180), ccp(110,160));

   //绘制橙色的5角型图形

   glColor4ub(255, 128, 0, 255);

   CGPoint vertices[5]=

   {

       ccp(230,150),ccp(240,160),ccp(250,150),ccp(245,140),ccp(235,140)

   };

   ccDrawPoly(vertices, 5, YES);

   //绘制黄色的Bezier曲线

   glColor4ub(255, 255, 0, 255);

   ccDrawCubicBezier(ccp(170,90), ccp(220,150), ccp(260,50),ccp(320,100),10);

   //回复初始值

   glLineWidth(1);//线粗细

   glDisable(GL_LINE_SMOOTH);//平滑度

   glColor4ub(255,255,255,255);//颜色

   glPointSize(1);//点大小

}

 

它是如何工作的?

 

这个教程向我们展现了如何使用每一个图形绘制方法:

 

重写draw方法:

-(void)draw;

正如CCNode.h中所声明的,重写这个方法使得我们可以重新控制底层的OpenGL绘图程序。下面是OpenGL内部声明的方法:

glEnableClientState(GL_VERTEX_ARRAY);

glEnableClientState(GL_COLOR_ARRAY);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glEnable(GL_TEXTURE_2D);

为了重载这个方法,我们创建了一个名叫ShaperLayer的类,它是CCLayer的子类,即是CCNode的子类。一旦在这个场景重载了draw方法,将会被调用一直循环运行。

 

图形的绘制方法:

接下来的图形绘制方法在Cocos2d是可用的:

void ccDrawPoint( CGPoint point );//画点

void ccDrawPoints( const CGPoint *points,NSUInteger numberOfPoints ); //

void ccDrawLine( CGPoint origin, CGPointdestination ); //画线

void ccDrawPoly( const CGPoint *vertices,NSUInteger numOfVertices, BOOL closePolygon ); //画多边形

void ccDrawCircle( CGPoint center, float radius, floatangle, NSUInteger segments, BOOL drawLineToCenter); //画圆

void ccDrawQuadBezier(CGPoint origin, CGPointcontrol, CGPoint destination, NSUInteger segments); //Bezier曲线

void ccDrawCubicBezier(CGPoint origin, CGPointcontrol1, CGPoint control2, CGPoint destination, NSUInteger segments); //

最开始我们调整了ccDrawCircle方法创建了ccDrawSolidCircle方法,如下:

void ccDrawSolidCircle( CGPoint center, float r,float a,  NSUInteger segs, BOOLdrawLineToCenter);

在真实情况下,我们有时会使用OpenGL渲染,并希望每一贞在使用这个技术时效果都很好。我们将在接下来进一步探讨这个问题。

 

更多的事…

 

如果你计划广泛的使用这种图形绘制方式,你可能想考虑使用顶点缓冲对象的OpenGL扩展方式。使用GL方式glGenBuffers,glBindBuffer,以及glBufferData。你可以更多利用视频,而不是系统内存。如果想更多的了解有关“顶点数据的运用”信息,可以在http://developer.apple.com/library/ios/#documentation/3DDrawing/ Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html.查找OpenGL ES Programming Guide for iOS 文档。

 

(译)Cocos2d_for_iPhone_1_Game_Development_Cookbook

著作声明:本文由iam126 翻译,欢迎转载分享。

请尊重作者劳动,转载时保留该声 明和作者博客链接,谢谢!

相关程序代码下载:http://download.csdn.net/detail/iam126/4068610

或搜索“Cocos2d_for_iPhone_1_Game_Development_Cookbook代码”于CSDN;

新手翻译,不准确请见谅,参考代码与原书。

 


原创粉丝点击