西工大 CC++大作业.docx
《西工大 CC++大作业.docx》由会员分享,可在线阅读,更多相关《西工大 CC++大作业.docx(87页珍藏版)》请在冰豆网上搜索。
西工大CC++大作业
学院
班级
学号
姓名
摘要
基于自己对台球运动的喜爱,在本次C++大作业中选择台球游戏作为训练载体。
利用网上找到的关于台游戏的源代码。
通过对WinGUIproject项目的学习,对网上代码做了如下修改:
1.改变了游戏的操作按键。
2.对源代码添加了空房间修饰,加入了自己查找的背景图片和背景音乐。
3.将台球规则做了改动,可在犯规后再连续击球3次。
游戏代码可完成台球游戏的基本规则及功能。
通过本次修改游代码的学习,初步学会了WinGUIproject项目的学习,打破了以往自己编poj一直只会用consoleapplication项目的尴尬。
极大的激发了我对C++游戏编程的兴趣。
相信自己有一天会独立编写自己的游戏。
不足之处:
由于自己所学过少,还有很大一部分代码看不太懂,不知其用意何在。
因此急需大量涉猎学习。
目录
1摘要3
1.1设计题目3
1.2设计内容3
1.3开发工具3
1.4应用平台3
2详细设计3
2.1程序结构3
2.2主要功能3
2.3函数实现4
2.4开发日志19
3程序调试及运行19
3.1程序运行结果19
3.2程序使用说明22
3.3程序开发总结23
4附件(源程序)23
/*在后面的文档编写中,请你不要修改各个标题的内容,从而确保报告内容和风格一致。
完成全部内容后,你只需要在上面的目录上右键“更新域”,选择“只更新页码”就可以更新正确的目录页码。
注意:
目录的左边距为6.5厘米。
*/
1摘要
1.1设计题目
加强原有台球小游戏的功能和制作背景,加强观赏性
1.2设计内容
根据网上查找原有台球游戏代码资料,在billiards.cpp中对台球的操作按键进行了修改(括号内为原来按键):
1.将视图左旋转该为A键(向左键),右旋转改为D键(向右键),缩小改为S键(向下键);推杆键改为T键(向上键);增加推杆力度改为E键(<键);减少推杆力度改为F键(>键)。
2.增加修饰物,增加了背景图片和背景音乐。
3.更改击规则。
1.3开发工具
codeblocks和Win32。
1.4应用平台
Windows7/Vista32位
2详细设计
2.1程序结构
本游戏程序主要由3大模块组成,1.主控制模块(说明模块),2.台球控制模块,3.背景控制模块。
各模块主要功能如2.2中说明。
2.2主要功能
1.主控制模块:
给游戏参与者一个较为友好的界面,并对游戏规则进行相关说明。
并在该模块对游戏按键进行了更改。
其代码为附录中billiards.cpp。
2.台球控制模块:
主要功能是由向量法控制台球沿推杆方向前进。
其代码为附录中mySphere.cpp。
3.背景控制模块:
主要功能是实现背景图片链接和背景音乐的链接。
其代码为附录中vector.cpp。
2.3函数实现
1.
intImageLoad(constchar*filename,Image*image){
FILE*file;
unsignedlongsize;
unsignedlongi;
unsignedshortintplanes;
unsignedshortintbpp;
chartemp,finalName[80];
strcpy(finalName,"textures/");
strcat(finalName,filename);
if((file=fopen(finalName,"rb"))==NULL){
printf("FileNotFound:
%s\n",finalName);
return0;
}
fseek(file,18,SEEK_CUR);
if((i=fread(&image->sizeX,4,1,file))!
=1){
printf("Errorreadingwidthfrom%s.\n",finalName);
return0;
}
if((i=fread(&image->sizeY,4,1,file))!
=1){
printf("Errorreadingheightfrom%s.\n",finalName);
return0;
}
size=image->sizeX*image->sizeY*3;
if((fread(&planes,2,1,file))!
=1){
printf("Errorreadingplanesfrom%s.\n",finalName);
return0;
}
if(planes!
=1){
printf("Planesfrom%sisnot1:
%u\n",finalName,planes);
return0;
}
if((i=fread(&bpp,2,1,file))!
=1){
printf("Errorreadingbppfrom%s.\n",finalName);
return0;
}
if(bpp!
=24){
printf("Bppfrom%sisnot24:
%u\n",finalName,bpp);
return0;
}
fseek(file,24,SEEK_CUR);
image->data=(char*)malloc(size);
if(image->data==NULL){
printf("Errorallocatingmemoryforcolor-correctedimagedata");
return0;
}
if((i=fread(image->data,size,1,file))!
=1){
printf("Errorreadingimagedatafrom%s.\n",finalName);
return0;
}
for(i=0;itemp=image->data[i];
image->data[i]=image->data[i+2];
image->data[i+2]=temp;
}
return1;
}实现台球控制/
增加背图片
glBindTexture(GL_TEXTURE_2D,surfaceTexture);
for(GLfloatk=(width/(-2.0));k<(width/(2.0));k+=(width/widthSegments)){
for(GLfloatr=(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/lengthSegments);
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点,屏幕代表的四
voidrenderQuad(GLfloatpoint1[3],GLfloatpoint2[3],GLfloatpoint3[3],GLfloatpoint4[3],GLfloatorientation,GLfloattexXTile,GLfloattexYTile){
glBegin(GL_QUADS);
vector3theNormal=vector3(0.0,0.0,0.0);
theNormal=getNormal(point1,point3,point4);
theNormal=theNormal*orientation;
glNormal3f(theNormal.x,theNormal.y,theNormal.z);
glTexCoord2f(0.0,texYTile);
glVertex3fv(point1);
glNormal3f(theNormal.x,theNormal.y,theNormal.z);
glTexCoord2f(texXTile,texYTile);
glVertex3fv(point2);
glNormal3f(theNormal.x,theNormal.y,theNormal.z);
glTexCoord2f(texXTile,0.0);
glVertex3fv(point3);
glNormal3f(theNormal.x,theNormal.y,theNormal.z);
glTexCoord2f(0.0,0.0);
glVertex3fv(point4);
glEnd();
}
//呈现曲线(任意高度和扫描部分缸)屏幕。
voidrenderCurve(GLfloatradius,GLfloatheight,GLfloatsweep,GLuintsegments,GLfloatorientation,GLuint&aTexture){
glPushMatrix();
glBindTexture(GL_TEXTURE_2D,aTexture);
for(floatt=0.0;t<=sweep-(sweep/segments);t+=sweep/segments){
GLfloatx=0.0,y=0.0,z=0.0;
GLfloatpoint1[3]={radius*cos(t),height,radius*sin(t)};
GLfloatpoint2[3]={radius*cos(t+sweep/segments),height,radius*sin(t+sweep/segments)};
GLfloatpoint3[3]={radius*cos(t+sweep/segments),0.0,radius*sin(t+sweep/segments)};
GLfloatpoint4[3]={radius*cos(t),0.0,radius*sin(t)};
renderQuad(point1,point2,point3,point4,orientation,1.0,1.0);
}
glPopMatrix();
}
//渲染任何扫到屏幕的光盘(上限为圆柱体)。
voidrenderCap(GLfloatinner_radius,GLfloatouter_radius,GLfloatinner_sweep,GLfloatouter_sweep,GLuintsegments,GLuint&myTexture){
glPushMatrix();
GLfloatciX=0.0,coX=0.0,ciZ=0.0,coZ=0.0;
GLfloatangle=-1.0*outer_sweep/segments;
glBindTexture(GL_TEXTURE_2D,myTexture);
for(intk=0;kciX=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;
glBegin(GL_QUADS);
glNormal3f(0.0,1.0,0.0);
glTexCoord2f(coX/(2.0*outer_radius),coZ/(2.0*outer_radius));
glVertex3f(coX,0.0,coZ);
glNormal3f(0.0,1.0,0.0);
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_sweep/segments));
glNormal3f(0.0,1.0,0.0);
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));
glNormal3f(0.0,1.0,0.0);
glTexCoord2f(ciX/(2.0*inner_radius),ciZ/(2.0*inner_radius));
glVertex3f(ciX,0.0,ciZ);
glEnd();
}
glPopMatrix();
}
//使得通用校准和预定义扫到屏幕的口袋
voidrenderPocket(GLfloatsweep){
glPushMatrix();
glTranslatef(0.0,-1.55,0.0);
renderCurve(5.5,2.55,sweep,16,1,theTexture[DARK_WOOD]);
renderCurve(3.0,2.55,sweep,16,-1,theTexture[GREEN_CARPET]);
renderCap(0.0001,5.5,6.3,6.3,16,theTexture[BLACK]);
glPopMatrix();
glPushMatrix();
glTranslatef(0.0,1.0,0.0);
renderCap(3.0,5.5,sweep,sweep,16,theTexture[DARK_WOOD]);
glPopMatrix();
glPushMatrix();
glTranslatef(0.0,-1.4,0.0);
if(sweepelserenderCap(0.0001,3.0,6.3,6.3,16,theTexture[BLACK]);
glPopMatrix();
}
//呈现弯曲的桌腿屏幕
voidrenderTableLegs(){
glNewList(displayList[4],GL_COMPILE);
glBindTexture(GL_TEXTURE_2D,theTexture[DARK_WOOD]);
glPushMatrix();
for(doublek=0;k<3.0*M_PI;k+=1.4){
for(doubleg=0;gGLfloatpoint1[3]={3.0*sin((k+1.4)/3.0)*cos(g),k*2,3.0*sin((k+1.4)/3.0)*sin(g)};
GLfloatpoint2[3]={3.0*sin((k+1.4)/3.0)*cos(g+0.5),k*2,3.0*sin((k+1.4)/3.0)*sin(g+0.5)};
GLfloatpoint3[3]={3.0*sin(k/3.0)*cos(g+0.5),k*2-2.8,3.0*sin(k/3.0)*sin(g+0.5)};
GLfloatpoint4[3]={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(1.0,1.8,5,8);
gluCylinder(pillarCylinder,1.0,3.0,4.0,8,2);
glPopMatrix();
glEndList();
}
//绘制表格的一侧(通常对齐)
voiddrawSide(){
glPushMatrix();
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,theTexture[WOOD]);
gluCylinder(pillarCylinder,1.7,1.7,tableWidth-6,4,4);
glPopMatrix();
//绿地毯的一侧
glPushMatrix();
glTranslatef(-1.0*tableWidth+6,0.0,-2.35);
glRotatef(180.0,0.0,0.0,1.0);
glRotatef(270.0,0.0,1.0,0.0);
glScalef(0.5,1.0,1.0);
glBindTexture(GL_TEXTURE_2D,theTexture[GREEN_CARPET]);
gluCylinder(pillarCylinder,1.7,1.7,tableWidth-6,3,3);
glPopMatrix();
}
//绘制整个表屏幕
voidrenderTable(){
glNewList(displayList[1],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,theTexture[GREEN_CARPET]);
//在铺设地毯的区域抗锯齿的游戏线
glPushMatrix();
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_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);
glRotatef(90.0,0.0,1.0,0.0);
glBegin(GL_LINES);
for(GLfloati=0.0;iglVertex3f((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));
}
glEnd();
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