青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

二維圖形的使用(2)

 

本篇是二維圖形的使用(1)的續(xù)篇。

從計(jì)算機(jī)游戲產(chǎn)生之初到現(xiàn)在,創(chuàng)建一個(gè)貼片引擎的首選方法仍然是最常用的二維圖形技術(shù)。繪制基本的貼片地圖是一個(gè)快速而輕松的過程,只需要循環(huán)那些行與列,并繪制貼片即可,所繪制的貼片總數(shù)是基于貼片的大小以及顯示率的。

大多數(shù)基于貼片的游戲運(yùn)用了多重層次(場(chǎng)景被堆疊起來),以便創(chuàng)建出一些非常酷的效果,如下圖所示:

比如,首先繪制地面,再在地面上繪制角色,然后再繪制其他相互重疊的對(duì)象層次,就可以模擬出一個(gè)三維的場(chǎng)景。

為了使用多重層次,可以申明另外不同的地圖數(shù)組(每個(gè)層次都有一個(gè)地圖數(shù)組),并使用它自己的貼片信息來填充它。從第一個(gè)層次開始,繪制包含在該層次中的每個(gè)貼片。在繪制好層次中的最后一個(gè)貼片后,移動(dòng)到下一個(gè)層次繼續(xù)繪制它的貼片,直到繪制完所有的層次。

添加對(duì)象

角色以及其他移動(dòng)的對(duì)象只需被作為自由浮動(dòng)的貼片來進(jìn)行繪制,而不需要為他們使用一個(gè)地圖數(shù)組。更確切的說,要根據(jù)所有的角色和對(duì)象在世界中的各自坐標(biāo)來記錄它們,然后把那些對(duì)象的坐標(biāo)轉(zhuǎn)換為它們準(zhǔn)備在屏幕上進(jìn)行繪制的坐標(biāo),也就是它們出現(xiàn)在視野里的坐標(biāo)。

為了使事情保持簡(jiǎn)單,設(shè)置一個(gè)結(jié)構(gòu)體來存儲(chǔ)對(duì)象的坐標(biāo)和貼片索引。

typedef struct OBJECT_INFO
{
    
long x_pos, y_pos;
    
char tile_index;
} *OBJECT_INFO_PTR;

將把每件可以自由移動(dòng)的事物認(rèn)為是一個(gè)對(duì)象,包括玩家的角色。

 

平滑卷軸

操作貼片引擎時(shí),大型的地圖需要卷軸以便玩家可以看到整個(gè)地圖,具體說,在繪制地圖時(shí)嘗試去改變坐標(biāo),貼片引擎就會(huì)產(chǎn)生一個(gè)急促的運(yùn)動(dòng)。為了提高引擎的視覺質(zhì)量,需要使用一種稱之為平滑卷軸(smooth scrolling)的技術(shù)來使運(yùn)動(dòng)平滑地進(jìn)行。

為了實(shí)現(xiàn)平滑卷軸,將貼片繪制的地圖想象成一個(gè)很大的位圖。在位圖中的每個(gè)像素都有它自己的一對(duì)坐標(biāo),即所謂的地圖的精細(xì)坐標(biāo),代表貼片像素的每個(gè)分組被賦予它自己的地圖坐標(biāo)集,如下圖所示:

舉個(gè)例子,如果貼片是16 x 16像素大小,同時(shí)地圖數(shù)組為10 x 10,當(dāng)完全渲染時(shí),地圖將會(huì)為160 x 160像素大小(這就意味著地圖有一個(gè)分辨率為160 x 160 的精細(xì)坐標(biāo))。

 

創(chuàng)建一個(gè)地圖類

為了使游戲保持運(yùn)行的平滑,首先需要對(duì)每一幀所繪制的自由浮動(dòng)貼片的數(shù)量(子畫面)進(jìn)行限制,一個(gè)宏定義將出色地完成這個(gè)工作,它會(huì)通知地圖類在每一幀中繪制了多少子畫面:

#define MAX_OBJECTS 1024

每個(gè)地圖類的實(shí)例可以存儲(chǔ)大量的層次(甚至超過一百萬個(gè)),將每個(gè)層次的貼片數(shù)據(jù)存儲(chǔ)到一個(gè)數(shù)組_map_info里。因?yàn)榈貓D的尺寸大小一旦被創(chuàng)建,將是固定不變的,可以通過計(jì)算在_map_info數(shù)組里的當(dāng)前位移,并利用一個(gè)指針對(duì)每個(gè)層次的貼片數(shù)據(jù)進(jìn)行讀取或?qū)懭搿?/p>

