亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? maze.c

?? 詳細介紹c++編程
?? C
字號:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>

#define IDM_APPLICATION_EXIT    (101)
#define IDM_APPLICATION_TEXTURE (102)
#define IDM_APPLICATION_BANK    (103)
#define MAZE_HEIGHT (16)
#define MAZE_WIDTH  (16)
#define STARTING_POINT_X (1.5f);
#define STARTING_POINT_Y (1.5f);
#define STARTING_HEADING (90.0f);

HWND  hWND;
HDC   hDC;
HGLRC hGLRC;
float player_x = STARTING_POINT_X ;
float player_y = STARTING_POINT_Y ;
float player_h = STARTING_HEADING ;  // player's heading
float player_s = 0.0f;  // forward speed of the player
float player_m = 1.0f;  // speed multiplier of the player
float player_t = 0.0f;  // player's turning (change in heading)
float player_b = 0.0f;  // viewpoint bank (roll)
int   walllist=0;
int       mazelist=0;

void  spinmaze(HDC hDC);
void  entermaze(HDC hDC);
void  navmaze(HDC hDC);
void  (*idlefunc)(HDC hDC)=NULL;

// unfortunately due to the way the polygon walls are generated there
// are restrictions on what the wall/maze data can look like.  See below.
char *mazedata[MAZE_HEIGHT] = {
        "HHHHHHHHHHHHHHHH",
        "H       H      H",
        "H H HHH H H    H",
        "H HH  H HH H H H",
        "H     H      H H",
        "HHHHHHHHHH HHH H",
        "H           H  H",
        "H HHHHH HHH HHHH",
        "H H   H   H    H",
        "H   HHHHHHH    H",
        "H H   H   H  H H",
        "H HHHHH HHHH H H",
        "H     H      H H",
        "HH HH HHHH HHH H",
        "H   H H    H   H",
        "HHHHHHHHHHHHH HH",
};

int wall(int x,int y) {
        // true if the region at x,y is solid space that
        // should be surrounded by other solid space or polygon walls
        return (x>=0 && y>=0 && x<MAZE_WIDTH && y<MAZE_HEIGHT && ' ' != mazedata[y][x]);
}

int onopen(int x,int y){
        //  returns whether node x,y is on the depth-first search open list
        assert(wall(x,y));
        return(mazedata[y][x]=='H');
}
void closeit(int x,int y) {
        //  puts node x,y on the closed list
        assert(wall(x,y));
        assert(onopen(x,y));
        mazedata[y][x]= 'X';
}
int neighbor(int x,int y,int w,int *nx,int *ny){
        // if x,y has a neighbor in direction w then returns true
        switch(w) {
        case 0:
                *nx = x-1; *ny=y;   break;
        case 1:
                *nx = x;   *ny=y+1; break;
        case 2:
                *nx = x+1; *ny=y;   break;
        case 3:
                *nx = x;   *ny=y-1; break;
        default:
                assert(0);
        }
        return wall(*nx,*ny);
}
int diagnal(int x,int y,int w,int *nx,int *ny){
        switch(w) {
        case 0:
                *nx = x-1; *ny=y-1; break;
        case 1:
                *nx = x-1; *ny=y+1; break;
        case 2:
                *nx = x+1; *ny=y+1; break;
        case 3:
                *nx = x+1; *ny=y-1; break;
        default:
                assert(0);
        }
        return wall(*nx,*ny);
}
static float texcoordX=0.0f;
int dw(int x,int y,int p) {
        // the recursive draw wall routine that extends the quad strip
	int w=p;  // w is the current wall direction being considered
 	closeit(x,y);
    do{
		int x2,y2;
		if(neighbor(x,y,w,&x2,&y2)) {
			if(onopen(x2,y2)) {
				dw(x2,y2,(w+3)%4);
			}
            else {
				assert((w+1)%4 ==p); // or a loop or cluster exists
                return 1;
			}
		}
        else {
		    float fx;
		    float fy;
			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);  // useful iff using textures
            glVertex3f(fx,fy,0.0f);
            glTexCoord2f(texcoordX,1.0f);
            glVertex3f(fx,fy,1.0f);
		}
		w++;w%=4;
	}while (w!=p);
    return 1;
}

