为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

《水果忍者》设计报告

2018-03-02 18页 doc 42KB 29阅读

用户头像

is_601191

暂无简介

举报
《水果忍者》设计报告《水果忍者》设计报告 福建工程学院国脉信息学院 《水果忍者》课程设计报告 题目: 水果忍者游戏开发 专业: 电子信息工程 班级: 电子1001班 学号: 1030010145 姓名: 郭 龙 彬 指导教师:陈灏、韩海峰 完成日期: 2013 年 04 月 07 日 水果忍者游戏开发 设计题目 周次: 2 实验时间 2013年3月25日~4月07日 熟悉C/C++语言 课程设计要求 能够用C/C++语言解决一个实际问题 掌握编程思路 导入茶壶模型、设置旋转效果、插入水果忍者背景、导入水果模型、增加水果...
《水果忍者》设计报告
《水果忍者》设计 福建学院国脉信息学院 《水果忍者》课程设计报告 目: 水果忍者游戏开发 专业: 电子信息工程 班级: 电子1001班 学号: 1030010145 姓名: 郭 龙 彬 指导教师:陈灏、韩海峰 完成日期: 2013 年 04 月 07 日 水果忍者游戏开发 设计题目 周次: 2 实验时间 2013年3月25日~4月07日 熟悉C/C++语言 课程设计要求 能够用C/C++语言解决一个实际问题 掌握编程思路 导入茶壶模型、设置旋转效果、插入水果忍者背景、导入水果模型、增加水果种类、设置水果按照设定好的抛物线的轨迹运动、增加刀锋 课程设计过程 效果、设置屏幕切换效果、导入半个水果模型,设置当刀锋接触水果时把水果切成两半的效果、添加水果忍者背景音乐‎‎。 《嵌入式系统》项目课程,OpenGL编程基础 参考资料 此次实训最大的收获不是我学习到了多少知识而是这几天‎‎实训给我的感悟:首先是心态。一定要有一个积极的心态,独立解决问题的意识,培养扎实基础的认识。有自己的东西,有自己的付出,才会有程序运行成功时的喜悦和小自豪,这样也有助于培养自己的兴趣。要时刻牢记态度决定一切。其次是兴趣,感觉学习工作中兴趣很关键,只是一个引发人积极性的问题,有了兴趣就自觉了,效率自然就高了。再次要敢于尝试和挑战。不要安于现成的程序,而且不要害怕失败,在程序调试的过程中这点尤为重要,“发现出问题然后解决问题”是一个积累经验的过程,而且很高效。最后要不懈追求。对于源代码进行不断的完善,要尽可能的实现课题所要求的功能。对于初学者或者开发较少的人来说,大量大 设计与体写程序还是有必要的,但同时要注意思考,理解其实现的内在意义。还可以自己添加一些有意义的功能来实现。当看到自己编写的程序正常运行时,兴趣也会随之而来,乐此不会 疲,形成一个良性循环。 两周的学习,有过艰辛,有过喜悦,放弃过,坚持过。两周的学习让自己真正的过了把瘾,自己从一个玩游戏的角‎‎色到开发游戏的角色。角色的变换,心境的变化。我们从一开始的照搬照抄敲着看似是自己的代码,到后来自己思考游戏思‎‎路,敲着自己的代码。学习中遇到了很多的问题,通过小组的讨论解决。让我认识到团结的重要性,有时并不是一人不能解决的问题,放到团体中,大家集思广益,每个人一点思路,问题就给放小了,那就容易解决了。 两周的时间虽说有点短,不过这两周让我学到了很多东西,让我了解了嵌入式,知道了以后的大致出路。这次实训让我学会了规划,制定计划,每天的学习都有迹可寻‎‎。 2 , 课程过程及其程序: 1.导入茶壶模型 #include #include //函数声明 void Display(); //定义调用函数 void Reshape(int w,int h); //定义窗口重绘函数 GLfloat angle=0; //定义旋转角度 void MouseMove(int x,int y); //定义鼠标事件函数 int main(int argc,char *argv[]) { glutInit(&argc,argv); //初始化函数 glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); glutInitWindowPosition(150,150); //窗口位置 glutInitWindowSize(800,600); //窗口大小 glutCreateWindow("Good Job"); //窗口创建并命名 glutDisplayFunc(Display); //回调函数 glutMotionFunc(MouseMove); //鼠标事件函数 glutReshapeFunc(Reshape); //窗口重绘函数(移动与变化时) glutMainLoop(); //循环函数 return 0; } void MouseMove(int x,int y) //鼠标执行函数 { if(angle >= 360) angle = 0; angle += 0.001; //角度变化函数(数值?表旋转方向) glutPostRedisplay(); //角度改变、重新绘制 } void Display() //调用函数 { 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); //平面颜色(三基色) 3 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.设置旋转效果 void Display() //调用函数 { 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.插入水果忍者背景 void LoadTexture() { QImage buf,textureBuf; //图像准备 if(!buf.load("./images/background.jpg")) { printf("Load error!\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:边框的宽度 } void OpenGLInit() 4 { glEnable(GL_TEXTURE_2D); //启动纹理贴图功能 } 4.导入水果模型 CLoad3DS AppleLoad3DS; //读取苹果3D模型 if(!AppleLoad3DS.Import3DS(&AppleModel,"./3dmodel/apple.3ds")) { printf("Load 3DS File Error!\n"); } AppleObject.get3Dmodel(&AppleModel); 5.增加水果种类 CLoad3DS AppleLoad3DS; //读取苹果3D模型 if(!AppleLoad3DS.Import3DS(&AppleModel,"./3dmodel/apple.3ds")) { printf("Load 3DS File Error!\n"); } AppleObject.get3Dmodel(&MeloModel); CLoad3DS MeloLoad3DS; //读取西瓜3D模型 if(!MeloLoad3DS.Import3DS(&MeloModel,"./3dmodel/melo.3ds")) { printf("Load 3DS File Error!\n"); } AppleObject.get3Dmodel(&AppleModel); MeloObject.get3Dmodel(&MeloModel); glutDisplayFunc(Display); //回调函数 glutMotionFunc(MouseMove); //鼠标事件函数 glutReshapeFunc(Reshape); //窗口重绘函数(移动与变化时) glutMainLoop(); //循环函数 return 0; } 6.设置水果按照设定好的抛物线的轨迹运动 PARABOLA_THREEPOINT Threepoints[11]; Parabola parabola(-0.8,-0.45,0.0,0.0,0.8,-0.45); Parabola parabolaA(-0.1,-0.8,0.0,0.5,0.1,-0.8); Parabola parabolaB(0.8,-0.45,0.0,0.0,-0.8,-0.45); Parabola parabolaC(-0.5,-1.0,1.0,0.5,2.0,-1.0); 5 int main(int argc, char *argv[]) { parabola.drawParabola(); parabolaA.drawParabola(); parabolaB.drawParabola(); parabolaC.drawParabola(); glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); void Ontimer(int value)//定时器的回调函数 { if(tmpParabola>=parabola.parabolaIndex-1) { tmpParabola=0; } tmpParabola++; FruitX = parabola.parabolaPoint[tmpParabola].x; FruitY = parabola.parabolaPoint[tmpParabola].y; glutPostRedisplay(); glutTimerFunc(300,Ontimer,1); } void OntimerA(int value)//定时器的回调函数 { if(tmpParabolaA>=parabolaA.parabolaIndex-1) { tmpParabolaA=0; } tmpParabolaA++; FruitXA = parabolaA.parabolaPoint[tmpParabolaA].x; FruitYA= parabolaA.parabolaPoint[tmpParabolaA].y; glutPostRedisplay(); glutTimerFunc(300,OntimerA,1); } void OntimerB(int value)//定时器的回调函数 { if(tmpParabolaB>=parabolaB.parabolaIndex-1) { tmpParabolaB=0; } tmpParabolaB++; 6 FruitXB = parabolaB.parabolaPoint[tmpParabolaB].x; FruitYB= parabolaB.parabolaPoint[tmpParabolaB].y; glutPostRedisplay(); glutTimerFunc(300,OntimerB,1); } void OntimerC(int value)//定时器的回调函数 { if(tmpParabolaC>=parabolaC.parabolaIndex-1) { tmpParabolaC=0; } tmpParabolaC++; FruitXC = parabolaC.parabolaPoint[tmpParabolaC].x; FruitYC = parabolaC.parabolaPoint[tmpParabolaC].y; glutPostRedisplay(); glutTimerFunc(300,OntimerC,1); } /*GLfloat Creatpoints(GLfloat x0,GLfloat y0,GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2) { x0=-rand()/(RAND_MAX+1.0); y0=0.0; x1=0.0; y1=rand()/(RAND_MAX+1.0); x2=x0; y2=0.0; }*/ void wait(int second) { clock_t end; end = clock()+second*CLOCKS_PER_SEC; while(clock()= 360) angle = 0; angle += (-0.002); //角度变化函数(数值?表旋转方向) glutPostRedisplay(); //角度改变即重新绘制 } 8.设置屏幕切换效果 void loadtexture() { QImage buf,texturebuf; if(!buf.load("./images/background.jpg")) { printf("texture error!!!\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()) ; } void loadtextureOther() { QImage buf,texturebuf; if(!buf.load("./images/ad.jpg")) 8 { printf("texture error!!!\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.导入半个水果模型,设置当刀锋接触水果时把水果切成两半的效果: t3DModel appleModel; t3DModel meloModel,melorightModel,meloleftModel; t3DModel nimengModel,nimengleftModel,nimengrightModel; t3DModel halfappleModel; FruitObject appleObject; FruitObject meloObject[6],melorightObject[6],meloleftObject[6]; FruitObject nimengObject,nimengrightObject,nimengleftObject; FruitObject halfappleObject; bool isSplit1 =false; bool isSplit2 =false; POINT3D GLPoint; CLoad3DS meloLoad3DS; if(!meloLoad3DS.Import3DS(&meloModel,"./3Dmodel/melo.3ds")) { printf("load 3ds file error!\n"); } for(int i=0;i<6;i++) { meloObject[i].get3Dmodel(&meloModel); } loadTexture(); 9 CLoad3DS nimengLoad3DS; if(!nimengLoad3DS.Import3DS(&nimengModel,"./3Dmodel/nimeng.3DS")) { printf("load file error!\n"); } nimengObject.get3Dmodel(&nimengModel); loadTexture(); CLoad3DS halfappleLoad3DS; if(!halfappleLoad3DS.Import3DS(&halfappleModel,"./3Dmodel/left_half_lemon.3DS")) { printf("load file error!\n"); } halfappleObject.get3Dmodel(&halfappleModel); loadTexture(); CLoad3DS nimengleftLoad3Ds; if(!nimengleftLoad3Ds .Import3DS(&nimengleftModel,"./3dmodel/left _half_lemon.3DS")) { printf("Load the 3dmodel error!!"); } nimengleftObject.get3Dmodel(&nimengleftModel); loadTexture(); CLoad3DS nimengrightLoad3Ds; if(!nimengrightLoad3Ds .Import3DS(&nimengrightModel,"./3dmodel/ri ght_half_lemon.3DS")) { printf("Load the 3dmodel error!!"); } nimengrightObject.get3Dmodel(&nimengrightModel); loadTexture(); CLoad3DS meloleftLoad3Ds; if(!meloleftLoad3Ds .Import3DS(&meloleftModel,"./3dmodel/left_hal f_melo.3DS")) { printf("Load the 3dmodel error!!"); } for (int i=0;i<6;i++) { 10 meloleftObject[i].get3Dmodel(&meloleftModel); } loadTexture(); CLoad3DS melorightLoad3Ds; if(!melorightLoad3Ds .Import3DS(&melorightModel,"./3dmodel/right_half_melo.3DS")) { printf("Load the 3dmodel error!!"); } for (int i=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(int i=0;i<6;i++) { meloleftObject[i].draw3DModel(meloX-0.1*i,meloY-0.1*i,-0.5); melorightObject[i].draw3DModel(meloX+0.1*i,meloY+0.1*i,-0.5); } } else 11 { for(int i=0;i<6;i++) { meloObject[i].draw3DModel(-fruitX,fruitY,-0.5); meloObject[i].draw3DModel(-fruitX+0.1*i,fruitY-0.2*i,-0.5); meloObject[i].draw3DModel(-fruitX-0.2*i,fruitY+0.3,-0.5); meloObject[i].draw3DModel(-fruitX+0.3,fruitY-0.6,-0.5); meloObject[i].draw3DModel(-fruitX-0.1,fruitY,-0.5); meloObject[i].draw3DModel(-fruitX+0.3,fruitY-0.1,-0.5); } } fruitBlade.drawBlade(); glutSwapBuffers(); } void mouseMove(int x, int y) { fruitBlade.mousePosX = x; fruitBlade.mousePosY = y; GLPoint = screenToGL(x,y); if(fabs(GLPoint.x - fruitX)<=0.2&&fabs(GLPoint.y - fruitY)<=0.2) { isSplit1 =true; } if(fabs(GLPoint.x - meloX)<=0.2&&fabs(GLPoint.y - meloY)<=0.2) { isSplit2 =true; } glutPostRedisplay(); } 10.添加水果忍者背景音乐 #include QSound fruitMusic("./music/menu.WAV"); int main(int argc, char *argv[]) { fruitMusic.setLoops(1); fruitMusic.play(); } 12 13
/
本文档为【《水果忍者》设计报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索