opengl 3D迷宫 C实现 源代码之欧阳历创编.docx

上传人:b****2 文档编号:20103616 上传时间:2023-04-25 格式:DOCX 页数:14 大小:17.11KB
下载 相关 举报
opengl 3D迷宫 C实现 源代码之欧阳历创编.docx_第1页
第1页 / 共14页
opengl 3D迷宫 C实现 源代码之欧阳历创编.docx_第2页
第2页 / 共14页
opengl 3D迷宫 C实现 源代码之欧阳历创编.docx_第3页
第3页 / 共14页
opengl 3D迷宫 C实现 源代码之欧阳历创编.docx_第4页
第4页 / 共14页
opengl 3D迷宫 C实现 源代码之欧阳历创编.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

opengl 3D迷宫 C实现 源代码之欧阳历创编.docx

《opengl 3D迷宫 C实现 源代码之欧阳历创编.docx》由会员分享,可在线阅读,更多相关《opengl 3D迷宫 C实现 源代码之欧阳历创编.docx(14页珍藏版)》请在冰豆网上搜索。

opengl 3D迷宫 C实现 源代码之欧阳历创编.docx

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;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.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(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{}

}//ÊÍ·Å°´¼üºó¾Í½øÈë¿ÕÏÐ״̬£¬Èç¹û¿ÕÏÐ״̬²»Ò»Ö±Öظ´»æͼ£¬¾Í»á»ÃæÍ£ÖÍ¡£´Î·½·¨È±µãÊÇ¿ªÏúºÜ´ó

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

创作人:

欧阳历

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1