來看看MAP類的定義:

#define MAX_OBJECTS     1024

typedef 
struct OBJECT_INFO
{
    
long x_pos, y_pos;
    
char tile_index;
} *OBJECT_INFO_PTR;

//=========================================================================================
// This class encapsulate 2D map draw.
//=========================================================================================
typedef class MAP
{
public:
    MAP();
    ~MAP();

    
// function to create and free a map class
    BOOL create(long num_layers, long map_column, long map_row);
    
void free();

    
// function to set a map's layer data
    BOOL set_map_layer_data(long layer_index, char* layer_data);

    
// function to clear and add an object to list
    void clear_object_list();
    BOOL add_object(
long x_pos, long y_pos, char tile_index);

    
char* get_ptr(long layer_index);    // get pointer to map array
    long  get_map_column();             // get column of map
    long  get_map_row();                // get row of map

    // assign TILE object to use for drawing map tiles
    BOOL use_tile(TILE_PTR tile);

    
// Render map using specified top-left map coordinates,
    // as well as number of columns and rows to draw, plus layer used to draw objects.
    BOOL render(long pos_x, long pos_y,
                
long num_rows, long num_columns,
                
long object_layer,
                D3DCOLOR color = 0xFFFFFFFF,
                
float scale_x = 1.0f, float scale_y = 1.0f);

private:
    
long        _map_column;   // column of map
    long        _map_row;      // row of map
    long        _per_layer_size; // size of per map

    
long        _num_layers;   // number of layers
    char*       _map_info;     // array for tile informarion
    TILE_PTR    _tile;         // pointer to TILE object

    
long        _num_objects_to_draw;       // number of object need to be drawed
    OBJECT_INFO _objects_info[MAX_OBJECTS]; // object information array
} *MAP_PTR;

實(shí)現(xiàn):

/*************************************************************************
PURPOSE:
    Implement for 2D map.
*************************************************************************/


#include "core_global.h"
#include "tile.h"
#include "map.h"

//----------------------------------------------------------------------------------
// Constructor, zero member data.
//----------------------------------------------------------------------------------
MAP::MAP()
{
    memset(
this, 0, sizeof(*this));
}

//----------------------------------------------------------------------------------
// Destructor, release allocated resources.
//----------------------------------------------------------------------------------
MAP::~MAP()
{
    free();
}

//----------------------------------------------------------------------------------
// Release allocated resources.
//----------------------------------------------------------------------------------
void MAP::free()
{
    
// free map information array
    delete[] _map_info;
    _map_info = NULL;

    _map_column = _map_row = 0;
    _num_layers = 0;    
}

//----------------------------------------------------------------------------------
// Create map object.
//----------------------------------------------------------------------------------
BOOL MAP::create(long num_layers, long map_column, long map_row)
{
    
// free a prior map
    free();

    
// save number of layers, map column and row.
    _num_layers   = num_layers;
    _map_column   = map_column;
    _map_row      = map_row;
    _per_layer_size = map_column * map_row;

    
long total_map_size = num_layers * _per_layer_size;

    
// allocate map data memory
    if((_map_info = new char[total_map_size]) == NULL)
        
return FALSE;

    
// clear it out
    ZeroMemory(_map_info, total_map_size);

    
// reset number of objexts to draw
    _num_objects_to_draw = 0;

    
return TRUE;
}

//----------------------------------------------------------------------------------
// Set map data.
//----------------------------------------------------------------------------------
BOOL MAP::set_map_layer_data(long layer_index, char* layer_data)
{
    
// error checking
    if(layer_index >= _num_layers)
        
return FALSE;

    
// copy over data
    memcpy(&_map_info[layer_index * _per_layer_size], layer_data, _per_layer_size);

    
return TRUE;
}

//----------------------------------------------------------------------------------
// Clear object list which need to be drawed.
//----------------------------------------------------------------------------------
void MAP::clear_object_list()
{
    _num_objects_to_draw = 0;
}