int drawwalls() {
	int dl;
    glNewList(dl=glGenLists(1),GL_COMPILE);
    glBegin(GL_QUAD_STRIP);
    glVertex3f(0.0f, 0.0f, 0.0f);
    glVertex3f(0.0f, 0.0f, 1.0f);
    dw(0,0,0);
    glEnd();
    glEndList();
    return dl;
}

int drawtop() {
        // draws the top and the bottom of the maze
        // which is useful for overhead views
        // The display list created here is only used for the intro
        // spinning bit.  No optimizations such as using quad strips
        // or combining adjacent polygons are done here.
	int x,y,dl;
    glNewList(dl=glGenLists(1),GL_COMPILE);
    glPushAttrib(GL_TEXTURE_BIT | GL_LIGHTING_BIT);
    glBegin(GL_QUADS);
    for(y=0;y<MAZE_HEIGHT;y++) {
     for(x=0;x<MAZE_WIDTH;x++) {
      if(wall(x,y)) {
        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();
        glPopAttrib();
    glEndList();
    return(dl);
}

void spinmaze(HDC hDC) {
    // spin the maze around on 2 axis
    static float spin=720.0f;
    spin-=5.0f;  // change this line to be time dependant!
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glPushMatrix();
    glTranslatef(0.0f,0.0f,-20.0f);
    glRotatef(spin, 0.0f, 1.0f, 1.0f);
    glTranslatef(-MAZE_WIDTH/2.0f,-MAZE_HEIGHT/2.0f,0.0f);
    glCallList(walllist);
    glCallList(mazelist);
    glPopMatrix();
    SwapBuffers(hDC);
    if(spin <=0.0f) {
		spin = 720.0f;
        idlefunc = entermaze;
        player_x = STARTING_POINT_X ;
        player_y = STARTING_POINT_Y ;
        player_h = STARTING_HEADING ;
	}
}

void entermaze(HDC hDC) {
	static float p=0.0f;
	p+=0.02f; // hmmm, should be time dependant
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glPushMatrix();
    glRotatef(-90.0f*p,1.0f,0.0f,0.0f);
    glRotatef(player_h*p,0.0f,0.0f,1.0f);
    glTranslatef(-(player_x*p + MAZE_WIDTH /2.0f*(1-p)),
                 -(player_y*p + MAZE_HEIGHT/2.0f*(1-p)),
                 -(0.5f*p + 20.0f*(1-p)));
    glCallList(walllist);
    glCallList(mazelist);
    glPopMatrix();
    SwapBuffers(hDC);
    if(p>=1.0f) {
		p=0.0f;
        idlefunc = navmaze;
	}
}


int forward(float px,float py,float bf) {
        int x = ((int)player_x);
        int y = ((int)player_y);
    int h=0;            // number of walls hit
    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< x+bf && wall(x-1,y)) {
        px = (float)(x)+bf;
        h++;
    }
    if(py< y+bf && wall(x,y-1)) {
        py = (float)(y)+bf;
        h++;
    }
        player_x=px;
        player_y=py;
        return h;
}

        // navigate through the maze and render it from the
        // players point of view.
        // Ideally updates to heading and position should be time dependant
void navmaze(HDC hDC)
{
    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);
    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); // no need to draw the top since we're in the maze now
    glPopMatrix();
    SwapBuffers(hDC);
    if(player_x>MAZE_WIDTH || player_y>MAZE_HEIGHT) {
        // start over
        idlefunc = spinmaze;
    }
}

void readtexture(){
    unsigned char *image;
    int rc;
    // the bitmap must be a 24 bit bmp file thats 128x128
    // I think i mixed up red and blue componants - oh well :-)
    FILE *fp;
    fp = fopen("maze.bmp","rb");
    if(!fp) return;
    fseek(fp,54,SEEK_SET);
    image = (unsigned char *)malloc(128*128*3);
    assert(image);
    rc=fread(image,sizeof(unsigned char),128*128*3,fp);
    assert(rc == 128*128*3);
    glTexImage2D(GL_TEXTURE_2D,0,3,128,128,0,GL_RGB,
                 GL_UNSIGNED_BYTE, image);
    // let texture wrap-around
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    // use point sampleing (fastest)
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    glEnable (GL_TEXTURE_2D);
    fclose(fp);
}

