日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NeHe OpenGL教程 第二十一课:线的游戏

發布時間:2024/4/17 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NeHe OpenGL教程 第二十一课:线的游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自【翻譯】NeHe OpenGL 教程

前言

聲明,此?NeHe OpenGL教程系列文章由51博客yarin翻譯(2010-08-19),本博客為轉載并稍加整理與修改。對NeHe的OpenGL管線教程的編寫,以及yarn的翻譯整理表示感謝。

?

NeHe OpenGL第二十一課:線的游戲

線,反走樣,計時,正投影和簡單的聲音:

這是我第一個大的教程,它將包括線,反走樣,計時,正投影和簡單的聲音。希望這一課中的東西能讓每個人感到高興。
?
歡迎來到第21課,在這一課里,你將學會直線,反走樣,正投影,計時,基本的音效和一個簡單的游戲邏輯。希望這里的東西可以讓你高興。我花了兩天的時間寫代碼,并用了兩周的時間寫這份HTML文件,希望你能享受我的勞動。
在這課的結尾你將獲得一個叫"amidar"的游戲,你的任務是走完所有的直線。這個程序有了一個基本游戲的一切要素,關卡,生命值,聲音和一個游戲道具。

我們從第一課的程序來逐步完整這個程序,按照慣例,我們只介紹改動的部分。

#include?<windows.h>???????
#include?<stdio.h>???????
#include?<stdarg.h>??????
#include?<gl\gl.h>???????
#include?<gl\glu.h>???????
#include?<gl\glaux.h>???????

HDC??hDC=NULL;???????
HGLRC??hRC=NULL;???????
HWND??hWnd=NULL;???????
HINSTANCE?hInstance;???????
??
bool類型的變量,vline保存了組成我們游戲網格垂直方向上的121條線,上下水平各11條。hline保存了水平方向上的 121條線,用ap來檢查A鍵是否已經按下。
當網格被填滿時, filled被設置為TRUE而反之則為FALSE。gameover這個變量的作用顯而易見,當他的值為TRUE時,游戲結束。anti指出抗鋸齒功能是否打開,當設置為TRUE時,該功能是打開著的。active 和 fullscreen 指出窗口是否被最小化以及游戲窗口是窗口模式還是全屏模式。

bool??keys[256];???????
bool??vline[11][10];???????// 保存垂直方向的11根線條中,每根線條中的10段是否被走過
bool??hline[10][11];???????//保存水平方向的11根線條中,每根線條中的10段是否被走過
bool??ap;????????// A鍵是否已經按下
bool??filled;????????// 網格是否被填滿?
bool??gameover;???????// 游戲是否結束?
bool??anti=TRUE;???????// 是否啟用反走樣?
bool??active=TRUE;???????
bool??fullscreen=TRUE;??????
??
接著設置整型變量。loop1 和 loop2 被用來檢查網格,查看是否有敵人攻擊我們,以及在網格上給對象一個隨機的位置。你將看到loop1 / loop2在后面的程序得到使用。delay 是一個計數器,我用他來減慢那些壞蛋的動作。當delay的值大于某一個饋值的時候,敵人才可以行動,此時delay將被重置。
adjust是一個非常特殊的變量,即使我們的程序擁有一個定時器,他也僅僅用來檢查你的計算機是否運行地太快。如果是,則需要暫停一下以減慢運行速度。在我地GeForce顯卡上,程序的運行平滑地簡直變態,并且非常非常快。但是在我的PIII/450+Voodoo 3500TV上測試的時候,我注意到程序運行地非常緩慢。我發現問題在于關于時間控制那部分代碼只能夠用來減慢游戲進行而并不能加速之。因此我引入了一個叫做adjust 的變量。它可以是0到5之間的任何值。游戲中的對象移動速度的不同依賴于這個變量的值。值越小,運動越平滑;而值越大,則運動速度越快。這是在比較慢的機器上運行這個程序最簡單有效的解決方案了。但是請注意,不管對象移動的速度有多快,游戲的速度都不會比我期望的更快。我們推薦把adjust值設置為3,這樣在大部分機器上都有比較滿意的效果。
我們把lives的值設置成5,這樣我們的英雄一出場就擁有5條命。level是一個內部變量,用來指出當前游戲的難度。當然,這并不是你在屏幕上所看到的那個Level。變量level2開始的時候和Level擁有相同的值,但是隨著你技能的提高,這個值也會增加。當你成功通過難度3之后,這個值也將在難度3上停止增加。level 是一個用來表示游戲難度的內部變量,stage才是用來記錄當前游戲關卡的變量。?
??
int??loop1;????????// 通用循環變量
int??loop2;????????// 通用循環變量
int??delay;????????// 敵人的暫停時間
int??adjust=3;???????// 調整顯示的速度
int??lives=5;???????// 玩家的生命
int??level=1;???????// 內部游戲的等級
int??level2=level;???????// 顯示的游戲的等級
int??stage=1;???????// 游戲的關卡

接下來我們需要一個結構來記錄游戲中的對象。fx和fy每次在網格上移動我們的英雄和敵人一些較小的象素,以創建一個平滑的動畫效果。x和y則記錄著對象處于網格的那個交點上。
上下左右各有11個點,因此x和y可以是0到10之間的任意值。這也是我們為什么需要fx和fy的原因。考慮如果我們只能夠在上下和左右方向的11個點間移動的話,我們的英雄不得不
在各個點間跳躍前進。這樣顯然是不夠平滑美觀的。
最后一個變量spin用來使對象在Z軸上旋轉。?
??
struct??object????????// 記錄游戲中的對象
{
?int?fx, fy;????????// 使移動變得平滑
?int?x, y;????????// 當前游戲者的位置
?float?spin;????????// 旋轉方向
};

既然我們已經為我們的玩家,敵人,甚至是秘密武器。設置了結構體,那么同樣的,為了表現剛剛創設的結構體的功能和特性,我們也可以為此設置新的結構體。
為我們的玩家創設結構體之下的第一條直線。基本上我們將會為玩家提供fx,fy,x,y和spin值幾種不同的結構體。通過增加這些直線,僅需查看玩家的x值我們就很容易取得玩家的位置,同時我們也可以通過增加玩家的旋轉度來改變玩家的spin值。
第二條直線略有不同。因為同一屏幕我們可以同時擁有至多15個敵人。我們需要為每個敵人創造上面所提到的可變量。我們通過設置一個有15個敵人的組來實現這個目標,如第一個敵人的位置被設定為敵人(0).x.第二個敵人的位置為(1),x等等
第三條直線使得為寶物創設結構體實現了可能。寶物是一個會時不時在屏幕上出現的沙漏。我們需要通過沙漏來追蹤x和y值。但是因為沙漏的位置是固定的所以我們不需要尋找最佳位置,而通過為程序后面的其他物品尋找好的可變量來實現(如fx和fy)?
??
struct?object?player;????????// 玩家信息
struct?object?enemy[9];???????// 最多9個敵人的信息
struct?object?hourglass;???????// 寶物信息

現在我們創建一個描述時間的結構,使用這個結構我們可以很輕松的跟蹤時間變量。
接下來的第一步,就是創建一個64位的頻率變量,它記錄時間的頻率。

resolution變量用來記錄最小的時間間隔。

mm_timer_start和mm_timer_elapsed保存計時器開始時的時間和計時器開始后流失的時間。這兩個變量只有當計算機不擁有performance counter時才啟用。

變量performance_timer用來標識計算機是否有performance counter

如果performance counter啟用,最后兩個變量用來保存計時器開始時的時間和計時器開始后流失的時間,它們比普通的根據精確。
?
struct??? ???????// 保存時間信息的結構
{
? __int64?????? frequency;???????// 頻率
? float???????? resolution;???????// 時間間隔
? unsigned long mm_timer_start;???????// 多媒體計時器的開始時間
? unsigned long mm_timer_elapsed;??????// 多媒體計時器的開始時間
? bool??performance_timer;??????// 使用Performance Timer?
? __int64?????? performance_timer_start;?????// Performance Timer計時器的開始時間
? __int64?????? performance_timer_elapsed;?????// Performance Timer計時器的開始時間
} timer;?????????

下一行代碼定義了速度表。如前所說,對象移動的速度依賴于值adjust,而以adjust為下標去檢索速度表,就可以獲得對象的移動速度。?
??
int??steps[6]={ 1, 2, 4, 5, 10, 20 };????// 用來調整顯示的速度

