opengl 3D迷宫 C实现 源代码之欧阳历创编.docx
《opengl 3D迷宫 C实现 源代码之欧阳历创编.docx》由会员分享,可在线阅读,更多相关《opengl 3D迷宫 C实现 源代码之欧阳历创编.docx(14页珍藏版)》请在冰豆网上搜索。
opengl3D迷宫C实现源代码之欧阳历创编
#include"stdafx.h"
时间:
2021.02.09
创作人:
欧阳历
#include
#include
#include
#include
#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);//ʹÎÆÀí²»±äÐÎ
}
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=x1;*ny=y;break;
case1:
*nx=x;*ny=y+1;break;
case2:
*nx=x+1;*ny=y;break;
case3:
*nx=x;*ny=y1;break;
default:
break;
}
returnwall(*nx,*ny);
}
booldiagnal(intx,inty,intw,int*nx,int*ny){
switch(w){
case0:
*nx=x1;*ny=y1;break;
case1:
*nx=x1;*ny=y+1;break;
case2:
*nx=x+1;*ny=y+1;break;
case3:
*nx=x+1;*ny=y1;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;yfor(x=0;xif(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.0fbf)&&wall(x+1,y)){
px=(float)(x)+1.0fbf;
h++;
}
if(py>y+1.0fbf&&wall(x,y+1)){
py=(float)(y)+1.0fbf;
h++;
}
if(pxpx=(float)(x)+bf;
h++;
}
if(pypy=(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{}
}//ÊÍ·Å°´¼üºó¾Í½øÈë¿ÕÏÐ״̬£¬Èç¹û¿ÕÏÐ״̬²»Ò»Ö±Öظ´»æͼ£¬¾Í»á»ÃæÍ£ÖÍ¡£´Î·½·¨È±µãÊÇ¿ªÏúºÜ´ó
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();
}
时间:
2021.02.09
创作人:
欧阳历