static void SetupDC(HDC hDC)
{
    PIXELFORMATDESCRIPTOR pfd = {
        sizeof(PIXELFORMATDESCRIPTOR),  /* size of this pfd */
        1,                              /* version num */
        PFD_DRAW_TO_WINDOW |            /* window types */
        PFD_SUPPORT_OPENGL |
        PFD_DOUBLEBUFFER,
        PFD_TYPE_RGBA,                  /* RGBA type */
        8,                              /* 8-bit color depth */
        0, 0, 0, 0, 0, 0,               /* color bits (ignored) */
        0,                              /* no alpha buffer */
        0,                              /* alpha bits (ignored) */
        0,                              /* no accumulation buffer */
        0, 0, 0, 0,                     /* accum bits (ignored) */
        16,                             /* 16-bit depth buffer */
        0,                              /* no stencil buffer */
        0,                              /* no auxiliary buffers */
        PFD_MAIN_PLANE,                 /* main layer */
        0,                              /* reserved */
        0, 0, 0,                        /* no layer, visible, damage */
                                        /* masks */
    };
    int SelectedPixelFormat;
    BOOL retVal;
    /* see if the pixel format exists */
    SelectedPixelFormat = ChoosePixelFormat(hDC, &pfd);
    if (SelectedPixelFormat == 0) {
        MessageBox(WindowFromDC(hDC),
                   "Failed to find acceptable pixel format.",
                   "OpenGL application error", MB_ICONERROR|MB_OK);
        exit(1);
    }
    /* use the pixel format */
    retVal = SetPixelFormat(hDC, SelectedPixelFormat, &pfd);
    if (retVal != TRUE) {
        MessageBox(WindowFromDC(hDC), "Failed to set pixel format.",
                   "OpenGL application error", MB_ICONERROR|MB_OK);
        exit(1);
    }
}

LRESULT APIENTRY WinProc(HWND hWND, UINT message, WPARAM wParam,
                         LPARAM lParam)
{

    switch (message) {
        case WM_CREATE:
            hDC = GetDC(hWND);
            SetupDC(hDC);
            hGLRC = wglCreateContext(hDC);
            wglMakeCurrent(hDC, hGLRC);
            glEnable(GL_DEPTH_TEST);
			glEnable(GL_TEXTURE_2D);
            readtexture();			
            glEnable(GL_CULL_FACE);
            glShadeModel(GL_FLAT);
            walllist = drawwalls();
            mazelist = drawtop();
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            gluPerspective(60.0, 1.0 , 0.1, 60.0);
            glMatrixMode(GL_MODELVIEW);
            glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
            glLoadIdentity ();
			glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
            idlefunc = spinmaze;
            return 0;
        case WM_DESTROY:
            if (hGLRC) {
                wglMakeCurrent(NULL, NULL);
                wglDeleteContext(hGLRC);
            }
            ReleaseDC(hWND, hDC);
            PostQuitMessage(0);
            return 0;
		case WM_SIZE:
			glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));
			break;
		//  方向鍵按下,向指定方向前進
        case WM_KEYDOWN:
			switch (LOWORD((int)wParam)) {
				case VK_LEFT:
					player_t = -5.0f;
					break;
				case VK_RIGHT:
					player_t = 5.0f;
					break;
				case VK_UP:
					player_s = 0.05f;
					break;
				case VK_DOWN:
					player_s = -0.02f;
					break;
				case VK_SHIFT:
					player_m = 3.0f;
					break;
			}
            break;
		//  方向鍵松開,停止前進
		case WM_KEYUP:
			switch (LOWORD((int)wParam)) {
				case VK_LEFT:
					player_t = 0.0f;
					break;
				case VK_RIGHT:
					player_t = 0.0f;
					break;
				case VK_UP:
					player_s = 0.0f;
					break;
				case VK_DOWN:
					player_s = 0.0f;
					break;
				case VK_SHIFT:
					player_m = 1.0f;
					break;
			}
			break;
		default:
			break;
	}
	return DefWindowProc(hWND, message, wParam, lParam);
}