//----------------------------------------------------------------------------------
// Add object to object list.
//----------------------------------------------------------------------------------
BOOL MAP::add_object(long x_pos, long y_pos, char tile_index)
{
    
if(_num_objects_to_draw < MAX_OBJECTS)
    {
        _objects_info[_num_objects_to_draw].x_pos      = x_pos;
        _objects_info[_num_objects_to_draw].y_pos      = y_pos;
        _objects_info[_num_objects_to_draw].tile_index = tile_index;

        _num_objects_to_draw++;

        
return TRUE;
    }

    
return FALSE;
}

//----------------------------------------------------------------------------------
// Return pointer to specfied layer map data.
//----------------------------------------------------------------------------------
char* MAP::get_ptr(long layer_index)
{
    
if(layer_index >= _num_layers)
        
return NULL;

    
return &_map_info[layer_index * _per_layer_size];
}

//----------------------------------------------------------------------------------
// Return map columns.
//----------------------------------------------------------------------------------
long MAP::get_map_column()
{
    
return _map_column;
}

//----------------------------------------------------------------------------------
// Return map rows.
//----------------------------------------------------------------------------------
long MAP::get_map_row()
{
    
return _map_row;
}

//----------------------------------------------------------------------------------
// Set tile to map.
//----------------------------------------------------------------------------------
BOOL MAP::use_tile(TILE_PTR tile)
{
    
if((_tile = tile) == NULL)
        
return FALSE;

    
return TRUE;
}

//----------------------------------------------------------------------------------
// Render map.
//----------------------------------------------------------------------------------
BOOL MAP::render(long pos_x, long pos_y, 
                 
long num_rows, long num_columns, 
                 
long object_layer, 
                 D3DCOLOR color,
                 
float scale_x, float scale_y)
{
    
// error checking
    if(_map_info == NULL || _tile == NULL)
        
return FALSE;

    
long tile_width  = _tile->get_tile_width(0);
    
long tile_height = _tile->get_tile_height(0);

    
// calculate smooth scrolling variables
    long map_x = pos_x / tile_width;
    
long map_y = pos_y / tile_height;
    
long off_x = pos_x % tile_width;
    
long off_y = pos_y % tile_height;    

    
// loop through each layer
    for(long layer = 0; layer < _num_layers; layer++)
    {
        
// get a pointer to the map data
        char* map_ptr = &_map_info[layer * _per_layer_size];

        
// loop for each row and column
        for(long row = 0; row < num_rows+1; row++)
        {
            
for(long column = 0; column < num_columns+1; column++)
            {
                
// get the tile index to draw
                char tile_index = map_ptr[(row + map_y) * _map_column + column + map_x];

                
long screen_x = column * tile_width  - off_x;
                
long screen_y = row    * tile_height - off_y;

                
// draw tile                
                _tile->draw_tile(0, tile_index, (DWORD)screen_x, (DWORD)screen_y, color, scale_x, scale_y);
            }
        }

        
// draw objects if on object layer
        if(layer == object_layer)
        {
            
for(long i = 0; i < _num_objects_to_draw; i++)
            {
                _tile->draw_tile(0, _objects_info[i].tile_index,
                                 _objects_info[i].x_pos - off_x, _objects_info[i].y_pos - off_y,
                                 color, scale_x, scale_y);
            }
        }
    }

    
return TRUE;
}

我們接著編寫兩個(gè)例子來測(cè)試,第一個(gè)例子演示了基本貼片技術(shù)的使用,第二個(gè)例子演示了平滑卷軸的使用。

來看看第一個(gè)例子:

下載源碼和工程

/*****************************************************************************
PURPOSE:
    Test for class TILE and MAP.
*****************************************************************************/


#include "Core_Global.h"
#include "tile.h"
#include "map.h"

#pragma warning(disable : 4996)

class APP : public APPLICATION
{
public:
    APP()
    {
        _width  = 384;
        _height = 384;

        _style = WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU;

        strcpy(_class_name, "scale_tile_class");
        strcpy(_caption, "scale tile demo");
    }

