为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > opengl实现推箱子游戏

opengl实现推箱子游戏

2021-10-15 7页 doc 284KB 10阅读

用户头像 个人认证

simle

我是一线教师 有丰富的 教学经验

举报
opengl实现推箱子游戏------------------------------------------作者xxxx------------------------------------------日期xxxxopengl实现推箱子游戏【精品文档】【精品文档】【精品文档】【精品文档】【精品文档】【精品文档】共分为4个.h文件和5个.cpp文件,map.h,map.cpptexture.h,texture.cpptextview.h,textview.cpp#include#include#include#include<>#include<>#...
opengl实现推箱子游戏
------------------------------------------作者xxxx------------------------------------------日期xxxxopengl实现推箱子游戏【精品文档】【精品文档】【精品文档】【精品文档】【精品文档】【精品文档】共分为4个.h文件和5个.cpp文件,map.h,map.cpptexture.h,texture.cpptextview.h,textview.cpp#include#include#include#include<>#include<>#include""#include""#include""#include""#pragmacomment(linker,"/subsystem:\"Windows\"/entry:\"mainCRTStartup\"")Texturetexture;//文理加载类Mapmap;//地图加载类KeyListenerkeylistener;//键盘监听事件类TextViewtextview;int*image;int**mp;intwindow;//窗口intis_pass=0;//是否过关标志int*pass=&is_pass;intlevel=1;//关卡int*lv=&level;intpre_lv=1;//颜色的RGB值intblack[3]={0,0,0};intwhite[3]={255,255,255};intorange[3]={255,128,0};//窗口大小变化时调用的函数voidChangeSize(GLsizeiw,GLsizeih){if(h==0){h=1;}glViewport(0,0,w,h);//定义视口大小,宽高一致intwidth=550;intheight=550;glMatrixMode(GL_PROJECTION);//重置坐标系统,使投影变换复位glLoadIdentity();//将当前的用户坐标系的原点移到了屏幕中心GLfloataspect;if(w<=h){aspect=(GLfloat)h/w;glOrtho(0,width,0,height*aspect,0,height);}elseif(w>h){aspect=(GLfloat)w/h;glOrtho(0,width*aspect,0,height,0,width);}}voiddisplay_text(){glColor3ub(orange[0],orange[1],orange[2]);glRasterPos2i(250,570);//起始位置("推箱子");//输出的字符串glRasterPos2i(400,570);charc[10]="第";chard[5];sprintf(d,"%d关",level);strcat(c,d);(c);glRasterPos2i(120,80);("1、ESC键退出游戏");glRasterPos2i(120,60);("2、BackSpace后退");glRasterPos2i(120,40);("3、PageUp、PageDown切换关卡");glRasterPos2i(120,20);("4、键盘上、下、左、右键控制方向");}//画长方形voiddraw_rect(intleftX,intleftY){glBegin(GL_POLYGON);glColor3ub(black[0],black[1],black[2]);glVertex2d(leftX,leftY);//左下角glVertex2d(leftX+100,leftY);//右下角glVertex2d(leftX+100,leftY+100);//右上角glVertex2d(leftX,leftY+100);//左上角glEnd();//结束画线}voiddrawmap(){glColor3ub(white[0],white[1],white[2]);//清理颜色,为黑色,(也可认为是背景颜色)glEnable(GL_TEXTURE_2D);for(inti=50;i<500;i+=30){for(intj=100;j<550;j+=30){inty=(i-50)/30;intx=14-(j-100)/30;intpos=mp[x][y];if(pos==6){(x,y);}texture(image[pos],i,j);}}display_text();if(pre_lv!=level){pre_lv=level;draw_rect(400,570);}//glutSwapBuffers();glFlush();if(is_pass){MessageBox(NULL,"恭喜过关","提示",0);is_pass=0;level++;map(level);();//保留原地图}}voidload_map_and_picture(){mp=newint*[15];for(inti=0;i<15;i++){mp[i]=newint[15];for(intj=0;j<15;j++)mp[i][j]=0;}image=newint[10];for(inti=0;i<10;i++)image[i]=0;//加载地图(mp);map(level);//键盘相应事件map(mp);level(lv);window(window);flag(pass);//加载图片image(image);texture();}intmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(550,600);//设置窗口大小glutInitWindowPosition(100,100);//设置初始窗口的位置window=glutCreateWindow("推箱子");glutDisplayFunc(&drawmap);load_map_and_picture();glutIdleFunc(&drawmap);//对键盘事件的响应glutSpecialFunc();glutKeyboardFunc();//参数为一个函数,当窗口大小改变时会被调用glutReshapeFunc(ChangeSize);glutMainLoop();}2、keylistener.h#include#include#include#include<>classKeyListener{public:KeyListener();~KeyListener();staticvoidSpecialKeys(GLintkey,GLintx,GLinty);//键盘的上下左右键staticvoidkeyPressed(unsignedcharkey,intx,inty);//键盘响应事件staticvoidget_man_location(intx,inty);staticvoidget_window(intwnd);staticvoidget_map(int**map);staticvoidmove(intdir);//移动一步staticboolis_pass();//判断是否过关staticvoidget_pass_flag(int*ispass);staticvoidget_level(int*lv);staticvoidstay_origin_map();staticintwindow;staticintdir_x[4];staticintdir_y[4];staticintdirection;//当前方向staticintmanX,manY;//人所处的位置staticint**mp;staticintmap[15][15];staticint*level;staticint*pass;}#include""#include""#include<>#include<>#include#defineESCAPE27#defineBACKSPACE8#defineUP0#defineDOWN1#defineLEFT2#defineRIGHT3intKeyListener::window=0;//上下左右intKeyListener::dir_x[4]={-1,1,0,0};intKeyListener::dir_y[4]={0,0,-1,1};intKeyListener::direction=1;//当前方向intKeyListener::manX=0;intKeyListener::manY=0;int**KeyListener::mp=NULL;intKeyListener::map[15][15]={0};int*KeyListener::level=NULL;int*KeyListener::pass=NULL;MapMAP;std::stacks;KeyListener::KeyListener(){}KeyListener::~KeyListener(){}voidKeyListener::keyPressed(unsignedcharkey,intx,inty){switch(key){case'':break;caseESCAPE:glutDestroyWindow(window);exit(0);break;caseBACKSPACE://后退一步{if(()==1)break;intcur_dir=();();//当前坐标的方向//当前坐标intmx=();();intmy=();();intcur_picture=();();//当前坐标cur_dir方向的图片intnext_picture=();();//前一个坐标以前图片intpre_dir=();intdx=dir_x[cur_dir];intdy=dir_y[cur_dir];mp[mx][my]=cur_picture;mp[mx+dx][my+dy]=next_picture;mp[mx-dx][my-dy]=pre_dir+5;manX=mx-dx;manY=my-dy;break;}default:break;}}//键盘的上下左右键voidKeyListener::SpecialKeys(GLintkey,GLintx,GLinty){switch(key){caseGLUT_KEY_UP://向上移动{direction=UP;move(direction);break;}caseGLUT_KEY_DOWN://向下移动{direction=DOWN;move(direction);break;}caseGLUT_KEY_LEFT://向左移动{direction=LEFT;move(direction);break;}caseGLUT_KEY_RIGHT://向右移动{direction=RIGHT;move(direction);break;}caseGLUT_KEY_PAGE_UP://下一关{(*level)++;if((*level)>13){(*level)--;break;}//加载地图(mp);map(*level);stay_origin_map();break;}caseGLUT_KEY_PAGE_DOWN://上一关{(*level)--;if((*level)<1){(*level)++;break;}//加载地图(mp);map(*level);stay_origin_map();break;}default:break;}}voidKeyListener::move(intdir){intx=manX;inty=manY;intdx=dir_x[dir];intdy=dir_y[dir];manX+=dx;manY+=dy;intorigin_picture=mp[manX][manY];intnext_picture=mp[manX+dx][manY+dy];//dir方向是箱子,箱子dir方向是墙或箱子if((mp[manX][manY]==4||mp[manX][manY]==3)&&(mp[manX+dx][manY+dy]==2||mp[manX+dx][manY+dy]==3||mp[manX+dx][manY+dy]==4)){manX-=dx,manY-=dy;return;}//dir方向是墙if(mp[manX][manY]==2){manX-=dx,manY-=dy;return;}//dir方向是草地或者目的地if(mp[manX][manY]==1||mp[manX][manY]==9){mp[manX][manY]=dir+5;if(map[x][y]==9)//原来位置是目的地mp[x][y]=9;elsemp[x][y]=1;//原来位置是草地}//dir方向是箱子,箱子dir方向是草地if((mp[manX][manY]==4||mp[manX][manY]==3)&&mp[manX+dx][manY+dy]==1){mp[manX][manY]=dir+5;if(mp[manX][manY]==3)//若是移动已达目的地的箱子,原箱子位置值为9mp[manX][manY]=9;if(map[x][y]==9)//原来位置是目的地mp[x][y]=9;else//原来位置是草地mp[x][y]=1;mp[manX+dx][manY+dy]=4;//草地位置变箱子}//dir方向是箱子,箱子dir方向是目的地if((mp[manX][manY]==4||mp[manX][manY]==3)&&mp[manX+dx][manY+dy]==9){mp[manX][manY]=dir+5;if(mp[manX][manY]==3)//若是移动一大目的地的箱子,原箱子位置值为9mp[manX][manY]=9;if(map[x][y]==9)//原来位置是目的地mp[x][y]=9;else//原来位置是草地mp[x][y]=1;mp[manX+dx][manY+dy]=3;//目的地位置变箱子}if(is_pass())*pass=1;//每走一步保存当前位置的坐标、以前的图片、(next_picture);(origin_picture);(manY);(manX);(dir);}voidKeyListener::get_man_location(intx,inty){manX=x;manY=y;}voidKeyListener::get_window(intwnd){window=wnd;}voidKeyListener::get_level(int*lv){level=lv;}voidKeyListener::get_map(int**Mp){mp=Mp;stay_origin_map();}voidKeyListener::stay_origin_map(){while(!())();direction=1;(direction);for(inti=0;i<15;i++)for(intj=0;j<15;j++){map[i][j]=mp[i][j];if(map[i][j]==3)map[i][j]=9;}}voidKeyListener::get_pass_flag(int*ispass){pass=ispass;}boolKeyListener::is_pass(){intp=0;for(inti=0;i<15;i++)for(intj=0;j<15;j++){if(mp[i][j]==4)p++;}if(p==0)returntrue;returnfalse;}map.hclassMap{public:int**mp;Map();~Map();voidget_map(char*filepath);voidload_map(intlevel);voidgetmap(int**map);};map.cpp#include#include<>#include<>#include""charroot_directory[100]="F:\\source\\";//地图、图片根目录Map::Map(){}Map::~Map(){delete[]mp;}voidMap::get_map(char*filepath){charbuffer[1024]="";FILE*fp=fopen(filepath,"r");if(fp==NULL){MessageBox(NULL,"地图加载失败","ERROR",0);return;}introw=0;while(!feof(fp)){char*ch=fgets(buffer,1024,fp);if(ch==NULL)return;for(inti=0;i<15;i++)mp[row][i]=buffer[i]-48;row++;}}voidMap::load_map(intlevel){charpath[100]="";strcpy(path,root_directory);chard[6];itoa(level,d,10);strcat(d,".txt");strcat(path,d);get_map(path);}voidMap::getmap(int**map){mp=map;}textview.hclassTextView{public:TextView();~TextView();voiddrawString(char*str);};textview.cpp#include""#include#include#include<>TextView::TextView(){}TextView::~TextView(){}voidTextView::drawString(char*str){intlen,i;wchar_t*wstring;HDChDC=wglGetCurrentDC();GLuintlist=glGenLists(1);//计算字符的个数//如果是双字节字符的(比如中文字符),两个字节才算一个字符//否则一个字节算一个字符len=0;for(i=0;str[i]!='\0';++i){if(IsDBCSLeadByte(str[i]))++i;++len;}//将混合字符转化为宽字符wstring=(wchar_t*)malloc((len+1)*sizeof(wchar_t));MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,str,-1,wstring,len);wstring[len]=L'\0';//逐个输出字符for(i=0;i#include#include<>#include""#pragmacomment(")charroot[100]="F:\\source\\";//地图、图片根目录Texture::Texture(){}Texture::~Texture(){delete[]image;}intTexture::get_texture(char*filename){BITMAPbm;GLuintidTexture;CImageimg;//需要头文件HRESULThr=(filename);if(!SUCCEEDED(hr))//文件加载失败{MessageBox(NULL,"图片加载失败","ERROR",0);returnNULL;}HBITMAPhbmp=img;if(!GetObject(hbmp,sizeof(bm),&bm))return0;glGenTextures(1,&idTexture);glBindTexture(GL_TEXTURE_2D,idTexture);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);//glPixelStoref(GL_PACK_ALIGNMENT,1);glTexImage2D(GL_TEXTURE_2D,0,3,,,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,);//这里不是GL_RGBDeleteObject(hbmp);returnidTexture;}voidTexture::display_texture(intimg,intx,inty){glBindTexture(GL_TEXTURE_2D,img);glBegin(GL_QUADS);glTexCoord2f(0.0f,0.0f);glVertex3d(x,y,0);/*glVertex3f(-1.0f,-1.0f,1.0f);*/glTexCoord2f(1.0f,0.0f);glVertex3d(x+30,y,0);/*glVertex3f(1.0f,-1.0f,1.0f);*/glTexCoord2f(1.0f,1.0f);glVertex3d(x+30,y+30,0);/*glVertex3f(1.0f,1.0f,1.0f);*/glTexCoord2f(0.0f,1.0f);glVertex3d(x,y+30,0);/*glVertex3f(-1.0f,1.0f,1.0f);*/glEnd();}voidTexture::load_texture(){charpath[100]="";for(inti=0;i<10;i++){strcpy(path,root);chard[6];itoa(i,d,10);strcat(d,".bmp");strcat(path,d);image[i]=get_texture(path);}}voidTexture::get_image(int*img){image=img;}
/
本文档为【opengl实现推箱子游戏】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索