int APIENTRY WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst,
                     LPSTR lpszCmdLine, int nCmdShow)
{
    char *className = "OpenGL";
    char *winName = "Maze Example";
    WNDCLASS winClass;
    MSG msg;

    // 定義并登記窗口類
    winClass.style = CS_HREDRAW | CS_VREDRAW;
    winClass.lpfnWndProc = WinProc;
    winClass.cbClsExtra = 0;
    winClass.cbWndExtra = 0;
    winClass.hInstance = hCurrentInst;
    winClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    winClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    winClass.hbrBackground = GetStockObject(WHITE_BRUSH);
    winClass.lpszMenuName = NULL;
    winClass.lpszClassName = className;
    RegisterClass(&winClass);
    // 創建窗口
    hWND = CreateWindow(className,
		winName,
		WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
		0, 0,
		300, 300,
        NULL,              /* Parent window's handle */
        NULL,              /* Menu handle */
        hCurrentInst,      /* Instance handle */
        NULL);             /* No additional data */
    ShowWindow(hWND, nCmdShow);

    UpdateWindow(hWND);
    // 事件處理
    while (1) {
        // oops, busy wait when no messages or idlefunc - ohwell
        if(idlefunc)idlefunc(hDC);
        if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){
			if (GetMessage(&msg, NULL, 0, 0) != TRUE) {
				return msg.wParam;
			}
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一区二区三区蜜臀| 在线播放日韩导航| 国产一区二区三区四区五区入口| 午夜精品久久久久久不卡8050| 国产精品久久久久精k8| 国产三级三级三级精品8ⅰ区| 欧美成人欧美edvon| 欧美精品在线视频| 欧美精品乱码久久久久久| 91精品中文字幕一区二区三区| 欧美日韩一区二区三区不卡| 欧美日韩精品二区第二页| 欧美亚洲国产一区在线观看网站| 在线精品视频免费观看| 欧美日韩一级片网站| 在线不卡免费av| 久久嫩草精品久久久精品| 国产精品久久久久久久久快鸭 | 亚洲国产中文字幕| 亚洲国产精品自拍| 精品一区二区三区视频在线观看 | 日韩av电影免费观看高清完整版| 日韩黄色在线观看| 国产精品主播直播| 99久久久国产精品| 欧美丰满一区二区免费视频| 久久综合九色综合欧美亚洲| 国产精品成人一区二区艾草| 亚洲va韩国va欧美va| 激情久久久久久久久久久久久久久久| 麻豆成人综合网| 成人动漫视频在线| 欧美精品乱码久久久久久按摩| 久久人人超碰精品| 亚洲综合精品久久| 国产成人精品亚洲777人妖| 91色九色蝌蚪| 久久这里只有精品6| 亚洲一区在线看| 韩国av一区二区三区四区| 91猫先生在线| xfplay精品久久| 一个色综合av| 国产成人在线视频播放| 欧美精品xxxxbbbb| 国产精品久久久久一区| 天天av天天翘天天综合网色鬼国产| 韩国一区二区视频| 欧美日韩你懂得| 国产精品你懂的| 精品影视av免费| 欧美色视频在线| 国产精品久久久久影院亚瑟| 日韩极品在线观看| 在线观看精品一区| 国产精品久久三| 国产麻豆精品在线| 欧美一二三区精品| 一区二区三区美女视频| 成人性视频免费网站| 日韩你懂的在线播放| 亚洲午夜日本在线观看| 99久久精品免费精品国产| 久久九九国产精品| 精品影视av免费| 日韩亚洲电影在线| 亚洲成av人片在线观看无码| 91在线免费看| 国产精品国产三级国产| 国产一区二区免费视频| 精品国产免费久久| 男女男精品视频网| 日韩欧美第一区| 蜜桃91丨九色丨蝌蚪91桃色| 欧美一区二区久久| 蜜桃av一区二区在线观看| 91精品国产综合久久香蕉麻豆| 亚洲伊人色欲综合网| 欧美性受xxxx| 亚洲主播在线观看| 欧美日韩国产成人在线91| 亚洲成av人片www| 91.com视频| 水野朝阳av一区二区三区| 欧美巨大另类极品videosbest | 日韩欧美的一区| 久久国产视频网| 亚洲精品在线观看视频| 国产一区二区三区四| 久久午夜色播影院免费高清| 国产精品一区二区91| 中文子幕无线码一区tr| 一本大道综合伊人精品热热| 一区二区在线免费| 91精品国模一区二区三区| 久久精品72免费观看| 久久先锋影音av鲁色资源| 粉嫩久久99精品久久久久久夜| 国产精品女人毛片| 欧美人妇做爰xxxⅹ性高电影 | 国产成人综合在线观看| 亚洲欧洲99久久| 91国偷自产一区二区三区观看 | 大美女一区二区三区| 综合在线观看色| 欧美日韩激情一区二区三区| 蜜桃av噜噜一区| 国产精品福利一区二区三区| 91黄色免费看| 韩国视频一区二区| 亚洲欧洲综合另类| 日韩一本二本av| 色综合久久88色综合天天免费| 日韩精品国产精品| 中文字幕av一区 二区| 在线国产亚洲欧美| 久热成人在线视频| 亚洲欧美一区二区三区久本道91| 欧美人狂配大交3d怪物一区| 国产盗摄精品一区二区三区在线| 亚洲欧美视频一区| 日韩欧美国产三级电影视频| 色综合天天做天天爱| 久久丁香综合五月国产三级网站 | 欧美中文字幕一区二区三区| 国产综合色在线| 性久久久久久久| 国产精品嫩草久久久久| 欧美电影免费观看高清完整版在| 欧洲精品在线观看| 国产91清纯白嫩初高中在线观看| 亚洲va韩国va欧美va精品| 中文字幕一区二区5566日韩| 日韩欧美中文字幕一区| 欧美三区在线观看| 成a人片亚洲日本久久| 美女www一区二区| 亚洲线精品一区二区三区八戒| 国产性做久久久久久| 日韩精品一区二区在线观看| 欧美性一级生活| 91免费在线看| 波多野结衣精品在线| 国产综合色在线视频区| 久久99精品久久久久| 亚洲va国产天堂va久久en| 亚洲一区二区三区免费视频| 亚洲欧美日韩系列| 亚洲欧美日韩在线播放| 亚洲日穴在线视频| 亚洲欧美怡红院| 中文字幕在线不卡| 综合av第一页| 亚洲欧美日韩精品久久久久| 欧美高清在线一区二区| 国产精品色在线| 中文字幕亚洲在| 亚洲久草在线视频| 亚洲第一综合色| 免费成人av在线播放| 麻豆成人久久精品二区三区红 | 亚洲亚洲人成综合网络| 一区二区三区自拍| 亚洲欧美在线观看| 一二三四区精品视频| 午夜欧美视频在线观看| 日韩福利视频网| 久久黄色级2电影| 国产精品伊人色| 成人av在线影院| 91浏览器入口在线观看| 欧美日韩国产综合草草| 日韩视频一区二区三区在线播放| 日韩欧美一二三区| 久久久精品欧美丰满| 国产精品久久久久婷婷| 亚洲精品成a人| 青青草视频一区| 国产九九视频一区二区三区| 成人av资源站| 欧美日韩国产一级片| 欧美日韩一区成人| 亚洲一级电影视频| 国产美女视频一区| 亚洲男同性恋视频| 国产精品系列在线播放| av在线免费不卡| 欧美夫妻性生活| 精品动漫一区二区三区在线观看| 久久综合色综合88| 亚洲精品福利视频网站| 国内精品不卡在线| 色素色在线综合| 欧美mv日韩mv| 成人欧美一区二区三区白人| 青青青爽久久午夜综合久久午夜| 成人性生交大合| 在线91免费看| 一区在线观看免费| 麻豆成人免费电影|