    BOOL init()
    {
        
// initialize the graphics device and set display mode

        
if(! _graphics.init())
            
return FALSE;

        
if(! _graphics.set_mode(get_hwnd()  , TRUE, FALSE))
            
return FALSE;

        
// create and load the tile set

        
if(! _tile.create(&_graphics, 1))
            
return FALSE;

        
if(! _tile.load_texture(0, "tiles.bmp", 64, 64))
        {
            err_msg_box("load texture failed.");
            
return FALSE;
        }

        
// create and set the map

        
char map_data[3][3] = {
            { 0, 1, 0 },
            { 2, 2, 2 },
            { 1, 2, 3 }
        };

        _map.create(1, 3, 3);
        _map.set_map_layer_data(0, (
char*) &map_data);
        _map.use_tile(&_tile);

        
return TRUE;
    }

    BOOL APP::frame()
    {           
        
// calculate elapsed time
        static DWORD s_last_time = timeGetTime();
        DWORD now_time = timeGetTime();

        DWORD elapsed_time = now_time - s_last_time;

        
// frame lock to 30ms per frame
        if(elapsed_time < 30)
            
return TRUE;
    
        s_last_time = now_time;         

        
if(_graphics.begin_scene())
        {
            
if(_graphics.begin_sprite())
            {
                D3DCOLOR color;        

                
static uchar s_red = 0, s_green = 0, s_blue = 0;
                
static BOOL s_increment_color = TRUE;

                
if(s_increment_color)
                {
                    color = D3DCOLOR_RGBA(s_red++, s_green++, s_blue++, 255);

                    
if(s_red >= 255)         
                        s_increment_color = FALSE;
                }
                
else
                {
                    color = D3DCOLOR_RGBA(s_red--, s_green--, s_blue--, 255);

                    
if(s_red <= 0)
                        s_increment_color = TRUE;
                }

                
// draw the map
                _map.render(0, 0, 3, 3, 0, color, 2.0f, 2.0f);

                _graphics.end_sprite();
            }

            _graphics.end_scene();

            _graphics.display();
        }

        
return TRUE;
    }

    BOOL shutdown()
    {
        
return TRUE;
    }

private:
    GRAPHICS    _graphics;
    TILE        _tile;
    MAP         _map;
};

int PASCAL WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
{
  APP app;

  
return app.run();
}

該程序淡入淡出地改變貼圖的顏色,截圖如下:

 

接著來看第二個(gè)例子:

下載源碼和工程

/*****************************************************************************
PURPOSE:
    Test for class TILE and MAP.
*****************************************************************************/


#include "Core_Global.h"
#include "tile.h"
#include "map.h"

#pragma warning(disable : 4996)

#define TILE_WIDTH      64
#define TILE_HEIGHT     64

#define MAP_COLUMNS     16
#define MAP_ROWS        16

#define TOTAL_MAP_SIZE  1024

class APP : public APPLICATION
{
public:
    APP()
    {
        _width  = 640;
        _height = 480;

        _num_columns_to_draw = _width / TILE_WIDTH;
        _num_rows_to_draw    = _height / TILE_HEIGHT;

        _max_move_width  = TOTAL_MAP_SIZE - _width;
        _max_move_height = TOTAL_MAP_SIZE - _height;

        _style = WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU;

        strcpy(_class_name, "map class");
        strcpy(_caption, "map demo");
    }