接下來我們將為紋理分配空間。紋理一共2張,一張是背景而另外一張是一張字體紋理。如本系列教程中的其他課程一樣,base用來指出字符顯示列表的基,同樣的我們在最后聲明了窗口過程WndProc()。?
??
GLuint??texture[2];???????// 字符紋理
GLuint??base;????????// 字符顯示列表的開始值

LRESULT?CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);????

接下來會是很有趣的工作。接下來的一段代碼會初始化我們的計時器。代碼會檢查performance counter(非常精確的計數器)是否可用,如果不可用,則使用多媒體計時器。這段代碼是可以移植的。?
??
void TimerInit(void)????????// 初始化我們的計時器
{
?memset(&timer, 0, sizeof(timer));?????// 清空計時器結構

?// 檢測Performance Counter是否可用,可用則創建
?if (!QueryPerformanceFrequency((LARGE_INTEGER *) &timer.frequency))
?{
??// 如果不可用
??timer.performance_timer?= FALSE;????// 設置Performance Timer為false
??timer.mm_timer_start?= timeGetTime();???// 使用普通的計時器
??timer.resolution?= 1.0f/1000.0f;????// 設置單位為毫秒
??timer.frequency??= 1000;?????// 設置頻率為1000
??timer.mm_timer_elapsed?= timer.mm_timer_start;???// 設置流失的時間為當前的時間
?}

如果performance counter 可用,則執行下面的代碼:?

?else
?{
??// 使用Performance Counter計時器
??QueryPerformanceCounter((LARGE_INTEGER *) &timer.performance_timer_start);
??timer.performance_timer??= TRUE;????// 設置Performance Timer為TRUE
??// 計算計時的精確度
??timer.resolution??= (float) (((double)1.0f)/((double)timer.frequency));
??// 設置流失的時間為當前的時間
??timer.performance_timer_elapsed?= timer.performance_timer_start;
?}
}

上面的代碼設置了計時器,而下面的代碼則讀出計時器并返回已經經過的時間,以毫秒計。代碼很簡單,首先檢查是否支持performance counter,若支持,則調用其相關函數;否則調用多媒體函數。?
??
float TimerGetTime()????????// 返回經過的時間,以毫秒為單位
{
?__int64 time;????????// 使用64位的整數

?if (timer.performance_timer)??????// 是否使用Performance Timer計時器?
?{
??QueryPerformanceCounter((LARGE_INTEGER *) &time);??// 返回當前的時間
??// 返回時間差
??return ( (float) ( time - timer.performance_timer_start) * timer.resolution)*1000.0f;
?}
?else
?{
??// 使用普通的計時器,返回時間差
??return( (float) ( timeGetTime() - timer.mm_timer_start) * timer.resolution)*1000.0f;
?}
}

在下面的代碼里,我們把玩家重置在屏幕的左上角,而給敵人設置一個隨機的位置。?
??
void ResetObjects(void)????????// 重置玩家和敵人
{
?player.x=0;????????// 把玩家置于左上角
?player.y=0;????????
?player.fx=0;????????
?player.fy=0;????????

接著我們給敵人一個隨機的開始位置,敵人的數量等于難度乘上當前關卡號。記著,難度最大是3,而最多有3關。因此敵人最多有9個。?
??
?for (loop1=0; loop1<(stage*level); loop1++)????// 循環隨即放置所有的敵人
?{
??enemy[loop1].x=5+rand()%6;?????
??enemy[loop1].y=rand()%11;?????
??enemy[loop1].fx=enemy[loop1].x*60;????
??enemy[loop1].fy=enemy[loop1].y*40;????
?}
}

并沒有做任何改動,因此我將跳過它。在LoadGLTextures函數里我將載入那兩個紋理--背景和字體。并且我會把這兩副圖都轉化成紋理,這樣我們就可以在游戲中使用他們。紋理創建好之后,象素數據就可以刪除了。沒有什么新東西,你可以閱讀以前的課程以獲得更多信息。
?
int LoadGLTextures()????????
{
?int Status=FALSE;???????
?AUX_RGBImageRec *TextureImage[2];?????
?memset(TextureImage,0,sizeof(void *)*2);????
?if ?((TextureImage[0]=LoadBMP("Data/Font.bmp")) &&???// 載入字體紋理
?? (TextureImage[1]=LoadBMP("Data/Image.bmp")))???// 載入圖像紋理
?{
??Status=TRUE;???????

??glGenTextures(2, &texture[0]);?????

??for (loop1=0; loop1<2; loop1++)?????
??{
???glBindTexture(GL_TEXTURE_2D, texture[loop1]);
???glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop1]->sizeX, TextureImage[loop1]->sizeY,
????0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop1]->data);
???glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
???glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
??}

??for (loop1=0; loop1<2; loop1++)?????
??{
???if (TextureImage[loop1])????
???{
????if (TextureImage[loop1]->data)???
????{
?????free(TextureImage[loop1]->data);?
????}
????free(TextureImage[loop1]);???
???}
??}
?}
?return Status;???????
}

下面的代碼建立了顯示列表。對于字體的顯示,我已經寫過教程。在這里我把字體圖象分成16×16個單元共256個字符。如果你有什么不明白,請參閱前面的教程?
??
GLvoid BuildFont(GLvoid)???????
{
?base=glGenLists(256);???????
?glBindTexture(GL_TEXTURE_2D, texture[0]);????
?for (loop1=0; loop1<256; loop1++)?????
?{
??float cx=float(loop1%16)/16.0f;?????
??float cy=float(loop1/16)/16.0f;?????

??glNewList(base+loop1,GL_COMPILE);????
???glBegin(GL_QUADS);?????
????glTexCoord2f(cx,1.0f-cy-0.0625f);??
????glVertex2d(0,16);????
????glTexCoord2f(cx+0.0625f,1.0f-cy-0.0625f);?
????glVertex2i(16,16);????
????glTexCoord2f(cx+0.0625f,1.0f-cy);??
????glVertex2i(16,0);????
????glTexCoord2f(cx,1.0f-cy);???
????glVertex2i(0,0);????
???glEnd();??????
???glTranslated(15,0,0);?????
??glEndList();???????
?}?????????
}

當我們不再需要顯示列表的時候,銷毀它是一個好主意。在這里我仍然把代碼加上了,雖然沒有什么新東西。?
??
GLvoid KillFont(GLvoid)??
{
?glDeleteLists(base,256);??????
}

函數沒有做太多改變。唯一的改動是它可以打印變量了。我把代碼列出這樣你可以容易看到改動的地方。
請注意,在這里我激活了紋理并且重置了視圖矩陣。如果set被置1的話,字體將被放大。我這樣做是希望可以在屏幕上顯示大一點的字符。在一切結束后,我會禁用紋理。?
??
GLvoid glPrint(GLint x, GLint y, int set, const char *fmt, ...)
{
?char??text[256];??????
?va_list??ap;???????

?if (fmt == NULL)??
??return;????????

?va_start(ap, fmt);???????
???? vsprintf(text, fmt, ap);??????
?va_end(ap);????????

?if (set>1)????????
?{
??set=1;???????
?}
?glEnable(GL_TEXTURE_2D);??????
?glLoadIdentity();???????
?glTranslated(x,y,0);???????
?glListBase(base-32+(128*set));??????

?if (set==0)????????
?{
??glScalef(1.5f,2.0f,1.0f);?????
?}

?glCallLists(strlen(text),GL_UNSIGNED_BYTE, text);???
?glDisable(GL_TEXTURE_2D);??????
}

下面的代碼基本沒有變化,只是把透視投影變為了正投影?
??
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)????
{
?if (height==0)???????
?{
??height=1;???????
?}

?glViewport(0,0,width,height);??????

?glMatrixMode(GL_PROJECTION);??????
?glLoadIdentity();???????

?glOrtho(0.0f,width,height,0.0f,-1.0f,1.0f);

?glMatrixMode(GL_MODELVIEW);??????
?glLoadIdentity();???????
}

初始化的代碼和前面的代碼相比沒有什么改變?
??
int InitGL(GLvoid)
{
?if (!LoadGLTextures())???????
?{
??return FALSE;???????
?}

?BuildFont();????????

?glShadeModel(GL_SMOOTH);??????
?glClearColor(0.0f, 0.0f, 0.0f, 0.5f);?????
?glClearDepth(1.0f);???????
?glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);?????
?glEnable(GL_BLEND);???????
?glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
?return TRUE;????????
}

