《水果忍者》设计报告《水果忍者》设计报告
福建工程学院国脉信息学院
《水果忍者》课程设计报告
题目: 水果忍者游戏开发
专业: 电子信息工程
班级: 电子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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。