    BOOL init()
    {
        
// initialize the graphics device and set display mode

        
if(! _graphics.init())
            
return FALSE;

        
if(! _graphics.set_mode(get_hwnd(), TRUE, FALSE))
            
return FALSE;

        
// create and load the tile set

        
if(! _tile.create(&_graphics, 1))
            
return FALSE;

        
if(! _tile.load_texture(0, "tiles.bmp", TILE_WIDTH, TILE_HEIGHT))
        {
            err_msg_box("load texture failed.");
            
return FALSE;
        }

        
// create and set the map

        
char map_data[MAP_ROWS][MAP_COLUMNS] = {
            { 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0 },
            { 1, 2, 2, 1, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0 },
            { 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0 },
            { 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 0 },
            { 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 },
            { 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0 },
            { 3, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0 },
            { 3, 0, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0 },
            { 0, 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 2, 2, 1, 1, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 0 },
            { 0, 1, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 1, 1, 2, 0 },
            { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0 },
            { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0 },
            { 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
        };

        _map.create(1, MAP_COLUMNS, MAP_ROWS);
        _map.set_map_layer_data(0, (
char*) &map_data);
        _map.use_tile(&_tile);

        
return TRUE;
    }

    BOOL APP::frame()
    {
        
static long s_x_pos = 0, s_y_pos = 0;

        
// calculate elapsed time
        static DWORD s_last_time = timeGetTime();
        DWORD now_time = timeGetTime();

        DWORD elapsed_time = now_time - s_last_time;

        
// frame lock to 33ms per frame
        if(elapsed_time < 33)
            
return TRUE;

        s_last_time = now_time;

        
if(_graphics.begin_scene())
        {
            
if(_graphics.begin_sprite())
            {
                
// draw the map
                _map.render(s_x_pos, s_y_pos, _num_rows_to_draw, _num_columns_to_draw, 0, 0xFFFFFFFF, 1.0f, 1.0f);

                
// press arrows to scroll map around

                
if(GetAsyncKeyState(VK_LEFT))   s_x_pos -= 8;
                
if(GetAsyncKeyState(VK_RIGHT))  s_x_pos += 8;
                
if(GetAsyncKeyState(VK_UP))     s_y_pos -= 8;
                
if(GetAsyncKeyState(VK_DOWN))   s_y_pos += 8;

                
// bounds check map coordinates

                
if(s_x_pos < 0)
                    s_x_pos = 0;

                
if(s_x_pos > _max_move_width)
                    s_x_pos = _max_move_width;

                
if(s_y_pos < 0)
                    s_y_pos = 0;
    
                
if(s_y_pos > _max_move_height)
                    s_y_pos = _max_move_height;

                _graphics.end_sprite();
            }

            _graphics.end_scene();

            _graphics.display();
        }

        
return TRUE;
    }

    BOOL shutdown()
    {
        
return TRUE;
    }

private:
    GRAPHICS    _graphics;
    TILE        _tile;
    MAP         _map;

    
long        _num_columns_to_draw;
    
long        _num_rows_to_draw;

    
long        _max_move_width;
    
long        _max_move_height;
};

int PASCAL WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
{
  APP app;

  
return app.run();
}

該程序展示了平滑卷軸技術(shù)的使用,用上下左右鍵進(jìn)行控制,截圖如下:


posted on 2007-10-16 01:19 lovedday 閱讀(429) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区三区视频播放| 久久亚洲二区| 91久久综合亚洲鲁鲁五月天| 国产精品久久久久三级| 欧美电影在线观看| 午夜欧美大片免费观看| 99国产精品久久久久久久久久| 免费中文日韩| 久久精品卡一| 午夜精品久久久久久久久久久久| 亚洲人成网在线播放| 激情校园亚洲| 国产偷久久久精品专区| 国产精品大片| 欧美色网在线| 欧美精品免费看| 免费欧美在线| 久久亚洲精品一区二区| 欧美在线免费观看视频| 亚洲在线不卡| 亚洲网址在线| 亚洲视频第一页| 99精品热6080yy久久| 亚洲精品三级| 亚洲精品乱码久久久久久久久| 欧美成人首页| 免费在线国产精品| 蜜臀久久99精品久久久画质超高清 | 亚洲精品自在在线观看| 在线视频国内自拍亚洲视频| 国产区在线观看成人精品| 国产精品三级久久久久久电影| 欧美性生交xxxxx久久久| 欧美日韩亚洲综合一区| 欧美日韩伦理在线免费| 欧美三级网页| 国产精品护士白丝一区av| 欧美日韩国产影片| 欧美三区美女| 国产精品一卡二卡| 国产婷婷成人久久av免费高清| 国产日韩欧美在线视频观看| 国产一级精品aaaaa看| 极品少妇一区二区三区精品视频| 黑人巨大精品欧美一区二区| 韩国在线视频一区| 亚洲福利视频三区| 亚洲乱码精品一二三四区日韩在线| 亚洲理论在线| 亚洲制服av| 久久激情久久| 欧美阿v一级看视频| 亚洲国产精品黑人久久久| 亚洲免费观看| 亚洲永久网站| 久久久久久久久伊人| 欧美刺激午夜性久久久久久久| 欧美日一区二区三区在线观看国产免| 国产精品久久久久91| 国内成人自拍视频| 亚洲人成在线观看一区二区| 这里只有精品在线播放| 欧美中文字幕在线| 欧美高清hd18日本| 一本久久a久久免费精品不卡| 亚洲欧美日韩在线播放| 久久尤物电影视频在线观看| 欧美黄污视频| 国产毛片精品国产一区二区三区| 黄色精品一区二区| 制服丝袜亚洲播放| 久久综合伊人| 99国产一区| 久久久久久久综合日本| 欧美日韩在线播放三区| 国产亚洲视频在线观看| 亚洲伦理自拍| 久久激情视频久久| 亚洲精品美女在线观看| 欧美在线一二三四区| 欧美日本一道本| 好看的日韩视频| 亚洲视频欧洲视频| 噜噜噜久久亚洲精品国产品小说| 亚洲美女av黄| 久久免费视频这里只有精品| 欧美视频手机在线| 亚洲第一精品夜夜躁人人爽| 亚洲欧美另类综合偷拍| 亚洲电影天堂av| 欧美一区二区女人| 欧美日韩一区二区三区免费看| 国产揄拍国内精品对白| 亚洲一级电影| 欧美高清视频www夜色资源网| 亚洲天堂视频在线观看| 欧美福利视频在线观看| 国产一区在线看| 亚洲一区二区不卡免费| 亚洲国产三级在线| 久久精品人人做人人爽电影蜜月| 国产精品高潮呻吟| 亚洲精品中文字| 久热精品在线视频| 香蕉成人久久| 国产精品任我爽爆在线播放| a91a精品视频在线观看| 欧美国产精品va在线观看| 欧美有码视频| 国产毛片久久| 亚洲自拍偷拍一区| 亚洲毛片视频| 欧美人成免费网站| 亚洲精品一区二区三区樱花| 免费欧美网站| 久久亚洲春色中文字幕| 黄色成人免费网站| 久久久久久尹人网香蕉| 午夜视频在线观看一区二区| 国产精品久久久久9999吃药| 这里是久久伊人| 亚洲精选中文字幕| 欧美精品18| a4yy欧美一区二区三区| 亚洲人成网在线播放| 欧美激情精品久久久久久蜜臀| 亚洲国产欧美一区二区三区久久 | 亚洲美女av网站| 欧美人与性动交a欧美精品| 亚洲日本视频| 亚洲精品少妇| 欧美日韩午夜在线视频| 亚洲婷婷综合色高清在线 | 亚洲久久成人| 亚洲国产高清视频| 欧美黑人国产人伦爽爽爽| 亚洲另类春色国产| 亚洲毛片视频| 国产精品不卡在线| 欧美一级久久久| 性欧美暴力猛交69hd| 国产自产2019最新不卡| 久久综合九九| 欧美v日韩v国产v| 一区二区三区欧美亚洲| 中文欧美日韩| 国产中文一区| 麻豆国产精品va在线观看不卡| 久久久综合免费视频| 亚洲日本成人网| aa亚洲婷婷| 国产日韩在线视频| 女同一区二区| 欧美日韩高清一区| 午夜精品福利视频| 久久久久国产精品一区二区| 亚洲欧洲免费视频| 夜夜嗨av一区二区三区中文字幕 | 欧美一区二区网站| 久久琪琪电影院| 日韩亚洲在线| 亚洲欧美视频一区二区三区| 在线观看三级视频欧美| 亚洲国产精品久久久久婷婷老年| 欧美日韩三级视频| 久久精品一区二区三区四区| 鲁大师影院一区二区三区| 国产精品99久久久久久白浆小说| 亚洲欧美日韩系列| 亚洲人成在线播放| 亚洲欧美在线x视频| 亚洲国产专区校园欧美| 一区二区三区视频观看| 一区二区三区在线观看视频| 亚洲理论在线| 狠狠噜噜久久| 一本色道久久综合狠狠躁的推荐| 国产一区自拍视频| 亚洲毛片在线观看| 一区二区在线视频| 亚洲桃色在线一区| 91久久久亚洲精品| 欧美一区激情| 亚洲天堂av图片| 久久午夜电影| 香蕉久久精品日日躁夜夜躁| 免费精品视频| 久久精品在线免费观看| 欧美日韩视频第一区| 你懂的视频一区二区| 国产欧美一区二区精品性| 亚洲国产综合91精品麻豆| 国产真实久久| 亚洲午夜精品国产| 亚洲免费电影在线| 久久男人资源视频| 久久高清国产| 国产精品毛片大码女人| 亚洲人午夜精品| 亚洲国语精品自产拍在线观看|