1、2.4 开发日志 193 程序调试及运行 193.1 程序运行结果 193.2 程序使用说明 223.3 程序开发总结 234 附件(源程序) 23/*在后面的文档编写中,请你不要修改各个标题的内容,从而确保报告内容和风格一致。完成全部内容后,你只需要在上面的目录上右键“更新域”,选择“只更新页码”就可以更新正确的目录页码。注意:目录的左边距为6.5厘米。*/1 摘要1.1 设计题目加强原有台球小游戏的功能和制作背景,加强观赏性1.2 设计内容根据网上查找原有台球游戏代码资料,在billiards.cpp中对台球的操作按键进行了修改(括号内为原来按键):1.将视图左旋转该为A键(向左键),右旋
2、转改为D键(向右键),缩小改为S键(向下键);推杆键改为T键(向上键);增加推杆力度改为E键(键)。2.增加修饰物,增加了背景图片和背景音乐。3.更改击规则。1.3 开发工具codeblocks和Win32。1.4 应用平台Windows 7/Vista 32位2 详细设计2.1 程序结构本游戏程序主要由3大模块组成,1.主控制模块(说明模块),2.台球控制模块,3.背景控制模块。各模块主要功能如2.2中说明。2.2 主要功能1.主控制模块:给游戏参与者一个较为友好的界面,并对游戏规则进行相关说明。并在该模块对游戏按键进行了更改。其代码为附录中 billiards.cpp。2.台球控制模块:主
3、要功能是由向量法控制台球沿推杆方向前进。其代码为附录中mySphere.cpp。3.背景控制模块:主要功能是实现背景图片链接和背景音乐的链接。其代码为附录中vector.cpp。2.3 函数实现1.int ImageLoad(const char *filename, Image *image) FILE *file; unsigned long size; unsigned long i; unsigned short int planes; unsigned short int bpp; char temp, finalName80; strcpy(finalName, textures/
4、 ); strcat(finalName, filename ); if (file = fopen(finalName, rb)=NULL) printf(File Not Found : %sn,finalName); return 0; fseek(file, 18, SEEK_CUR); if (i = fread(&image-sizeX, 4, 1, file) != 1) Error reading width from %s.n, finalName);sizeY, 4, 1, file) !Error reading height from %s.n size = image
5、-sizeX * image-sizeY * 3; if (fread(&planes, 2, 1, file) !Error reading planes from %s.n if (planes !Planes from %s is not 1: %un, finalName, planes);bpp, 2, 1, file) !Error reading bpp from %s.n if (bpp != 24) printf(Bpp from %s is not 24:, finalName, bpp); return 0; fseek(file, 24, SEEK_CUR); imag
6、e-data = (char *) malloc(size); if (image-data = NULL) Error allocating memory for color-corrected image data); if (i = fread(image-data, size, 1, file) !Error reading image data from %s.n for (i=0;idatai; image-datai = image-datai+2;datai+2 = temp; return 1; 实现台球控制/ 增加背图片glBindTexture(GL_TEXTURE_2D
7、, surfaceTexture); for (GLfloat k=(width/(-2.0); k (width/(2.0); k += (width/widthSegments) for (GLfloat r=(length/(-2.0); r (length/(2.0); r += (length/lengthSegments) glBegin(GL_QUADS); glNormal3f(normalX, normalY, normalZ); glTexCoord2f(0.0, texYTile); glVertex3f(k, elevation, r+length/lengthSegm
8、ents); glTexCoord2f(texXTile, texYTile); glVertex3f(k+width/widthSegments, elevation, r+length/lengthSegments); glTexCoord2f(texXTile, 0.0); glVertex3f(k+width/widthSegments, elevation, r); glTexCoord2f(0.0, 0.0); glVertex3f(k, elevation, r); glEnd(); glPopMatrix();/ 呈现方式为任意4点,屏幕代表的四void renderQuad(
9、GLfloat point13, GLfloat point23, GLfloat point33, GLfloat point43, GLfloat orientation, GLfloat texXTile, GLfloat texYTile) glBegin(GL_QUADS); vector3 theNormal = vector3(0.0, 0.0, 0.0); theNormal = getNormal(point1, point3, point4); theNormal = theNormal*orientation; glNormal3f(theNormal.x, theNor
10、mal.y, theNormal.z); glTexCoord2f(0.0, texYTile); glVertex3fv(point1); glTexCoord2f(texXTile, texYTile); glVertex3fv(point2); glTexCoord2f(texXTile, 0.0); glVertex3fv(point3); glTexCoord2f(0.0, 0.0); glVertex3fv(point4); glEnd();/ 呈现曲线(任意高度和扫描部分缸)屏幕。void renderCurve(GLfloat radius, GLfloat height, G
11、Lfloat sweep, GLuint segments, GLfloat orientation, GLuint &aTexture) glPushMatrix(); glBindTexture(GL_TEXTURE_2D, aTexture); for (float t=0.0; t = sweep-(sweep/segments); t += sweep/segments) GLfloat x = 0.0, y = 0.0, z = 0.0; GLfloat point13 = radius*cos(t), height, radius*sin(t); GLfloat point23
12、= radius*cos(t+sweep/segments), height, radius*sin(t+sweep/segments); GLfloat point33 = radius*cos(t+sweep/segments), 0.0, radius*sin(t+sweep/segments); GLfloat point43 = radius*cos(t), 0.0, radius*sin(t); renderQuad(point1, point2, point3, point4, orientation, 1.0, 1.0);/ 渲染任何扫到屏幕的光盘(上限为圆柱体)。void r
13、enderCap(GLfloat inner_radius, GLfloat outer_radius, GLfloat inner_sweep, GLfloat outer_sweep, GLuint segments, GLuint &myTexture) GLfloat ciX = 0.0, coX = 0.0, ciZ = 0.0, coZ = 0.0; GLfloat angle = -1.0*outer_sweep/segments; glBindTexture(GL_TEXTURE_2D, myTexture); for (int k=0; segments; k+) ciX =
14、 inner_radius*cos(angle + inner_sweep/segments); ciZ = inner_radius*sin(angle + inner_sweep/segments); coX = outer_radius*cos(angle + outer_sweep/segments); coZ = outer_radius*sin(angle + outer_sweep/segments); angle += inner_sweep/segments; glNormal3f(0.0,1.0,0.0); glTexCoord2f(coX/(2.0*outer_radiu
15、s), coZ/(2.0*outer_radius); glVertex3f(coX, 0.0, coZ); glTexCoord2f(outer_radius*cos(angle + outer_sweep/segments)/(2.0*outer_radius), outer_radius*sin(angle + outer_sweep/segments)/(2.0*outer_radius); glVertex3f(outer_radius*cos(angle + outer_sweep/segments), 0.0, outer_radius*sin(angle + outer_swe
16、ep/segments); glTexCoord2f(inner_radius*cos(angle + inner_sweep/segments)/(2.0*inner_radius), inner_radius*sin(angle + inner_sweep/segments)/(2.0*inner_radius); glVertex3f(inner_radius*cos(angle + inner_sweep/segments), 0.0, inner_radius*sin(angle + inner_sweep/segments); glTexCoord2f(ciX/(2.0*inner
17、_radius), ciZ/(2.0*inner_radius); glVertex3f(ciX, 0.0, ciZ);/ 使得通用校准和预定义扫到屏幕的口袋void renderPocket(GLfloat sweep) glTranslatef(0.0, -1.55, 0.0); renderCurve(5.5, 2.55, sweep, 16, 1, theTextureDARK_WOOD); renderCurve(3.0, 2.55, sweep, 16, -1, theTextureGREEN_CARPET); renderCap(0.0001, 5.5, 6.3, 6.3, 16
18、, theTextureBLACK); glTranslatef(0.0, 1.0, 0.0); renderCap(3.0, 5.5, sweep, sweep, 16, theTextureDARK_WOOD); glTranslatef(0.0, -1.4, 0.0); if (sweep M_PI+0.001) renderCap(0.0001, 3.0, M_PI, M_PI, 16, theTextureBLACK); else renderCap(0.0001, 3.0, 6.3, 6.3, 16, theTextureBLACK);/ 呈现弯曲的桌腿屏幕void renderT
19、ableLegs() glNewList(displayList4, GL_COMPILE); glBindTexture(GL_TEXTURE_2D, theTextureDARK_WOOD); for (double k=0; 3.0*M_PI; k+=1.4) for (double g=0; g M_PI*2.0; g+=0.5) GLfloat point13 = 3.0*sin(k+1.4)/3.0)*cos(g), k*2, 3.0*sin(k+1.4)/3.0)*sin(g); GLfloat point23 = 3.0*sin(k+1.4)/3.0)*cos(g+0.5),
20、k*2, 3.0*sin(k+1.4)/3.0)*sin(g+0.5); GLfloat point33 = 3.0*sin(k/3.0)*cos(g+0.5), k*2 - 2.8, 3.0*sin(k/3.0)*sin(g+0.5); GLfloat point43 = 3.0*sin(k/3.0)*cos(g), k*2 - 2.8, 3.0*sin(k/3.0)*sin(g); renderQuad(point1, point2, point3, point4, 1.0, 1.0, 1.0); glRotatef(90.0, 1.0, 0.0 ,0.0); glutSolidTorus
21、(1.0, 1.8, 5, 8); gluCylinder(pillarCylinder, 1.0, 3.0, 4.0, 8, 2); glEndList();/ 绘制表格的一侧(通常对齐)void drawSide() glTranslatef(0, -0.3, 0); glScalef(1.0, 1.0, 2.0); glRotatef(270.0, 0.0, 1.0, 0.0); glRotatef(45.0, 0.0, 0.0, 1.0); glBindTexture(GL_TEXTURE_2D, theTextureWOOD); gluCylinder(pillarCylinder,
22、 1.7, 1.7, tableWidth - 6, 4, 4); / 绿地毯的一侧 glTranslatef(-1.0*tableWidth + 6, 0.0, -2.35); glRotatef(180.0, 0.0, 0.0, 1.0); glScalef(0.5, 1.0, 1.0); glBindTexture(GL_TEXTURE_2D, theTextureGREEN_CARPET); gluCylinder(pillarCylinder, 1.7, 1.7, tableWidth - 6, 3, 3);/ 绘制整个表屏幕void renderTable() glNewList(
23、displayList1, GL_COMPILE); glColor3f(1.0,1.0,1.0); / 表铺设地毯的区域 renderSurface(tableWidth, tableLength, 10.0, 15.0, -1.5, 1.0, 1.0, 0.0, 1.0, 0.0, theTextureGREEN_CARPET); / 在铺设地毯的区域抗锯齿的游戏线 glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_
24、ALPHA); glEnable(GL_LINE_SMOOTH); glColor4f(0.5, 0.5, 0.5, 0.4); glLineWidth(2.5f); / 水平式线 glTranslatef(0.0, -1.45, 0.0); glBegin(GL_LINES); glVertex3f(minX - pocketRadius, 0.0, minZ - minZ/3); glVertex3f(maxX + pocketRadius, 0.0, minZ - minZ/3); glEnd(); /半圈 glTranslatef(0.0, 0.0, minZ - minZ/3); g
25、lRotatef(90.0, 0.0, 1.0, 0.0); for (GLfloat i = 0.0; i M_PI-(M_PI/12.0); i+=M_PI/12.0) glVertex3f(maxZ/6.0)*sin(i), 0.0, (maxZ/6.0)*cos(i); glVertex3f(maxZ/6.0)*sin(i+M_PI/12.0), 0.0, (maxZ/6.0)*cos(i+M_PI/12.0); glLineWidth(1.0f); / 上线的启动点 glRotatef(90.0, 1.0, 0.0, 0.0); gluDisk(pillarCylinder, 0, 0.3, 9, 1); glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); glEnable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); glPo
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1