(译)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;
新手翻译,不准确请见谅,参考代码与原书。
- (译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.4绘制OpenGL图形
- (译) Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.1绘制精灵
- opengl 绘制简单图形
- OpenGL绘制简单图形
- OpenGL简单图形绘制
- OpenGL---绘制简单图形
- OPENGL基本图形绘制
- OpenGL 绘制二维图形
- OpenGL--绘制基础图形
- OPENGL三维图形绘制讨论
- OPENGL三维图形绘制讨论
- opengl绘制3D图形
- opengl图形绘制,参数说明
- 使用opengl绘制五角星图形
- OpenGL应用开发---图形绘制
- [OpenGL]用OpenGL图形的绘制--矩形
- OpenGL ES绘制3D图形
- Globe中是用OpenGL绘制图形实例
- Servlet简介
- (译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.3运动的精灵
- flex---->flex访问java远程对象
- 第五周实验报告(二)
- 在 EmEditor 中通过大纲视图列出 INI 文件中的 Section
- (译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.4绘制OpenGL图形
- (译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.5播放视频文件
- 第五周实验报告(三)
- 闪腰记
- (译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.6网格,粒子,追尾特效
- 第六周实验报告(一)
- APIO07-zoo
- (译)Cocos2d_for_iPhone_1_Game_Development_Cookbook:1.7使用Retina模式
- 第六周实验报告(二)