下面是我們的繪制代碼。
首先我們清空緩存,接著綁定字體的紋理,繪制游戲的提示字符串
?
int DrawGLScene(GLvoid)????????
{
?glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);???
?glBindTexture(GL_TEXTURE_2D, texture[0]);????// 選擇字符紋理
?glColor3f(1.0f,0.5f,1.0f);??????
?glPrint(207,24,0,"GRID CRAZY");??????// 繪制游戲名稱"GRID CRAZY"
?glColor3f(1.0f,1.0f,0.0f);??????
?glPrint(20,20,1,"Level:%2i",level2);?????// 繪制當前的級別
?glPrint(20,40,1,"Stage:%2i",stage);?????// 繪制當前級別的關卡

現在我們檢測游戲是否結束,如果游戲結束繪制"Gmae over"并提示玩家按空格鍵重新開始?

?if (gameover)????????// 游戲是否結束?
?{
??glColor3ub(rand()%255,rand()%255,rand()%255);???// 隨機選擇一種顏色
??glPrint(472,20,1,"GAME OVER");?????// 繪制 GAME OVER 字符串到屏幕
??glPrint(456,40,1,"PRESS SPACE");????// 提示玩家按空格鍵重新開始
?}

在屏幕的右上角繪制玩家的剩余生命?

?for (loop1=0; loop1<lives-1; loop1++)?????//循環繪制玩家的剩余生命
?{
??glLoadIdentity();??????
??glTranslatef(490+(loop1*40.0f),40.0f,0.0f);???// 移動到屏幕右上角
??glRotatef(-player.spin,0.0f,0.0f,1.0f);????// 旋轉繪制的生命圖標
??glColor3f(0.0f,1.0f,0.0f);?????// 繪制玩家生命
??glBegin(GL_LINES);??????// 繪制玩家圖標
???glVertex2d(-5,-5);?????
???glVertex2d( 5, 5);?????
???glVertex2d( 5,-5);?????
???glVertex2d(-5, 5);?????
??glEnd();???????
??glRotatef(-player.spin*0.5f,0.0f,0.0f,1.0f);???
??glColor3f(0.0f,0.75f,0.0f);?????
??glBegin(GL_LINES);??????
???glVertex2d(-7, 0);?????
???glVertex2d( 7, 0);?????
???glVertex2d( 0,-7);?????
???glVertex2d( 0, 7);?????
??glEnd();???????
?}

下面我們來繪制網格,我們設置變量filled為TRUE,這告訴程序填充網格。
接著我們把線的寬度設置為2,并把線的顏色設置為藍色,接著我們檢測線斷是否被走過,如果走過我們設置顏色為白色。

?filled=TRUE;????????// 在測試前,把填充變量設置為TRUE
?glLineWidth(2.0f);???????// 設置線寬為2.0f
?glDisable(GL_LINE_SMOOTH);??????// 禁用反走樣
?glLoadIdentity();???????
?for (loop1=0; loop1<11; loop1++)?????// 循環11根線
?{
??for (loop2=0; loop2<11; loop2++)????// 循環每根線的線段
??{
???glColor3f(0.0f,0.5f,1.0f);????// 設置線為藍色
???if (hline[loop1][loop2])????// 是否走過?
???{
????glColor3f(1.0f,1.0f,1.0f);???// 是,設線為白色
???}
???if (loop1<10)??????// 繪制水平線
???{
????if (!hline[loop1][loop2])???// 如果當前線段沒有走過,則不填充
????{
?????filled=FALSE;????
????}
????glBegin(GL_LINES);????// 繪制當前的線段
?????glVertex2d(20+(loop1*60),70+(loop2*40));?
?????glVertex2d(80+(loop1*60),70+(loop2*40));?
????glEnd();?????
???}

下面的代碼繪制垂直的線段?
??
???glColor3f(0.0f,0.5f,1.0f);????// 設置線為藍色
???if (vline[loop1][loop2])????// 是否走過
???{
????glColor3f(1.0f,1.0f,1.0f);???// 是,設線為白色
???}
???if (loop2<10)??????// 繪制垂直線
???{
????if (!vline[loop1][loop2])???// 如果當前線段沒有走過,則不填充
????{
?????filled=FALSE;????
????}
????glBegin(GL_LINES);????// 繪制當前的線段
?????glVertex2d(20+(loop1*60),70+(loop2*40));?
?????glVertex2d(20+(loop1*60),110+(loop2*40));?
????glEnd();?????
???}

接下來我們檢測長方形的四個邊是否都被走過,如果被走過我們就繪制一個帶紋理的四邊形。
我們用下圖來解釋這個檢測過程

如果對于垂直線vline的相鄰兩個邊都被走過,并且水平線hline的相鄰兩個邊也被走過,那么我們就可以繪制這個四邊形了。我們可以使用循環檢測每一個四邊形,代碼如下:?

???glEnable(GL_TEXTURE_2D);????// 使用紋理映射
???glColor3f(1.0f,1.0f,1.0f);????// 設置為白色
???glBindTexture(GL_TEXTURE_2D, texture[1]);??// 綁定紋理
???if ((loop1<10) && (loop2<10))????// 繪制走過的四邊形
???{
????// 這個四邊形是否被走過?
????if (hline[loop1][loop2] && hline[loop1][loop2+1] && vline[loop1][loop2] && vline[loop1+1][loop2])
????{
?????glBegin(GL_QUADS);???// 是,則繪制它
??????glTexCoord2f(float(loop1/10.0f)+0.1f,1.0f-(float(loop2/10.0f)));
??????glVertex2d(20+(loop1*60)+59,(70+loop2*40+1));?
??????glTexCoord2f(float(loop1/10.0f),1.0f-(float(loop2/10.0f)));
??????glVertex2d(20+(loop1*60)+1,(70+loop2*40+1));?
??????glTexCoord2f(float(loop1/10.0f),1.0f-(float(loop2/10.0f)+0.1f));
??????glVertex2d(20+(loop1*60)+1,(70+loop2*40)+39);?
??????glTexCoord2f(float(loop1/10.0f)+0.1f,1.0f-(float(loop2/10.0f)+0.1f));
??????glVertex2d(20+(loop1*60)+59,(70+loop2*40)+39);?
?????glEnd();????
????}
???}
???glDisable(GL_TEXTURE_2D);????
??}
?}
?glLineWidth(1.0f);???????

下面的代碼用來設置是否啟用直線反走樣?

?if (anti)????????// 是否啟用反走樣?
?{
??glEnable(GL_LINE_SMOOTH);?????
?}

為了使游戲變得簡單些,我添加了一個時間停止器,當你吃掉它時,可以讓追擊的你的敵人停下來。
下面的代碼用來繪制一個時間停止器。

?if (hourglass.fx==1)???????
?{
??glLoadIdentity();??????
??glTranslatef(20.0f+(hourglass.x*60),70.0f+(hourglass.y*40),0.0f);?
??glRotatef(hourglass.spin,0.0f,0.0f,1.0f);???
??glColor3ub(rand()%255,rand()%255,rand()%255);???
??glBegin(GL_LINES);
???glVertex2d(-5,-5);?????
???glVertex2d( 5, 5);?????
???glVertex2d( 5,-5);?????
???glVertex2d(-5, 5);?????
???glVertex2d(-5, 5);?????
???glVertex2d( 5, 5);?????
???glVertex2d(-5,-5);?????
???glVertex2d( 5,-5);?????
??glEnd();???????
?}

接下來繪制我們玩家?

?glLoadIdentity();
?glTranslatef(player.fx+20.0f,player.fy+70.0f,0.0f);???// 設置玩家的位置
?glRotatef(player.spin,0.0f,0.0f,1.0f);?????// 旋轉動畫
?glColor3f(0.0f,1.0f,0.0f);??????
?glBegin(GL_LINES);???????
??glVertex2d(-5,-5);??????
??glVertex2d( 5, 5);??????
??glVertex2d( 5,-5);??????
??glVertex2d(-5, 5);??????
?glEnd();????????
??
繪制玩家的顯示效果,讓它看起來更好看些(其實沒用)?

?glRotatef(player.spin*0.5f,0.0f,0.0f,1.0f);
?glColor3f(0.0f,0.75f,0.0f);??????
?glBegin(GL_LINES);???????
??glVertex2d(-7, 0);??????
??glVertex2d( 7, 0);??????
??glVertex2d( 0,-7);??????
??glVertex2d( 0, 7);??????
?glEnd();???????
??
接下來繪制追擊玩家的敵人?

