openglD迷宫C实现源代码完整版.docx
- 文档编号:24671943
- 上传时间:2023-05-30
- 格式:DOCX
- 页数:14
- 大小:18.30KB
openglD迷宫C实现源代码完整版.docx
《openglD迷宫C实现源代码完整版.docx》由会员分享,可在线阅读,更多相关《openglD迷宫C实现源代码完整版.docx(14页珍藏版)》请在冰豆网上搜索。
openglD迷宫C实现源代码完整版
HUAsystemofficeroom【HUA16H-TTMS2A-HUAS8Q8-HUAH1688】
openglD迷宫C实现源代码
#include
usingnamespacestd;
voiddrawwalls(void);
voiddrawtop(void);
voiddrawball(void);
#defineIDM_APPLICATION_EXIT(101)
#defineIDM_APPLICATION_TEXTURE(102)
#defineIDM_APPLICATION_BANK(103)
#defineMAZE_HEIGHT(16)
#defineMAZE_WIDTH(16)
#defineSTARTING_POINT_X(13.5f);
#defineSTARTING_POINT_Y(1.5f);
#defineSTARTING_HEADING(90.0f);
floatplayer_x=STARTING_POINT_X;
floatplayer_y=STARTING_POINT_Y;
floatplayer_h=STARTING_HEADING;//player'sheading
floatplayer_s=0.0f;//forwardspeedoftheplayer
floatplayer_m=1.0f;//speedmultiplieroftheplayer
floatplayer_t=0.0f;//player'sturning(changeinheading)
floatplayer_b=0.0f;//viewpointbank(roll)
staticfloattexcoordX=0.0f;
intwalllist=0;
intmazelist=0;
intballlist=0;
intstatus=1;
boolsearchroute=false;
boolkeystate[4]={false,false,false,false};
charmazedata[MAZE_HEIGHT][MAZE_WIDTH]={
{'H','H','H','H','H','H','H','H','H','H','H','H','H','H','H','H'},
{'H','','','','','','','','H','','','','','','','H'},
{'H','','H','','H','H','H','','H','','H','','','','','H'},
{'H','','H','H','','','H','','H','H','','H','','H','','H'},
{'H','','','','','','H','','','','','','','H','','H'},
{'H','','H','H','H','H','H','H','H','H','','H','H','H','','H'},
{'H','','','','','','','','','','','','H','','','H'},
{'H','','H','H','H','H','H','','H','H','H','','H','H','H','H'},
{'H','','H','','','','H','','','','H','','','','','H'},
{'H','','','','H','H','H','H','H','H','H','','','','','H'},
{'H','','H','','','','H','','','','H','','','H','','H'},
{'H','','H','H','H','H','H','','H','H','H','H','','H','','H'},
{'H','','','','','','H','','','','','','','H','','H'},
{'H','','','H','H','','H','H','H','H','','H','H','H','','H'},
{'H','','','','H','','H','','','','','H','','','','H'},
{'H','H','H','H','H','H','H','H','H','H','H','H','H','','H','H'},
};
voidmyinit()
{
glClearColor(0.5f,0.5f,0.5f,0.0f);
glColor3f(1.0,1.0,1.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
walllist=glGenLists
(2);
mazelist=walllist+1;
balllist=walllist+2;
glNewList(walllist,GL_COMPILE);
drawwalls();
glEndList();
glNewList(mazelist,GL_COMPILE);
drawtop();
glEndList();
glNewList(balllist,GL_COMPILE);
drawball();
glEndList();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,1.0,0.1,60.0);
glMatrixMode(GL_MODELVIEW);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//ê1àí2±D
}
boolwall(intx,inty){
return(x>=0&&y>=0&&x =''); } boolonopen(intx,inty){ if(wall(x,y)){ return(mazedata[y][x]=='H'); } } voidcloseit(intx,inty){ if(onopen(x,y)) { mazedata[y][x]='X'; } } boolneighbor(intx,inty,intw,int*nx,int*ny){ switch(w){ case0: *nx=x-1;*ny=y;break; case1: *nx=x;*ny=y+1;break; case2: *nx=x+1;*ny=y;break; case3: *nx=x;*ny=y-1;break; default: break; } returnwall(*nx,*ny); } booldiagnal(intx,inty,intw,int*nx,int*ny){ switch(w){ case0: *nx=x-1;*ny=y-1;break; case1: *nx=x-1;*ny=y+1;break; case2: *nx=x+1;*ny=y+1;break; case3: *nx=x+1;*ny=y-1;break; default: break; } returnwall(*nx,*ny); } voiddw(intx,inty,intp){ intw=p; closeit(x,y); do{ intx2=0; inty2=0; if(neighbor(x,y,w,&x2,&y2)){ if(onopen(x2,y2)){ dw(x2,y2,(w+3)%4); } else{ if((w+1)%4==p) { return; } } } else{ floatfx; floatfy; if(diagnal(x,y,w,&x2,&y2)&&onopen(x2,y2)){ dw(x2,y2,(w+2)%4); } texcoordX=(texcoordX<0.5)1.0f: 0.0f; fx=(float)x+((w==1||w==2)1.0f: 0.0f); fy=(float)y+((w==0||w==1)1.0f: 0.0f); glTexCoord2f(texcoordX,0.0f); glVertex3f(fx,fy,0.0f); glTexCoord2f(texcoordX,1.0f); glVertex3f(fx,fy,1.0f); } w++;w%=4; }while(w! =p); return; } voiddrawwalls(){ glEnable(GL_TEXTURE_2D); glBegin(GL_QUAD_STRIP); glColor3f(1.0,1.0,1.0); glVertex3f(0.0f,0.0f,0.0f); glVertex3f(0.0f,0.0f,1.0f); dw(0,0,0); glEnd(); } voiddrawtop(){ intx,y; glBegin(GL_QUADS); for(y=0;y for(x=0;x if(wall(x,y)){ mazedata[y][x]='X'; glVertex3f(x+0.0f,y+0.0f,1.0f); glVertex3f(x+1.0f,y+0.0f,1.0f); glVertex3f(x+1.0f,y+1.0f,1.0f); glVertex3f(x+0.0f,y+1.0f,1.0f); } } } glEnd(); } voidforward(floatpx,floatpy,floatbf){ intx=((int)player_x); inty=((int)player_y); inth=0; if((px>x+1.0f-bf)&&wall(x+1,y)){ px=(float)(x)+1.0f-bf; h++; } if(py>y+1.0f-bf&&wall(x,y+1)){ py=(float)(y)+1.0f-bf; h++; } if(px px=(float)(x)+bf; h++; } if(py py=(float)(y)+bf; h++; } player_x=px; player_y=py; } voiddrawball() { glDisable(GL_TEXTURE_2D); glColor3f(1.0,0.0,0.0); glutSolidSphere(0.2f,15,15); } voidnavmaze1() { forward(player_x+player_s*(float)sin(player_h*3.14/180), player_y+player_s*(float)cos(player_h*3.14/180),0.2f); cout< player_h+=player_t; player_b=3*player_b/4+player_t/4; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glPushMatrix(); glRotatef(-90.0f,1.0f,0.0f,0.0f); glRotatef(player_h,0.0f,0.0f,1.0f); glTranslatef(-player_x,-player_y,-0.5f); glCallList(walllist); glPopMatrix(); } voidnavmaze2() { forward(player_x+player_m*player_s*(float)sin(player_h*3.14/180), player_y+player_m*player_s*(float)cos(player_h*3.14/180),0.2f); cout< player_h+=player_t; player_b=3*player_b/4+player_t/4; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glOrtho(-16.0,16.0,-16.0,16.0,-2.0,20.0); glPushMatrix(); glRotatef(90.0f,0.0f,0.0f,1.0f); glTranslatef(-MAZE_WIDTH/2,-MAZE_HEIGHT/2,-0.5f); glCallList(walllist); glCallList(mazelist); glPushMatrix(); glTranslatef(player_x,player_y,0.5f); glCallList(balllist); glPopMatrix(); glPopMatrix(); } voidmyDisplay() { if(status==1) { if(searchroute==true) { } elsenavmaze1(); } if(status==3) { if(searchroute==true) { } elsenavmaze2(); } glFlush(); glutSwapBuffers(); } voidmyReshape(intw,inth) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glutPostRedisplay(); } voidspecialKeys(intkey,intx,inty) { switch(key) { caseGLUT_KEY_LEFT: keystate[2]=true; player_t=-2.0f; break; caseGLUT_KEY_RIGHT: keystate[3]=true; player_t=2.0f; break; caseGLUT_KEY_UP: keystate[0]=true; player_s=0.01f; break; caseGLUT_KEY_DOWN: keystate[1]=true; player_s=-0.01f; break; default: break; } } voidkeyboard(unsignedcharkey,intx,inty) { switch(key) { case'1': status=1; break; case'3': status=3; break; default: break; } glutPostRedisplay(); } voidupSpecialKeyboard(intkey,intx,inty) { switch(key) { caseGLUT_KEY_LEFT: keystate[2]=false; player_t=0.0f; break; caseGLUT_KEY_RIGHT: keystate[3]=false; player_t=0.0f; break; caseGLUT_KEY_UP: keystate[0]=false; player_s=0.0f; break; caseGLUT_KEY_DOWN: keystate[1]=false; player_s=0.0f; break; default: break; } //glutPostRedisplay(); } voididle() { if(keystate[0]||keystate[1]||keystate[2]||keystate[3])glutPostRedisplay(); else{} }//êí·°′üoóíèD×′ì£è1D×′ì2ò±′í£íá-í£í£′··¨è±μêaúoü′ó voidmain(intargc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(500,500); glutCreateWindow("polygonmodeler"); glutDisplayFunc(myDisplay); myinit(); glutSpecialFunc(specialKeys); glutKeyboardFunc(keyboard); glutSpecialUpFunc(upSpecialKeyboard); glutIdleFunc(idle); glutMainLoop(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- openglD 迷宫 实现 源代码 完整版