《水果忍者》设计报告.docx
- 文档编号:9588102
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:17
- 大小:19.30KB
《水果忍者》设计报告.docx
《《水果忍者》设计报告.docx》由会员分享,可在线阅读,更多相关《《水果忍者》设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
《水果忍者》设计报告
福建工程学院国脉信息学院
《水果忍者》课程设计报告
题目:
水果忍者游戏开发
专业:
电子信息工程
班级:
电子1001班
学号:
1030010145
姓名:
郭龙彬
指导教师:
陈灏、韩海峰
完成日期:
2013年04月07日
设计题目
水果忍者游戏开发
周次:
2
实验时间
2013年3月25日~4月07日
课程设计要求
熟悉C/C++语言
能够用C/C++语言解决一个实际问题
掌握编程思路
课程设计过程
导入茶壶模型、设置旋转效果、插入水果忍者背景、导入水果模型、增加水果种类、设置水果按照设定好的抛物线的轨迹运动、增加刀锋效果、设置屏幕切换效果、导入半个水果模型,设置当刀锋接触水果时把水果切成两半的效果、添加水果忍者背景音乐。
参考资料
《嵌入式系统》项目课程,OpenGL编程基础
设计总结与体会
此次实训最大的收获不是我学习到了多少知识而是这几天实训给我的感悟:
首先是心态。
一定要有一个积极的心态,独立解决问题的意识,培养扎实基础的认识。
有自己的东西,有自己的付出,才会有程序运行成功时的喜悦和小自豪,这样也有助于培养自己的兴趣。
要时刻牢记态度决定一切。
其次是兴趣,感觉学习工作中兴趣很关键,只是一个引发人积极性的问题,有了兴趣就自觉了,效率自然就高了。
再次要敢于尝试和挑战。
不要安于现成的程序,而且不要害怕失败,在程序调试的过程中这点尤为重要,“发现出问题然后解决问题”是一个积累经验的过程,而且很高效。
最后要不懈追求。
对于源代码进行不断的完善,要尽可能的实现课题所要求的功能。
对于初学者或者开发较少的人来说,大量大写程序还是有必要的,但同时要注意思考,理解其实现的内在意义。
还可以自己添加一些有意义的功能来实现。
当看到自己编写的程序正常运行时,兴趣也会随之而来,乐此不疲,形成一个良性循环。
两周的学习,有过艰辛,有过喜悦,放弃过,坚持过。
两周的学习让自己真正的过了把瘾,自己从一个玩游戏的角色到开发游戏的角色。
角色的变换,心境的变化。
我们从一开始的照搬照抄敲着看似是自己的代码,到后来自己思考游戏思路,敲着自己的代码。
学习中遇到了很多的问题,通过小组的讨论解决。
让我认识到团结的重要性,有时并不是一人不能解决的问题,放到团体中,大家集思广益,每个人一点思路,问题就给放小了,那就容易解决了。
两周的时间虽说有点短,不过这两周让我学到了很多东西,让我了解了嵌入式,知道了以后的大致出路。
这次实训让我学会了规划,制定计划,每天的学习都有迹可寻。
◆课程过程及其程序:
1.导入茶壶模型
#include
#include
voidDisplay();//定义调用函数
voidReshape(intw,inth);//定义窗口重绘函数
GLfloatangle=0;//定义旋转角度
voidMouseMove(intx,inty);//定义鼠标事件函数
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);//初始化函数
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
glutInitWindowPosition(150,150);//窗口位置
glutInitWindowSize(800,600);//窗口大小
glutCreateWindow("GoodJob");//窗口创建并命名
glutDisplayFunc(Display);//回调函数
glutMotionFunc(MouseMove);//鼠标事件函数
glutReshapeFunc(Reshape);//窗口重绘函数(移动与变化时)
glutMainLoop();//循环函数
return0;
}
voidMouseMove(intx,inty)//鼠标执行函数
{
if(angle>=360)
angle=0;
angle+=0.001;//角度变化函数(数值±表旋转方向)
glutPostRedisplay();//角度改变、重新绘制
}
voidDisplay()//调用函数
{
glClearColor(0.0,0.0,0.0,0.0);//末位0表示混合值:
0.0-1.0
glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓冲区(设定背景色)
glRotatef(angle,1.0,0.0,0.0);//确定旋转轴
glRotatef(angle,0.0,1.0,0.0);
glRotatef(angle,0.0,0.0,1.0);
glBegin(GL_LINES);//画直线函数
glVertex3f(-0.5,0.5,0.0);//顶点函数(x,y,z)
glVertex3f(0.5,-0.5,0.0);
glEnd();
glBegin(GL_QUADS);//画平面函数
glColor3f(0.3,0.5,0.7);glVertex3f(-0.5,0.5,0.0);//平面颜色(三基色)
glColor3f(0.7,0.5,0.8);glVertex3f(-0.5,-0.5,0.0);//顶点函数(x,y,z)
glColor3f(0.4,0.5,0.6);glVertex3f(0.5,-0.5,0.0);
glColor3f(0.8,0.8,0.4);glVertex3f(0.5,0.5,0.0);
glEnd();
glColor3f(0.3,0.5,0.7);//设置茶壶颜色
glutWireTeapot(0.4);//画茶壶(大小)
glutSwapBuffers();
}
2.设置旋转效果
voidDisplay()//调用函数
{
glClearColor(0.0,0.0,0.0,0.0);//末位0表示混合值:
0.0-1.0
glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓冲区(设定背景色)
glRotatef(angle,0.0,1.0,0.0);//确定旋转轴
glRotatef(angle,0.0,1.0,0.0);
glRotatef(angle,0.0,1.0,0.0);
}
3.插入水果忍者背景
voidLoadTexture()
{
QImagebuf,textureBuf;//图像准备
if(!
buf.load("./images/background.jpg"))
{
printf("Loaderror!
\n");//当读取错误时提示
}
textureBuf=QGLWidget:
:
convertToGLFormat(buf);//转换图形格式
glGenTextures(1,&textureArray[0]);//生成一个纹理,建立索引
glBindTexture(GL_TEXTURE_2D,textureArray[0]);//绑定纹理
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,textureBuf.width(),textureBuf.height(),
0,GL_RGBA,GL_UNSIGNED_BYTE,textureBuf.bits());//生成一个2D纹理
//第一个0:
最基本的图像执行细节级别,第二个0:
边框的宽度
}
voidOpenGLInit()
{
glEnable(GL_TEXTURE_2D);//启动纹理贴图功能
}
4.导入水果模型
CLoad3DSAppleLoad3DS;//读取苹果3D模型
if(!
AppleLoad3DS.Import3DS(&AppleModel,"./3dmodel/apple.3ds"))
{
printf("Load3DSFileError!
\n");
}
AppleObject.get3Dmodel(&AppleModel);
5.增加水果种类
CLoad3DSAppleLoad3DS;//读取苹果3D模型
if(!
AppleLoad3DS.Import3DS(&AppleModel,"./3dmodel/apple.3ds"))
{
printf("Load3DSFileError!
\n");
}
AppleObject.get3Dmodel(&MeloModel);
CLoad3DSMeloLoad3DS;//读取西瓜3D模型
if(!
MeloLoad3DS.Import3DS(&MeloModel,"./3dmodel/melo.3ds"))
{
printf("Load3DSFileError!
\n");
}
AppleObject.get3Dmodel(&AppleModel);
MeloObject.get3Dmodel(&MeloModel);
glutDisplayFunc(Display);//回调函数
glutMotionFunc(MouseMove);//鼠标事件函数
glutReshapeFunc(Reshape);//窗口重绘函数(移动与变化时)
glutMainLoop();//循环函数
return0;
}
6.设置水果按照设定好的抛物线的轨迹运动
PARABOLA_THREEPOINTThreepoints[11];
Parabolaparabola(-0.8,-0.45,0.0,0.0,0.8,-0.45);
ParabolaparabolaA(-0.1,-0.8,0.0,0.5,0.1,-0.8);
ParabolaparabolaB(0.8,-0.45,0.0,0.0,-0.8,-0.45);
ParabolaparabolaC(-0.5,-1.0,1.0,0.5,2.0,-1.0);
intmain(intargc,char*argv[])
{
parabola.drawParabola();
parabolaA.drawParabola();
parabolaB.drawParabola();
parabolaC.drawParabola();
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
voidOntimer(intvalue)//定时器的回调函数
{
if(tmpParabola>=parabola.parabolaIndex-1)
{
tmpParabola=0;
}
tmpParabola++;
FruitX=parabola.parabolaPoint[tmpParabola].x;
FruitY=parabola.parabolaPoint[tmpParabola].y;
glutPostRedisplay();
glutTimerFunc(300,Ontimer,1);
}
voidOntimerA(intvalue)//定时器的回调函数
{
if(tmpParabolaA>=parabolaA.parabolaIndex-1)
{
tmpParabolaA=0;
}
tmpParabolaA++;
FruitXA=parabolaA.parabolaPoint[tmpParabolaA].x;
FruitYA=parabolaA.parabolaPoint[tmpParabolaA].y;
glutPostRedisplay();
glutTimerFunc(300,OntimerA,1);
}
voidOntimerB(intvalue)//定时器的回调函数
{
if(tmpParabolaB>=parabolaB.parabolaIndex-1)
{
tmpParabolaB=0;
}
tmpParabolaB++;
FruitXB=parabolaB.parabolaPoint[tmpParabolaB].x;
FruitYB=parabolaB.parabolaPoint[tmpParabolaB].y;
glutPostRedisplay();
glutTimerFunc(300,OntimerB,1);
}
voidOntimerC(intvalue)//定时器的回调函数
{
if(tmpParabolaC>=parabolaC.parabolaIndex-1)
{
tmpParabolaC=0;
}
tmpParabolaC++;
FruitXC=parabolaC.parabolaPoint[tmpParabolaC].x;
FruitYC=parabolaC.parabolaPoint[tmpParabolaC].y;
glutPostRedisplay();
glutTimerFunc(300,OntimerC,1);
}
/*GLfloatCreatpoints(GLfloatx0,GLfloaty0,GLfloatx1,GLfloaty1,GLfloatx2,GLfloaty2)
{
x0=-rand()/(RAND_MAX+1.0);
y0=0.0;
x1=0.0;
y1=rand()/(RAND_MAX+1.0);
x2=x0;
y2=0.0;
}*/
voidwait(intsecond)
{
clock_tend;
end=clock()+second*CLOCKS_PER_SEC;
while(clock() NULL; } voidIdle() { mySleep(sleepTime); } voidmySleep(intmilisecond) { Sleep(milisecond); fruitBlade.sampleFadeBlade(); } 7.增加刀锋效果: voidMouseMove(intx,inty)//鼠标执行函数 { if(angle>=360) angle=0; angle+=(-0.002);//角度变化函数(数值±表旋转方向) glutPostRedisplay();//角度改变即重新绘制 } 8.设置屏幕切换效果 voidloadtexture() { QImagebuf,texturebuf; if(! buf.load("./images/background.jpg")) { printf("textureerror! ! ! \n"); } texturebuf=QGLWidget: : convertToGLFormat(buf); glGenTextures(1,&texturearray[0]); glBindTexture(GL_TEXTURE_2D,texturearray[0]); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,texturebuf.width(), texturebuf.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,texturebuf.bits()); } voidloadtextureOther() { QImagebuf,texturebuf; if(! buf.load("./images/ad.jpg")) { printf("textureerror! ! ! \n"); } texturebuf=QGLWidget: : convertToGLFormat(buf); glGenTextures(1,&texturearray[0]); glBindTexture(GL_TEXTURE_2D,texturearray[0]); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,texturebuf.width(), texturebuf.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,texturebuf.bits()); } 9.导入半个水果模型,设置当刀锋接触水果时把水果切成两半的效果: t3DModelappleModel; t3DModelmeloModel,melorightModel,meloleftModel; t3DModelnimengModel,nimengleftModel,nimengrightModel; t3DModelhalfappleModel; FruitObjectappleObject; FruitObjectmeloObject[6],melorightObject[6],meloleftObject[6]; FruitObjectnimengObject,nimengrightObject,nimengleftObject; FruitObjecthalfappleObject; boolisSplit1=false; boolisSplit2=false; POINT3DGLPoint; CLoad3DSmeloLoad3DS; if(! meloLoad3DS.Import3DS(&meloModel,"./3Dmodel/melo.3ds")) { printf("load3dsfileerror! \n"); } for(inti=0;i<6;i++) { meloObject[i].get3Dmodel(&meloModel); } loadTexture(); CLoad3DSnimengLoad3DS; if(! nimengLoad3DS.Import3DS(&nimengModel,"./3Dmodel/nimeng.3DS")) { printf("loadfileerror! \n"); } nimengObject.get3Dmodel(&nimengModel); loadTexture(); CLoad3DShalfappleLoad3DS; if(! halfappleLoad3DS.Import3DS(&halfappleModel,"./3Dmodel/left_half_lemon.3DS")) { printf("loadfileerror! \n"); } halfappleObject.get3Dmodel(&halfappleModel); loadTexture(); CLoad3DSnimengleftLoad3Ds; if(! nimengleftLoad3Ds.Import3DS(&nimengleftModel,"./3dmodel/left_half_lemon.3DS")) { printf("Loadthe3dmodelerror! ! "); } nimengleftObject.get3Dmodel(&nimengleftModel); loadTexture(); CLoad3DSnimengrightLoad3Ds; if(! nimengrightLoad3Ds.Import3DS(&nimengrightModel,"./3dmodel/right_half_lemon.3DS")) { printf("Loadthe3dmodelerror! ! "); } nimengrightObject.get3Dmodel(&nimengrightModel); loadTexture(); CLoad3DSmeloleftLoad3Ds; if(! meloleftLoad3Ds.Import3DS(&meloleftModel,"./3dmodel/left_half_melo.3DS")) { printf("Loadthe3dmodelerror! ! "); } for(inti=0;i<6;i++) { meloleftObject[i].get3Dmodel(&meloleftModel); } loadTexture(); CLoad3DSmelorightLoad3Ds; if(! melorightLoad3Ds.Import3DS(&melorightModel,"./3dmodel/right_half_melo.3DS")) { printf("Loadthe3dmodelerror! ! "); } for(inti=0;i<6;i++) { melorightObject[i].get3Dmodel(&melorightModel); } loadTexture(); glutTimerFunc(80,onTime,1); if(isSplit1==true) { nimengleftObject.draw3DModel(fruitX-0.1,fruitY-0.1,-0.5); nimengrightObject.draw3DModel(fruitX+0.1,fruitY+0.1,-0.5); } else { nimengObject.draw3DModel(fruitX,fruitY,-0.5); } if(fruitY<-0.6) { isSplit1=false; } if(isSplit2==true) { for(inti=0;i<6;i++) { meloleftObject[i].draw3DModel(meloX-0.1*i,meloY-0.1*i,-0.5);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 水果忍者 水果 设计 报告