?for (loop1=0; loop1<(stage*level); loop1++)
?{
??glLoadIdentity();??????
??glTranslatef(enemy[loop1].fx+20.0f,enemy[loop1].fy+70.0f,0.0f);
??glColor3f(1.0f,0.5f,0.5f);?????
??glBegin(GL_LINES);??????
???glVertex2d( 0,-7);?????
???glVertex2d(-7, 0);?????
???glVertex2d(-7, 0);?????
???glVertex2d( 0, 7);?????
???glVertex2d( 0, 7);?????
???glVertex2d( 7, 0);?????
???glVertex2d( 7, 0);?????
???glVertex2d( 0,-7);?????
??glEnd();???????
??
下面的代碼繪制敵人的顯示效果,讓其更好看。?

??glRotatef(enemy[loop1].spin,0.0f,0.0f,1.0f);???
??glColor3f(1.0f,0.0f,0.0f);?????
??glBegin(GL_LINES);??????
???glVertex2d(-7,-7);?????
???glVertex2d( 7, 7);?????
???glVertex2d(-7, 7);?????
???glVertex2d( 7,-7);?????
??glEnd();???????
?}
?return TRUE;????????
}

KillGLWindow函數基本沒有變化,只在最后一行添加KillFont函數?
??
GLvoid KillGLWindow(GLvoid)???????
{
?if (fullscreen)???????
?{
??ChangeDisplaySettings(NULL,0);?????
??ShowCursor(TRUE);??????
?}

?if (hRC)????????
?{
??if (!wglMakeCurrent(NULL,NULL))?????
??{
???MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
??}

??if (!wglDeleteContext(hRC))?????
??{
???MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
??}
??hRC=NULL;???????
?}

?if (hDC && !ReleaseDC(hWnd,hDC))?????
?{
??MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
??hDC=NULL;???????
?}

?if (hWnd && !DestroyWindow(hWnd))?????
?{
??MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
??hWnd=NULL;???????
?}

?if (!UnregisterClass("OpenGL",hInstance))????
?{
??MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
??hInstance=NULL;???????
?}

?KillFont();????????// 刪除創建的字體
}

函數CreateGLWindow() and WndProc() 沒有變化。

游戲控制在WinMain中完成的
?
int WINAPI WinMain(?HINSTANCE?hInstance,????
???HINSTANCE?hPrevInstance,????
???LPSTR??lpCmdLine,????
???int??nCmdShow)????
{
?MSG?msg;????????
?BOOL?done=FALSE;???????

?
?if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
?{
??fullscreen=FALSE;??????
?}

在創建完OpenGL窗口后,我們添加如下的代碼,它用來創建玩家和敵人,并初始化時間計時器?
??
?if (!CreateGLWindow("NeHe's Line Tutorial",640,480,16,fullscreen))?
?{
??return 0;???????
?}

?ResetObjects();????????// 重置玩家和敵人
?TimerInit();????????// 初始化時間計時器

?while(!done)????????
?{
??if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))???
??{
???if (msg.message==WM_QUIT)????
???{
????done=TRUE;?????
???}
???else???????
???{
????TranslateMessage(&msg);????
????DispatchMessage(&msg);????
???}
??}
??else????????
??{

接下來取得當前的時間,并在速度快的機器上讓其空循環,使得程序在所有的機器上都擁有同樣的幀率??
??

???float start=TimerGetTime();????// 返回當前的時間

???if ((active && !DrawGLScene()) || keys[VK_ESCAPE])?
???{
????done=TRUE;?????
???}
???else???????
???{
????SwapBuffers(hDC);????
???}

???while(TimerGetTime()<start+float(steps[adjust]*2.0f)) {}// 速度快的機器上讓其空循環

下面的部分沒有改變,按F1執行窗口和全屏的切換?
??
???if (keys[VK_F1])
???{
????keys[VK_F1]=FALSE;????
????KillGLWindow();?????
????fullscreen=!fullscreen;????
????if (!CreateGLWindow("NeHe's Line Tutorial",640,480,16,fullscreen))
????{
?????return 0;????
????}
???}

按A鍵切換是否啟用反走樣?
??
???if (keys['A'] && !ap)?????// 如果'A' 鍵被按下,啟用反走樣
???{
????ap=TRUE;?????
????anti=!anti;?????
???}
???if (!keys['A'])??????
???{
????ap=FALSE;?????
???}

如果游戲沒有結束,執行游戲循環???

???if (!gameover && active)????// 如果游戲沒有結束,則進行游戲循環
???{
????for (loop1=0; loop1<(stage*level); loop1++)?// 循環不同的難度等級
????{

根據玩家的位置,讓敵人追擊玩家?

?????if ((enemy[loop1].x<player.x) && (enemy[loop1].fy==enemy[loop1].y*40))
?????{
??????enemy[loop1].x++;??
?????}

?????if ((enemy[loop1].x>player.x) && (enemy[loop1].fy==enemy[loop1].y*40))
?????{
??????enemy[loop1].x--;??
?????}

?????if ((enemy[loop1].y<player.y) && (enemy[loop1].fx==enemy[loop1].x*60))
?????{
??????enemy[loop1].y++;??
?????}

?????if ((enemy[loop1].y>player.y) && (enemy[loop1].fx==enemy[loop1].x*60))
?????{
??????enemy[loop1].y--;??
?????}

如果時間停止器的顯示時間結束,而玩家又沒有吃到,那么重置計時計算器。?

?????if (delay>(3-level) && (hourglass.fx!=2))??// 如果沒有吃到時間停止器
?????{
??????delay=0;?????// 重置時間停止器
??????for (loop2=0; loop2<(stage*level); loop2++)?// 循環設置每個敵人的位置
??????{

下面的代碼調整每個敵人的位置,并繪制它們的顯示效果????

???????if (enemy[loop2].fx<enemy[loop2].x*60)?
???????{
????????enemy[loop2].fx+=steps[adjust];?
????????enemy[loop2].spin+=steps[adjust];?
???????}
???????if (enemy[loop2].fx>enemy[loop2].x*60)?
???????{
????????enemy[loop2].fx-=steps[adjust];?
????????enemy[loop2].spin-=steps[adjust];?
???????}
???????if (enemy[loop2].fy<enemy[loop2].y*40)?
???????{
????????enemy[loop2].fy+=steps[adjust];?
????????enemy[loop2].spin+=steps[adjust];?
???????}
???????if (enemy[loop2].fy>enemy[loop2].y*40)?
???????{
????????enemy[loop2].fy-=steps[adjust];?
????????enemy[loop2].spin-=steps[adjust];?
???????}
??????}
?????}

如果敵人的位置和玩家的位置相遇,這玩家死亡,開始新的一局?

?????// 敵人的位置和玩家的位置相遇?
?????if ((enemy[loop1].fx==player.fx) && (enemy[loop1].fy==player.fy))
?????{
??????lives--;???// 如果是,生命值減1

??????if (lives==0)???// 如果生命值為0,則游戲結束
??????{
???????gameover=TRUE;??
??????}

??????ResetObjects();???// 重置所有的游戲變量
??????PlaySound("Data/Die.wav", NULL, SND_SYNC);?// 播放死亡的音樂
?????}
????}

使用上,下,左,右控制玩家的位置?

????if (keys[VK_RIGHT] && (player.x<10) && (player.fx==player.x*60) && (player.fy==player.y*40))
????{
?????hline[player.x][player.y]=TRUE;??
?????player.x++;????
????}
????if (keys[VK_LEFT] && (player.x>0) && (player.fx==player.x*60) && (player.fy==player.y*40))
????{
?????player.x--;????
?????hline[player.x][player.y]=TRUE;??
????}
????if (keys[VK_DOWN] && (player.y<10) && (player.fx==player.x*60) && (player.fy==player.y*40))
????{
?????vline[player.x][player.y]=TRUE;??
?????player.y++;????
????}
????if (keys[VK_UP] && (player.y>0) && (player.fx==player.x*60) && (player.fy==player.y*40))
????{
?????player.y--;????
?????vline[player.x][player.y]=TRUE;??
????}

調整玩家的位置,讓動畫看起來跟自然????

????if (player.fx<player.x*60)???
????{
?????player.fx+=steps[adjust];??
????}
????if (player.fx>player.x*60)???
????{
?????player.fx-=steps[adjust];??
????}
????if (player.fy<player.y*40)???
????{
?????player.fy+=steps[adjust];??
????}
????if (player.fy>player.y*40)???
????{
?????player.fy-=steps[adjust];??
????}
???}

如果游戲結束,按空格開始新的一局游戲?

???else???????// 如果游戲結束
???{
????if (keys[' '])?????// 按下空格?
????{
?????gameover=FALSE;????// 開始新的一局
?????filled=TRUE;????// 重置所有的變量
?????level=1;????
?????level2=1;???
?????stage=0;????
?????lives=5;????
????}
???}

如果順利通過本關,播放通關音樂,并提高游戲難度,開始新的一局??

???if (filled)??????// 所有網格是否填滿
???{
????PlaySound("Data/Complete.wav", NULL, SND_SYNC);?// 播放過關音樂
????stage++;?????// 增加游戲難度
????if (stage>3)?????// 如果當前的關卡大于3,則進入到下一個大的關卡?
????{
?????stage=1;????// 重置當前的關卡
?????level++;????// 增加大關卡的值
?????level2++;????
?????if (level>3)????
?????{
??????level=3;???// 如果大關卡大于3,則不再增加
??????lives++;???// 完成一局給玩家獎勵一條生命
??????if (lives>5)???// 如果玩家有5條生命,則不再增加
??????{
???????lives=5;??
??????}
?????}
????}

進入到下一關卡,重置所有的游戲變量?

????ResetObjects();?????

????for (loop1=0; loop1<11; loop1++)
????{
?????for (loop2=0; loop2<11; loop2++)?
?????{
??????if (loop1<10)???
??????{
???????hline[loop1][loop2]=FALSE;?
??????}
??????if (loop2<10)???
??????{
???????vline[loop1][loop2]=FALSE;?
??????}
?????}
????}
???}

如果玩家吃到時間停止器,記錄這一信息?
??
???if ((player.fx==hourglass.x*60) && (player.fy==hourglass.y*40) && (hourglass.fx==1))
???{
????// 播放一段聲音
????PlaySound("Data/freeze.wav", NULL, SND_ASYNC | SND_LOOP);
????hourglass.fx=2;?????// 設置fx為2,表示吃到時間停止器
????hourglass.fy=0;?????// 設置fy為0
???}

顯示玩家的動畫效果?

???player.spin+=0.5f*steps[adjust];???// 旋轉動畫
???if (player.spin>360.0f)?????
???{
????player.spin-=360;????
???}

顯示時間停止器的動畫?
??
???hourglass.spin-=0.25f*steps[adjust];???// 旋轉動畫
???if (hourglass.spin<0.0f)????
???{
????hourglass.spin+=360.0f;????
???}

下面的代碼計算何時出現一個時間停止計數器?

???hourglass.fy+=steps[adjust];????// 增加fy的值,當他大于一定的時候,產生時間停止計數器
???if ((hourglass.fx==0) && (hourglass.fy>6000/level))?
???{???????
????PlaySound("Data/hourglass.wav", NULL, SND_ASYNC);?
????hourglass.x=rand()%10+1;???
????hourglass.y=rand()%11;????
????hourglass.fx=1;?????//fx=1表示時間停止器出現?????
????hourglass.fy=0;?????
???}

如果玩家沒有拾取時間停止器,則過一段時間后,它自動消失?

???if ((hourglass.fx==1) && (hourglass.fy>6000/level))?
???{????
????hourglass.fx=0;?????// 消失后重置時間停止器
????hourglass.fy=0;?????
???}

如果玩家吃到時間停止器,在時間停止停止階段播放一段音樂,過一段時間停止播放音樂?
??
???if ((hourglass.fx==2) && (hourglass.fy>500+(500*level)))
???{???????
????PlaySound(NULL, NULL, 0);???// 停止播放音樂
????hourglass.fx=0;?????// 重置變量
????hourglass.fy=0;?????
???}

增加敵人的延遲計數器的值,這個值用來更新敵人的運動?

???delay++;??????// 增加敵人的延遲計數器的值
??}
?}

?// 關閉
?KillGLWindow();????????// 刪除窗口
?return (msg.wParam);???????// 退出程序
}

原文及其個版本源代碼下載:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=21

總結

以上是生活随笔為你收集整理的NeHe OpenGL教程 第二十一课:线的游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

亚洲va在线va天堂va偷拍 | 在线观看亚洲国产精品 | 久草视频免费在线观看 | 日本激情中文字幕 | av高清在线观看 | 成 人 黄 色视频免费播放 | 亚洲精品字幕在线观看 | 日韩精品免费一区 | 成人av资源站 | 中文字幕超清在线免费 | 国产成人不卡 | 亚洲视频免费 | 亚洲黄电影| 国产a高清 | 91爱爱电影 | 99精品国产亚洲 | 精品999在线 | 激情综合久久 | 久久久久久影视 | 国产 日韩 欧美 中文 在线播放 | 激情av资源 | 91精品国产亚洲 | 欧美aaaxxxx做受视频 | 中文字幕国产 | av免费电影在线观看 | av手机在线播放 | 九色精品| 久久久久国产一区二区三区 | 成 人 黄 色 视频播放1 | 91九色蝌蚪视频在线 | 成人av地址 | www.色午夜 | 黄色亚洲精品 | 黄色一级大片免费看 | 热久久免费国产视频 | 国产99久久99热这里精品5 | 开心激情五月婷婷 | 久久国产精品色av免费看 | 午夜影院在线观看18 | 国产高清久久 | 日日夜夜天天 | 国产午夜精品一区 | 亚洲精品网址在线观看 | 中文字幕国产一区 | 久久精品亚洲 | 一区二区精| 欧美午夜精品久久久久久浪潮 | 国产免费亚洲高清 | 免费毛片aaaaaa | 人人干人人干人人干 | 国产香蕉在线 | 欧美精品国产综合久久 | 五月色综合 | 欧美成人精品三级在线观看播放 | 亚洲精品影视 | 色综合久久五月 | 999热线在线观看 | 久久精品视频免费观看 | 黄色一级大片在线免费看国产一 | 国产成人精品一区二区三区在线 | 亚洲视频电影在线 | 欧美日韩不卡在线观看 | 日本中文乱码卡一卡二新区 | 中文字幕在线视频一区二区三区 | 狠狠色狠狠色合久久伊人 | 婷婷六月天综合 | 91精品国产91p65| 国产精品美女 | 中文字幕高清免费日韩视频在线 | 少妇搡bbbb搡bbb搡忠贞 | 久久久这里有精品 | www.综合网.com| 久久国产麻豆 | 欧美成a人片在线观看久 | 久久中国精品 | 三级av在线播放 | av 在线观看| 伊人电影在线观看 | 国产精品 国内视频 | 国产精品成人久久 | 亚洲在线视频免费观看 | 精品一二三区视频 | 日韩高清不卡在线 | 亚洲精品97 | 婷婷 中文字幕 | 国产日韩精品一区二区 | 亚洲精品成人网 | 偷拍福利视频一区二区三区 | 久久精品视频在线观看免费 | 精品国产乱码久久久久久天美 | 中文字幕一二 | 欧美日韩一级久久久久久免费看 | 97综合视频 | 精品一区电影 | 日韩高清av | 18国产精品白浆在线观看免费 | 婷婷免费在线视频 | 丁香色综合 | 国产精品久久久久999 | 国产精品 9999| 久久久穴 | 亚洲 精品在线视频 | 最新高清无码专区 | 成年人免费在线播放 | 91九色视频观看 | 成人中文字幕在线 | 在线看毛片网站 | 高清国产一区 | 网址你懂的在线观看 | 国产伦理久久精品久久久久_ | 亚洲综合小说 | 狠狠五月天 | 久久高清精品 | av电影一区二区三区 | www.com久久 | 97超碰资源网 | 欧美激情综合色 | 久久y | 国产精品久久久久久久7电影 | 欧美日韩不卡一区 | 天天操天天操天天操 | 久黄色 | 黄色大片av | 欧美日韩视频一区二区 | 国产精品久久久久久久久久了 | 成人久久久久久久久久 | 久久男人中文字幕资源站 | 国内精品久久久久影院优 | 亚洲精品动漫久久久久 | 五月婷婷六月丁香 | 国产精品第十页 | 色偷偷网站视频 | 国产99re| 中文字幕一区二区三区在线视频 | 免费黄a大片 | 狠狠色丁香久久综合网 | 日韩精选在线观看 | 91在线91拍拍在线91 | 欧美日韩亚洲在线观看 | 欧美男同网站 | 国产美女免费视频 | 国产黄色大全 | 国产一区二区手机在线观看 | 激情网婷婷 | 日韩综合第一页 | 欧美精品天堂 | 久久国产精品一区二区三区 | 亚洲欧美视频在线观看 | 日本三级人妇 | 国产精品久久久久久久久费观看 | 在线观看黄色大片 | 天海冀一区二区三区 | www国产一区| 一级黄色在线免费观看 | 色多多污污在线观看 | 狠狠色免费 | 久久久精品网站 | 久久av高清| 99色在线视频 | 免费三级黄色片 | 五月天婷婷狠狠 | 激情小说久久 | 亚洲视频 中文字幕 | 免费精品在线观看 | 亚洲电影一区二区 | 精品国产一区二区三区免费 | 五月婷婷激情六月 | www.啪啪.com | 97国产精品亚洲精品 | 亚洲精品国产麻豆 | 久久网页 | 久久久久久国产精品999 | 韩国av在线播放 | 中文字幕av电影下载 | 五月婷综合 | 欧美福利精品 | 国产精品区免费视频 | 久久三级毛片 | 中文字幕电影高清在线观看 | 亚洲视频久久久久 | 久久福利 | 午夜免费电影院 | 四虎永久视频 | 麻豆传媒在线免费看 | 成人免费在线视频 | 91精品无人成人www | 国内精品二区 | 亚洲综合视频在线播放 | 欧美午夜精品久久久久久浪潮 | 国产一区在线精品 | 国产精品mv| 精品国产亚洲在线 | 少妇av网| 在线性视频日韩欧美 | 91av视频网 | 99国产一区二区三精品乱码 | www.在线观看av | 欧美日韩国产综合一区二区 | 91视频亚洲 | 国产精品成人自产拍在线观看 | 国产999精品久久久影片官网 | 久久精品—区二区三区 | 国产精品一区二区av影院萌芽 | 久久99电影 | 中文在线免费观看 | 精品欧美一区二区在线观看 | 91免费观看 | 亚洲91网站| 精品视频999| 免费看毛片网站 | 色大片免费看 | www.99热精品 | 天天射综合网站 | 日本精a在线观看 | 国产日韩中文字幕 | 国产精品 日韩 欧美 | 国产精品中文字幕在线观看 | 日韩在线 | 女人18毛片a级毛片一区二区 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 91人人射 | 国产麻豆精品免费视频 | 正在播放日韩 | 中文在线中文a | 亚洲精品国产精品乱码在线观看 | 国产无遮挡又黄又爽馒头漫画 | 美女视频久久久 | 伊人va| 一区二区三区 中文字幕 | 精品中文字幕在线播放 | 中文字幕日本在线观看 | 婷婷去俺也去六月色 | 美女国产精品 | 天天插日日射 | 精品国产欧美 | 国产一级片免费播放 | 午夜av免费| 日韩小视频| 91麻豆精品国产自产 | 综合色影院| 亚洲精品乱码久久久久久蜜桃动漫 | 国产99久久精品一区二区永久免费 | 日日夜夜噜 | 国产午夜精品免费一区二区三区视频 | 国产视频亚洲精品 | 久久久久欠精品国产毛片国产毛生 | 精品久久久久久久久中文字幕 | 久久精品男人的天堂 | 草久中文字幕 | 91麻豆免费看 | 国产69精品久久app免费版 | 91视频免费观看 | 久久久久国产精品厨房 | 久久66热这里只有精品 | 99 精品 在线| 国产精品视频地址 | 91精品国自产拍天天拍 | 99精品在这里 | 国产aaa免费视频 | 免费高清影视 | 九九久 | 欧美va电影 | 在线a人v观看视频 | 人人干人人草 | 天天做天天看 | 国产精品久久久久9999吃药 | 欧美日本一区 | 黄色精品一区二区 | 色婷婷色 | 亚洲综合五月天 | 成人一区二区三区中文字幕 | 五月开心激情网 | 五月天堂色 | 中文字幕在线免费观看视频 | 国产成人黄色在线 | 97超碰影视 | 黄色av电影网 | 欧美久久久久久久久久久久久 | 免费观看一区 | www.精选视频.com | 亚洲午夜久久久久久久久电影网 | 四虎小视频 | 三级黄色在线 | 在线视频久久 | 国产尤物在线 | 国产日韩精品欧美 | 免费一级黄色 | 日韩精品一区二区三区中文字幕 | av中文字幕免费在线观看 | 亚洲精品免费在线播放 | 视频91 | 婷婷中文字幕综合 | 狠狠色丁香婷综合久久 | 国产精久久 | 中文字幕在线视频网站 | 国产福利电影网址 | 一区二区视频欧美 | 日韩av快播电影网 | 81精品国产乱码久久久久久 | 国产高清在线看 | 午夜久久福利影院 | 成人毛片网 | 日韩在线影视 | 91在线资源 | 黄色在线网站噜噜噜 | 91成人精品一区在线播放69 | 久久精品免费看 | 亚洲精品美女免费 | 国产在线观 | 韩国一区在线 | 国产小视频网站 | av资源免费在线观看 | 午夜精品久久久久久久99婷婷 | 亚洲1区 在线 | 一区二区三区在线不卡 | 国产精品av在线免费观看 | 国产亚洲精品成人av久久影院 | 69精品视频在线观看 | 国产精品成人免费 | 在线免费观看黄网站 | 亚洲视频精品 | 天天干,夜夜爽 | 国产精品va在线观看入 | 九九综合九九综合 | 国产在线观看网站 | 久久成人亚洲欧美电影 | 天天做日日爱夜夜爽 | 日本中文字幕在线免费观看 | 中文字幕在线视频一区二区 | 激情伊人五月天 | 手机av电影在线 | av中文字幕在线观看网站 | 亚洲精品视频在线观看免费视频 | 久久久免费网站 | 丁五月婷婷 | 国产一区精品在线 | 精品一区在线 | 精品一区二区三区电影 | 99久久久成人国产精品 | 精品国产乱子伦一区二区 | 天天操比 | 日韩特级黄色片 | 一区二区视频欧美 | 国产成人91 | 久久久综合色 | 999ZYZ玖玖资源站永久 | 久久99最新地址 | 97综合视频 | 久久69精品| 久草免费在线视频观看 | 日韩精品一区二区在线 | 在线观看日韩中文字幕 | 免费视频久久久久 | 九九免费精品视频 | 欧美视频日韩 | 激情伊人 | 婷婷网五月天 | 日韩免费视频线观看 | 婷婷综合视频 | 97自拍超碰 | 97久久久免费福利网址 | 精品国产成人在线影院 | 毛片精品免费在线观看 | 亚洲 成人 欧美 | 激情伊人五月天 | 亚洲国产欧美一区二区三区丁香婷 | 国产成人免费在线 | 久久电影网站中文字幕 | 69夜色精品国产69乱 | 一区二区三区四区在线免费观看 | 国产视频一二三 | 欧美成人aa | 波多野结衣在线视频一区 | 国产一区二区久久精品 | 久久草草热国产精品直播 | 超碰在线97免费 | www.福利视频| 91精品国产亚洲 | 亚洲精品视频在线免费 | 久久大香线蕉app | 成人精品久久久 | 久久久久看片 | 99c视频高清免费观看 | 奇米影视777四色米奇影院 | 国产网站在线免费观看 | 国产精品第2页 | 玖玖爱免费视频 | 日韩专区 在线 | 免费午夜视频在线观看 | 日本最新中文字幕 | 6080yy精品一区二区三区 | 在线观看视频一区二区三区 | 在线观看亚洲a | 国产美女主播精品一区二区三区 | 日韩精品免费一区二区 | 日本黄色免费在线观看 | 成人av一区二区兰花在线播放 | 99久久这里有精品 | 午夜精品婷婷 | 97**国产露脸精品国产 | 天天射天天艹 | 99热精品国产一区二区在线观看 | 四虎成人网 | 91久久精品日日躁夜夜躁国产 | 久久九九精品 | 激情久久小说 | 中文字幕在线视频第一页 | 精品自拍sae8—视频 | 99在线免费观看视频 | 91麻豆精品国产午夜天堂 | 亚洲欧洲日韩在线观看 | 天天操天天综合网 | 精品国产91亚洲一区二区三区www | 精品中文字幕在线观看 | 亚洲精选久久 | 欧美日本不卡 | 亚洲va欧洲va国产va不卡 | 国产亚洲精品久久 | 91探花视频 | 中文字幕精品久久 | 国产成人免费在线观看 | 狠狠狠狠干 | 欧美一级乱黄 | 91精品国产自产老师啪 | 国产精品免费一区二区三区 | 欧美国产亚洲精品久久久8v | 91九色最新地址 | 在线观看日韩免费视频 | 精品人人爽| 免费看污污视频的网站 | 一区二区精品视频 | av在线播放观看 | 亚洲欧美偷拍另类 | 国产一区二区在线免费 | 99久热 | 超碰97中文 | 久久99精品国产一区二区三区 | 日本最新高清不卡中文字幕 | 日韩在线高清免费视频 | 午夜 免费 | 亚洲视频在线免费观看 | 久久国语露脸国产精品电影 | 香蕉视频在线播放 | 成年人在线观看免费视频 | 久久久人人爽 | 日日夜夜综合 | 欧美国产不卡 | 免费欧美精品 | 成人午夜网址 | 中文字幕三区 | 热精品 | 免费三级网 | 色婷婷免费视频 | 少妇按摩av | 开心激情综合网 | 国产精品综合在线 | 91成人午夜 | 国产精品一区二区美女视频免费看 | 亚洲综合视频在线 | 99久久久久久久 | av黄网站 | 狠狠色综合网站久久久久久久 | 91超级碰 | 亚洲婷婷免费 | 午夜 久久 tv | 日韩一级片大全 | 日韩久久一区二区 | 四虎国产精品免费 | 天天人人综合 | 久久久人人爽 | 欧美在线视频一区二区 | 最新av在线播放 | 精品欧美一区二区精品久久 | 精品999| 国产小视频你懂的在线 | 中文字幕亚洲国产 | 久久99精品久久久久久三级 | 日韩av片免费在线观看 | 97视频免费播放 | 福利视频 | 91福利社区在线观看 | 国产一区二区精品久久91 | 91精品人成在线观看 | 最新中文字幕在线播放 | 美女黄频视频大全 | zzijzzij日本成熟少妇 | 欧美一级片免费播放 | 欧美日韩在线观看一区二区 | 国产精品久久久久久久久久 | 中文字幕日韩伦理 | av怡红院| 日韩av中文 | 中文字幕一区二区三区在线观看 | 国产黄色片在线 | 一区二区三区视频 | 天天操网址 | av一级久久| 日韩av中文字幕在线免费观看 | 亚洲综合激情 | 日韩中文字幕在线 | 日韩精品中文字幕av | 久久福利精品 | 久久人人爽人人爽人人 | 久久国产一区二区 | 国语精品免费视频 | 国产97av| 日韩成人在线免费观看 | 国产一区二区精品久久91 | 免费日韩 精品中文字幕视频在线 | 久艹视频在线观看 | 国产视频在线播放 | 国产精品久久久久永久免费观看 | 日韩剧情 | 激情综合网五月婷婷 | 黄色成品视频 | 最新日本中文字幕 | 日韩欧美在线观看一区二区三区 | 99精品欧美一区二区蜜桃免费 | 天天色天天骑天天射 | av不卡中文字幕 | 国产精品99久久久久人中文网介绍 | 91禁在线观看 | 成年人在线电影 | 亚洲欧美成人综合 | 中文在线最新版天堂 | 成人黄色大片 | 国产成人精品综合久久久 | 国产一级在线免费观看 | 日韩在线观看电影 | 黄色av免费电影 | 一本一道久久a久久精品 | 黄色三级av | 日韩中文字幕第一页 | 久久精品一区二区国产 | 玖玖玖在线 | 免费看一级特黄a大片 | av三级在线免费观看 | 六月丁香激情综合色啪小说 | 亚洲影院国产 | 中文一区在线观看 | 91麻豆.com| 色综合久久五月天 | av片子在线观看 | 日韩欧美国产视频 | 成人国产精品电影 | 日日干夜夜操视频 | 国产成人综合精品 | av直接看| 久久久久久久99 | 国产成人精品免高潮在线观看 | 成人免费看片网址 | 国产精品毛片久久久 | 国产成人一二片 | 欧美xxxx性xxxxx高清 | avav99| 日韩在线视频网址 | 日韩免费福利 | 国产精品九九九九九九 | 色综合天天在线 | 亚洲国产精品久久久 | 日韩网站一区二区 | 免费看片亚洲 | 久久久国产精品一区二区三区 | 黄色毛片一级片 | 国产精品免费久久久久久久久久中文 | 少妇bbb好爽| 亚洲国产精品一区二区尤物区 | 福利视频导航网址 | 91九色网站 | 欧美a级片网站 | 久久精品网站视频 | 国产精品视频在线观看 | 欧美精品天堂 | 婷婷资源站 | 久久久综合 | 91精品国产一区二区在线观看 | 国产精品久久麻豆 | 丁香婷婷综合激情 | 日韩精品观看 | 久青草电影 | 国内精品久久影院 | 天天干.com | 欧美日韩中文在线 | 久久香蕉电影网 | 欧洲av不卡| 99麻豆久久久国产精品免费 | 午夜精品一区二区国产 | 操操操日日日 | 在线免费观看的av网站 | 亚洲精品动漫久久久久 | 香蕉91视频 | 91超碰免费在线 | 国产人免费人成免费视频 | 日本h在线播放 | 日韩在线观看一区二区 | 男女全黄一级一级高潮免费看 | 性日韩欧美在线视频 | 色综合天天色综合 | 啪啪免费视频网站 | 久久伊人爱 | 97免费在线观看视频 | 97超碰人人爱 | 国产精品99免费看 | 成人综合日日夜夜 | 九九亚洲视频 | 天天射综合 | 国产精品3 | 免费黄a大片 | 伊人伊成久久人综合网站 | 久草精品免费 | 激情av在线资源 | 成人黄色av网站 | 四虎国产精品成人免费4hu | 在线观看视频在线观看 | 国产亚洲片 | 国产精品成人a免费观看 | 国产成人高清 | 狠狠久久婷婷 | 欧美91片 | 欧美日韩国产综合一区二区 | 国产不卡免费 | 91精品在线免费视频 | 青春草国产视频 | 久久天堂亚洲 | 亚洲理论在线观看 | 视频国产在线 | 日本中文字幕在线播放 | 亚洲视频电影在线 | 亚洲人成人99网站 | 日韩欧美高清免费 | 人人爱爱 | 国产亚洲精品久久久网站好莱 | 九九久久久久久久久激情 | 亚洲 欧美 91 | 99re8这里有精品热视频免费 | 日韩欧美99 | 男女全黄一级一级高潮免费看 | 97视频免费在线看 | 中文字幕有码在线观看 | 亚洲蜜桃av | 国产在线观看网站 | 久久香蕉国产精品麻豆粉嫩av | 在线中文日韩 | 欧美精品乱码99久久影院 | 欧美性春潮 | 中文字幕视频一区二区 | 九九免费在线观看 | 99中文视频在线 | 超碰97av在线 | 新av在线 | 免费在线观看污 | 久操中文字幕在线观看 | 精品久久国产 | 日韩在线激情 | 国产在线视频一区 | 日韩在线免费看 | 国产丝袜高跟 | 久久久精品免费看 | .精品久久久麻豆国产精品 亚洲va欧美 | 91九色性视频 | 狠狠狠狠狠狠干 | 欧美精品乱码久久久久 | 国产免费观看久久黄 | 91av看片| 999久久久久久久久久久 | 91久久久久久久 | 亚洲精品乱码久久久久久按摩 | 国产午夜精品久久久久久久久久 | 久久久九色精品国产一区二区三区 | 91久久久久久久 | 国产高清视频在线播放一区 | 国产二区av | 日韩中文幕| 最近av在线| 欧美 日韩 视频 | 成人免费大片黄在线播放 | 91av在线免费 | 免费高清在线观看成人 | 五月天堂色 | 亚洲蜜桃在线 | 国产精品网址在线观看 | 精品国产1区二区 | 婷婷色影院| 国产成人一区二区三区久久精品 | 91综合久久一区二区 | 日韩欧美一区二区三区视频 | 在线小视频你懂的 | 日韩在线中文字幕 | 一本一本久久aa综合精品 | 高清av在线免费观看 | 久久久久久久电影 | 国产精品久久久久一区二区国产 | 九九精品在线观看 | 天天天色综合a | 久草在线官网 | 久草视频免费 | 久久99精品国产99久久6尤 | 国产在线理论片 | 亚洲成人av片 | 亚洲精品在线免费观看视频 | 久久手机在线视频 | 亚洲欧美日韩精品久久奇米一区 | 四虎成人精品永久免费av九九 | 久久爽久久爽久久av东京爽 | 热久久99这里有精品 | 久久99精品热在线观看 | www欧美xxxx| 亚洲 欧洲 国产 精品 | 日韩女同av | 激情五月综合网 | 91爱爱视频 | www91在线观看| 97超碰在线免费 | 国产色婷婷精品综合在线手机播放 | 黄色一级网 | 国产精品免费视频一区二区 | 去看片| 久热av在线| 日本最新一区二区三区 | 天天色天天色 | 91香蕉视频在线 | 欧美在线91| 最新婷婷色 | 亚洲在线免费视频 | 久热爱 | 亚洲精品无 | 国产黄a三级三级 | 国产精品久久精品国产 | 天堂黄色片 | 91九色蝌蚪国产 | 日韩精品一区二区三区中文字幕 | 91大神在线看 | 久久精品8 | 亚洲欧洲日韩在线观看 | 超碰97网站 | 91福利视频一区 | 国产vs久久 | 中文字幕一区二区三区四区视频 | 韩日在线一区 | 国产夫妻自拍av | 在线观看av国产 | 国产日韩精品一区二区三区在线 | 久久伊人综合 | 久久激情片 | 日韩欧美大片免费观看 | 韩国精品视频在线观看 | 日韩欧美在线视频一区二区 | 六月激情丁香 | 中文字幕中文字幕在线中文字幕三区 | www色婷婷com| 97影视| 亚洲精品欧美视频 | 在线亚洲播放 | 亚洲va欧洲va国产va不卡 | 国产精品欧美久久久久无广告 | 国产精品一区二区在线播放 | 人人澡人摸人人添学生av | 国产高清无线码2021 | 久草在线久草在线2 | 综合色婷婷 | 91看片淫黄大片在线播放 | 国产视频亚洲精品 | 欧美精品乱码99久久影院 | 大胆欧美gogo免费视频一二区 | 国产精品免费一区二区三区在线观看 | 亚洲国产欧美在线看片xxoo | 91看片在线观看 | 久久艹艹 | 国产99久久精品一区二区300 | 日本中文字幕在线观看 | 99精品久久久久久久 | 日韩精品亚洲专区在线观看 | 国产精品亚洲片夜色在线 | 91av观看| 国产露脸91国语对白 | 亚洲精品免费看 | 日日操夜夜操狠狠操 | 日本婷婷色| 精品久久一二三区 | 91在线亚洲 | 精品1区2区 | 一本色道久久精品 | 日日夜夜爱| 久产久精国产品 | 欧美成人69av | 欧美日韩伦理一区 | 中文字幕观看在线 | 91麻豆精品国产91久久久无限制版 | 国际精品久久久 | 波多野结衣理论片 | 中文字幕乱码电影 | 五月天中文在线 | 欧美午夜精品久久久久久浪潮 | 色婷婷精品大在线视频 | 国产91在线免费视频 | 欧美激情精品久久久 | 午夜丁香网 | 18pao国产成视频永久免费 | 五月天堂色 | 亚洲欧美日本一区二区三区 | 六月丁香久久 | 久久久免费电影 | 日本在线观看一区二区 | 91精品啪 | 黄色一区三区 | 精品国产伦一区二区三区免费 | 日韩欧美精品免费 | 国产日韩欧美在线免费观看 | av大全在线免费观看 | 在线观看一级片 | 国产电影一区二区三区四区 | 国产精品一区二区62 | av免费看在线 | 中文字幕文字幕一区二区 | 久要激情网 | 九九电影在线 | 久久久www成人免费精品 | 黄在线免费看 | 中文字幕在线观看视频免费 | 色999在线| 四虎在线视频免费观看 | 欧美视频一区二 | 日韩精品视频在线观看免费 | 久久久久久久久久久黄色 | 视频 天天草 | 成人av电影免费在线播放 | 欧美黑吊大战白妞欧美 | 操操操操网 | 天天草天天 | 91福利区一区二区三区 | 992tv在线成人免费观看 | 亚洲男男gaygayxxxgv | 欧美日韩高清一区二区 国产亚洲免费看 | 成人综合婷婷国产精品久久免费 | 欧美色伊人 | 午夜av免费观看 | 免费高清在线观看电视网站 | 在线观看国产日韩欧美 | 9久久精品 | 黄色三级在线看 | 久久伊人五月天 | 国产性天天综合网 | av中文字幕免费在线观看 | 色香蕉网 | 亚洲少妇xxxx| 91豆花在线| 午夜精品久久久久久久久久久久久久 | 伊人狠狠色丁香婷婷综合 | 在线视频第一页 | 天天操天天是 | 91在线国产观看 | 久久免费一 | 日韩av一区二区在线播放 | 亚洲夜夜综合 | 99热这里只有精品1 av中文字幕日韩 | 中文字幕视频网站 | 国产又粗又猛又黄又爽视频 | 亚洲精品在线观看视频 | 国产精品一区二区在线免费观看 | 最近日本韩国中文字幕 | 亚洲精品国产精品国 | a特级毛片 | 九九色在线观看 | 国产99久久精品一区二区300 | 成人xxxx | 2019中文字幕第一页 | 不卡av免费在线观看 | 久久av电影| 在线国产99 | 99热 精品在线 | 日韩国产欧美在线视频 | 日韩久久久久久久久久久久 | 日韩中文字幕国产 | 婷婷伊人网 | 啪啪精品 | 在线观看欧美成人 | 96亚洲精品久久久蜜桃 | 国产精品久久久久av免费 | 色五月成人 | 成人欧美一区二区三区黑人麻豆 | 91tv国产成人福利 | 日韩视频一区二区在线 | 国产99久久久精品 | 99久久精品国产免费看不卡 | 人人看人人做人人澡 | 亚洲精品在线视频 | 天天干天天操天天操 | 粉嫩av一区二区三区四区 | 亚洲专区视频在线观看 | 欧美粗又大 | 亚洲一级特黄 | 国产精品一区二区三区视频免费 | 黄色免费高清视频 | 在线观看成人av | 亚洲免费av网站 | 亚洲国产精品成人av | 国产中文字幕在线免费观看 | 日精品在线观看 | 日韩欧美在线高清 | 99在线免费观看 | 成年在线观看 | 免费高清在线视频一区· | 色姑娘综合天天 | 精品久久久久久久久久久久久 | 天天舔天天射天天操 | 国产精品久久久久影院 | 激情欧美xxxx| 国产精品黄网站在线观看 | 黄色大片日本免费大片 | 国产一区视频导航 | 日韩欧美在线一区 | 香蕉视频在线看 | 国产91精品一区二区麻豆亚洲 | 亚洲精品99 | 亚洲午夜精品久久久久久久久久久久 | 高清国产一区 | 国产黄影院色大全免费 | 日韩精品一区在线播放 | 成人一区二区三区中文字幕 | 波多野结衣在线观看一区二区三区 | 欧美大片www | 天天射天天射天天 | 午夜.dj高清免费观看视频 | 久草香蕉在线视频 | 色播99| 在线观看黄av | 一色屋精品视频在线观看 | 久久久久久蜜av免费网站 | 国产精品第十页 | 97超碰成人在线 | 玖玖在线看 | 国产老妇av | 国产精品一区欧美 | 国产涩涩网站 | 欧美在线一级片 | 免费黄色小网站 | 国产一区欧美二区 | 国产亚洲精品精品精品 | 亚洲免费色 | 成人cosplay福利网站 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 日韩av黄| 亚洲天堂网在线观看视频 | 亚洲涩综合 | 91精品国产九九九久久久亚洲 | 久久国产精品99国产 | 永久免费的av电影 | 精品亚洲欧美无人区乱码 | 色综合久久精品 | 欧美日韩国产在线 | 久99久中文字幕在线 | 日韩久久精品一区 | 国产高清免费av | 国产高清黄 | 91综合久久一区二区 | 日韩欧美一区二区三区视频 | 一级黄色片毛片 | 精品国偷自产国产一区 | 看av在线| 国产又粗又硬又爽视频 | 欧美一级xxxx| 欧美日韩视频免费 | 日韩综合在线观看 | 日韩精品视频久久 | 在线国产能看的 | 久久精品79国产精品 | 精精国产xxxx视频在线播放 | www色com| 天天曰视频 | 成人毛片在线观看 | 看av免费 | 日韩三级视频在线观看 | 中文在线字幕观看电影 | 97色在线观看免费视频 | 精品久久一二三区 | 成人电影毛片 | 黄网av在线 | 香蕉视频国产在线 | 在线免费黄色av | 日韩专区在线观看 | 手机看片国产 | 亚洲国产精品电影 | 久久久精品一区二区 | 欧美-第1页-屁屁影院 | 精品国产大片 | 国产精品免费视频网站 | 亚洲国产午夜视频 | 极品久久久久 | 国产精品porn | 懂色av一区二区在线播放 | 国产手机av在线 | 亚洲国产免费 | 久久精品99国产精品亚洲最刺激 | 久久99网站| 成人黄色大片网站 | 99婷婷 | 欧美婷婷色 | 9幺看片 |