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

天行健 君子當自強而不息

使用DirectInput進行交互(4)

 

本篇是使用DirectInput進行交互(3)的續(xù)篇,當時由于身邊沒有游戲操縱桿,所以拖到現(xiàn)在才寫。

 

使用游戲桿玩游戲

游戲桿是游戲控制的支柱,盡管游戲桿不是游戲惟一可以使用的輸入設(shè)備,但它卻是專門為玩游戲而設(shè)計的。將游戲桿向左推,游戲人物就會向左走,按下一個按鍵,游戲中的英雄就會揮舞他的劍,還有什么比這更容易的嗎?

游戲桿的形狀和大小千差萬別,商店貨架上的方向盤控制器就是一個游戲桿。如果去過街機游戲廳,就可能玩過允許(或要求)玩家站在很大的踏雪板或騎在小摩托車上來控制屏幕上的角色之類的游戲。別驚奇,這些踏雪板和摩托車甚至都可以看成是游戲桿!

游戲桿是一種軸控制器,按鍵很少。方向盤只有一個用于向左向右轉(zhuǎn)向的控制軸,它可能還有用于剎車和控制油門的控制軸。連基本的兩鍵游戲桿都有兩個控制軸:一個用于向上和向下,另外一個用于向左和向右。

下圖顯示了一些游戲桿,不論外形如何,方向性、旋轉(zhuǎn)型以及推動型輸入是游戲桿的共同特征。

控制軸只是一個電位器(變量寄存器),它控制傳送給電路的電壓。傳送的最小電壓表示一個軸的范圍(游戲桿能夠被移動的最遠點),而最大電壓表示的是另外一個范圍,所有電壓就介于這兩個范圍之間。

電壓會流向系統(tǒng),多虧經(jīng)過windows(或directinput)處理,因此才能使用它。游戲桿按鍵的工作方式幾乎完全相同,就是根據(jù)電壓是否施加到按鍵上來發(fā)出按鍵是否被按下的信號。

讀入游戲桿數(shù)據(jù)的方式采用的是絕對值,這些絕對值都是相對于游戲桿中心的值。向左或向右推動游戲桿,都會接收到負值,負值表示遠離游戲桿中心的距離。向下或向右按,就會得到正值。按鍵都是單個標志,這些標志指出了按鍵是否被按下。

各種游戲桿之間惟一較大的差別就是那些帶有數(shù)字控制軸的游戲桿了,這些游戲桿就像是一些按鍵的組合。將游戲桿向左推就像按下一個表示向左的按鍵一樣,無論程序員何時查詢游戲桿以得到正在讀取的軸,游戲桿都會返回軸的可能最低值或最高值。

 

使用DirectInput處理游戲桿

從某種程度上講,游戲桿是最難處理的設(shè)備。最難的地方在于游戲桿的設(shè)置,要找到連接到系統(tǒng)中的游戲桿設(shè)備,必須進行枚舉。在枚舉的過程中,必須決定使用哪個游戲桿,然后再為游戲桿創(chuàng)建COM對象。

如下所示,該函數(shù)枚舉并返回第一個枚舉到的游戲桿。

IDirectInput8* g_di;                    // directinput component
IDirectInputDevice8* g_enum_joystick;   // enum joystick device
IDirectInputDevice8* g_joystick;        // joystick device

//--------------------------------------------------------------------------------
// Initialize joystick interface, return a joystick interface pointer.
//--------------------------------------------------------------------------------
IDirectInputDevice8* init_joystick(HWND hwnd, IDirectInput8* di)
{
    g_di->EnumDevices(DI8DEVTYPE_JOYSTICK, enum_joysticks, NULL, DIEDFL_ATTACHEDONLY);
    
    
// everything was a success, return the pointer.
    return g_enum_joystick;
}

接著來看看枚舉函數(shù)的實現(xiàn):

 
//--------------------------------------------------------------------------------
// Enumerate all attached joysticks, return first enumerated joystick.
//--------------------------------------------------------------------------------
BOOL CALLBACK enum_joysticks(LPCDIDEVICEINSTANCE device_inst, LPVOID ref)
{
    DIPROPRANGE prop_range;
    DIPROPDWORD prop_dword;

    g_enum_joystick = NULL;

    
// create the device object using global directinput object
    if(FAILED(g_di->CreateDevice(device_inst->guidInstance, &g_enum_joystick, NULL)))
        
return DIENUM_CONTINUE;

    
// set the data format
    if(FAILED(g_enum_joystick->SetDataFormat(&c_dfDIJoystick)))
        
goto fail;

    
// set the cooperative mode
    if(FAILED(g_enum_joystick->SetCooperativeLevel(g_hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
        
goto fail;

    
// clear out the structure first
    ZeroMemory(&prop_range, sizeof(DIPROPRANGE));

    prop_range.diph.dwSize       = 
sizeof(DIPROPRANGE);
    prop_range.diph.dwHeaderSize = 
sizeof(DIPROPHEADER);
    prop_range.diph.dwHow        = DIJOFS_X;
    prop_range.diph.dwHow        = DIPH_BYOFFSET;  
// offset into data format
    prop_range.lMin              = -1024;
    prop_range.lMax              = 1024;

    
// Sets properties that define the device behavior. 
    // These properties include input buffer size and axis mode.
    HRESULT rv = g_enum_joystick->SetProperty(DIPROP_RANGE, &prop_range.diph);

    
if(FAILED(rv))
    {
        
if(rv == DIERR_INVALIDPARAM)
            MessageBox(NULL, "invalid param", NULL, MB_OK);
        
else if(rv == DIERR_NOTINITIALIZED)
            MessageBox(NULL, "not initialize", NULL, MB_OK);
        
else if(rv == DIERR_OBJECTNOTFOUND)
            MessageBox(NULL, "object not found", NULL, MB_OK);
        
else if(rv == DIERR_UNSUPPORTED)
            MessageBox(NULL, "unsopported", NULL, MB_OK);

        
goto fail;   
    }

    prop_range.diph.dwObj = DIJOFS_Y;

    
if(FAILED(g_enum_joystick->SetProperty(DIPROP_RANGE, &prop_range.diph)))
        
goto fail;

    
// set x deadzone to 15%
    prop_dword.diph.dwSize       = sizeof(DIPROPDWORD);
    prop_dword.diph.dwHeaderSize = 
sizeof(DIPROPHEADER);
    prop_dword.diph.dwHow        = DIPH_BYOFFSET;
    prop_dword.diph.dwObj        = DIJOFS_X;
    prop_dword.dwData            = 1500;

    
if(FAILED(g_enum_joystick->SetProperty(DIPROP_DEADZONE, &prop_dword.diph)))
        
goto fail;

    
// set Y deadzone
    prop_dword.diph.dwObj = DIJOFS_Y;

    
if(FAILED(g_enum_joystick->SetProperty(DIPROP_DEADZONE, &prop_dword.diph)))
        
goto fail;

    
// acquire the device for use
    if(FAILED(g_enum_joystick->Acquire()))
        
goto fail;

    
// stop enumeration
    return DIENUM_STOP;

fail:
    g_enum_joystick->Release();
    g_enum_joystick = NULL;

    
return DIENUM_CONTINUE;
}

其中涉及到的結(jié)構(gòu)體DIPROPRANGE定義如下:

Contains information about the range of an object within a device. This structure is used with the DIPROP_RANGE flag set in the IDirectInputDevice8::GetProperty and IDirectInputDevice8::SetProperty methods.

typedef struct DIPROPRANGE {
DIPROPHEADER diph;
LONG lMin;
LONG lMax;
} DIPROPRANGE, *LPDIPROPRANGE;

Members

diph
DIPROPHEADER structure.
lMin
Lower limit of the range. If the range of the device is unrestricted, this value is DIPROPRANGE_NOMIN when the IDirectInputDevice8::GetProperty method returns.
lMax
Upper limit of the range. If the range of the device is unrestricted, this value is DIPROPRANGE_NOMAX when the IDirectInputDevice8::GetProperty method returns.

Remarks

The diph member must be initialized as follows:

Member Value
dwSize sizeof(DIPROPRANGE)
dwHeaderSize sizeof(DIPROPHEADER)
dwObj If the dwHow member is DIPH_DEVICE, this member must be 0.

If the dwHow member is DIPH_BYID, this member must be the identifier for the object whose property setting is to be set or retrieved.

If the dwHow member is DIPH_BYOFFSET, this member must be a data format offset for the object whose property setting is to be set or retrieved. For example, if the c_dfDIMouse data format is selected, it must be one of the DIMOFS_* values.Identifier of the object whose property is being retrieved or set.

If the dwHow member is DIPH_BYUSAGE, the device must be a Human Interface Device (human interface device). The device object will be identified by the HID usage page and usage values in packed form.

dwHow Specifies how the dwObj member should be interpreted. See the preceding description of the dwObj member for details.

The range values for devices whose ranges are unrestricted wraparound.

 

DIPROPDWORD結(jié)構(gòu)體的定義如下:

Used to access DWORD properties.

typedef struct DIPROPDWORD {
DIPROPHEADER diph;
DWORD dwData;
} DIPROPDWORD, *LPDIPROPDWORD;

Members

diph
DIPROPHEADER structure.
dwData
Property-specific value being set or retrieved.
 

DIPROPHEADER的定義如下:

Serves as a header for all property structures.

typedef struct DIPROPHEADER {
DWORD dwSize;
DWORD dwHeaderSize;
DWORD dwObj;
DWORD dwHow;
} DIPROPHEADER, *LPDIPROPHEADER;

Members

dwSize
Size of the enclosing structure. This member must be initialized before the structure is used.
dwHeaderSize
Size of the DIPROPHEADER structure.
dwObj
Object for which the property is to be accessed. The value set for this member depends on the value specified in the dwHow member.
dwHow
Value that specifies how the dwObj member should be interpreted. This value can be one of the following:
DIPH_DEVICE
The dwObj member must be 0.
DIPH_BYOFFSET
The dwObj member is the offset into the current data format of the object whose property is being accessed.
DIPH_BYUSAGE
The dwObj member is the human interface device usage page and usage values in packed form.
DIPH_BYID
The dwObj member is the object type/instance identifier. This identifier is returned in the dwType member of the DIDEVICEOBJECTINSTANCE structure returned from a previous call to the IDirectInputDevice8::EnumObjects member.

 

如果有游戲桿被初始化,g_enum_joystick就成了指向新對象的指針,反之如果沒有游戲桿被初始化,它就等于NULL。一旦設(shè)備對象被初始化,就能像前面讀取鍵盤和鼠標的信息一樣讀取游戲桿的信息,但是read_joystick函數(shù)要使用DIJOYSTATE結(jié)構(gòu)體。

Describes the state of a joystick device. This structure is used with the IDirectInputDevice8::GetDeviceState method.

typedef struct DIJOYSTATE {
LONG lX;
LONG lY;
LONG lZ;
LONG lRx;
LONG lRy;
LONG lRz;
LONG rglSlider[2];
DWORD rgdwPOV[4];
BYTE rgbButtons[32];
} DIJOYSTATE, *LPDIJOYSTATE;

Members

lX
X-axis, usually the left-right movement of a stick.
lY
Y-axis, usually the forward-backward movement of a stick.
lZ
Z-axis, often the throttle control. If the joystick does not have this axis, the value is 0.
lRx
X-axis rotation. If the joystick does not have this axis, the value is 0.
lRy
Y-axis rotation. If the joystick does not have this axis, the value is 0.
lRz
Z-axis rotation (often called the rudder). If the joystick does not have this axis, the value is 0.
rglSlider
Two additional axes, formerly called the u-axis and v-axis, whose semantics depend on the joystick. Use the IDirectInputDevice8::GetObjectInfo method to obtain semantic information about these values.
rgdwPOV
Direction controllers, such as point-of-view hats. The position is indicated in hundredths of a degree clockwise from north (away from the user). The center position is normally reported as - 1; but see Remarks. For indicators that have only five positions, the value for a controller is - 1, 0, 9,000, 18,000, or 27,000.
rgbButtons
Array of buttons. The high-order bit of the byte is set if the corresponding button is down, and clear if the button is up or does not exist.

Remarks

You must prepare the device for joystick-style access by calling the IDirectInputDevice8::SetDataFormat method, passing the c_dfDIJoystick global data format variable.

If an axis is in relative mode, the appropriate member contains the change in position. If it is in absolute mode, the member contains the absolute axis position.

Some drivers report the centered position of the POV indicator as 65,535. Determine whether the indicator is centered as follows:

BOOL POVCentered = (LOWORD(dwPOV) == 0xFFFF);

Note    Under DirectX 7.0, sliders on some joysticks could be assigned to the Z axis, with subsequent code retrieving data from that member. Using DirectX 8.0 and later, those same sliders will be assigned to the rglSlider array. This should be taken into account when porting applications to later versions of DirectX. Make any necessary alterations to ensure that slider data is retrieved from the rglSlider array.

來看看read_joystick的實現(xiàn):

//--------------------------------------------------------------------------------
// Read joystick buffer.
//--------------------------------------------------------------------------------
BOOL read_joystick(void* buffer, long buffer_size)
{
    HRESULT rv;

    
while(1)
    {
        
// poll device
        g_joystick->Poll();

        
// read in state
        if(SUCCEEDED(rv = g_joystick->GetDeviceState(buffer_size, buffer)))
            
break;

        
// return when an unknown error
        if(rv != DIERR_INPUTLOST || rv != DIERR_NOTACQUIRED)
            
return FALSE;

        
// re-acquire and try again
        if(FAILED(g_joystick->Acquire()))
            
return FALSE;
    }

    
return TRUE;
}

用于讀取按鍵狀態(tài)的宏在這里仍然起作用:

#define JOYSTICK_BUTTON_STATE(x) ((joy_state.rgbButtons[x] &0x80) ? TRUE : FALSE)

 

完整代碼示例如下:

點擊下載源碼和工程

/***************************************************************************************
PURPOSE:
    Joystick device Demo
 ***************************************************************************************/


#define DIRECTINPUT_VERSION 0x0800

#include <windows.h>
#include <stdio.h>
#include <dinput.h>
#include "resource.h"

#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dinput8.lib")

#pragma warning(disable : 4996)

#define Safe_Release(p) if((p)) (p)->Release();

// window handles, class and caption text.
HWND g_hwnd;
char g_class_name[] = "JoystickClass";

IDirectInput8* g_di;                    
// directinput component
IDirectInputDevice8* g_enum_joystick;   // enum joystick device
IDirectInputDevice8* g_joystick;        // joystick device

BOOL CALLBACK enum_joysticks(LPCDIDEVICEINSTANCE device_inst, LPVOID 
ref);

//--------------------------------------------------------------------------------
// Window procedure.
//--------------------------------------------------------------------------------
long WINAPI window_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    
switch(msg)
    {
    
case WM_DESTROY:
        PostQuitMessage(0);
        
return 0;
    }

    
return (long) DefWindowProc(hwnd, msg, wParam, lParam);
}

//--------------------------------------------------------------------------------
// Initialize joystick interface, return a joystick interface pointer.
//--------------------------------------------------------------------------------
IDirectInputDevice8* init_joystick(HWND hwnd, IDirectInput8* di)
{
    g_di->EnumDevices(DI8DEVTYPE_JOYSTICK, enum_joysticks, NULL, DIEDFL_ATTACHEDONLY);
    
    
// everything was a success, return the pointer.
    return g_enum_joystick;
}

//--------------------------------------------------------------------------------
// Read joystick buffer.
//--------------------------------------------------------------------------------
BOOL read_joystick(void* buffer, long buffer_size)
{
    HRESULT rv;

    
while(1)
    {
        
// poll device
        g_joystick->Poll();

        
// read in state
        if(SUCCEEDED(rv = g_joystick->GetDeviceState(buffer_size, buffer)))
            
break;

        
// return when an unknown error
        if(rv != DIERR_INPUTLOST || rv != DIERR_NOTACQUIRED)
            
return FALSE;

        
// re-acquire and try again
        if(FAILED(g_joystick->Acquire()))
            
return FALSE;
    }

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Enumerate all attached joysticks, return first enumerated joystick.
//--------------------------------------------------------------------------------
BOOL CALLBACK enum_joysticks(LPCDIDEVICEINSTANCE device_inst, LPVOID ref)
{
    DIPROPRANGE prop_range;
    DIPROPDWORD prop_dword;

    g_enum_joystick = NULL;

    
// create the device object using global directinput object
    if(FAILED(g_di->CreateDevice(device_inst->guidInstance, &g_enum_joystick, NULL)))
        
return DIENUM_CONTINUE;

    
// set the data format
    if(FAILED(g_enum_joystick->SetDataFormat(&c_dfDIJoystick)))
        
goto fail;

    
// set the cooperative mode
    if(FAILED(g_enum_joystick->SetCooperativeLevel(g_hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
        
goto fail;

    
// clear out the structure first
    ZeroMemory(&prop_range, sizeof(DIPROPRANGE));

    prop_range.diph.dwSize       = 
sizeof(DIPROPRANGE);
    prop_range.diph.dwHeaderSize = 
sizeof(DIPROPHEADER);
    prop_range.diph.dwHow        = DIJOFS_X;
    prop_range.diph.dwHow        = DIPH_BYOFFSET;  
// offset into data format
    prop_range.lMin              = -1024;
    prop_range.lMax              = 1024;

    
// Sets properties that define the device behavior. 
    // These properties include input buffer size and axis mode.
    HRESULT rv = g_enum_joystick->SetProperty(DIPROP_RANGE, &prop_range.diph);

    
if(FAILED(rv))
    {
        
if(rv == DIERR_INVALIDPARAM)
            MessageBox(NULL, "invalid param", NULL, MB_OK);
        
else if(rv == DIERR_NOTINITIALIZED)
            MessageBox(NULL, "not initialize", NULL, MB_OK);
        
else if(rv == DIERR_OBJECTNOTFOUND)
            MessageBox(NULL, "object not found", NULL, MB_OK);
        
else if(rv == DIERR_UNSUPPORTED)
            MessageBox(NULL, "unsopported", NULL, MB_OK);

        
goto fail;   
    }

    prop_range.diph.dwObj = DIJOFS_Y;

    
if(FAILED(g_enum_joystick->SetProperty(DIPROP_RANGE, &prop_range.diph)))
        
goto fail;

    
// set x deadzone to 15%
    prop_dword.diph.dwSize       = sizeof(DIPROPDWORD);
    prop_dword.diph.dwHeaderSize = 
sizeof(DIPROPHEADER);
    prop_dword.diph.dwHow        = DIPH_BYOFFSET;
    prop_dword.diph.dwObj        = DIJOFS_X;
    prop_dword.dwData            = 1500;

    
if(FAILED(g_enum_joystick->SetProperty(DIPROP_DEADZONE, &prop_dword.diph)))
        
goto fail;

    
// set Y deadzone
    prop_dword.diph.dwObj = DIJOFS_Y;

    
if(FAILED(g_enum_joystick->SetProperty(DIPROP_DEADZONE, &prop_dword.diph)))
        
goto fail;

    
// acquire the device for use
    if(FAILED(g_enum_joystick->Acquire()))
        
goto fail;

    
// stop enumeration
    return DIENUM_STOP;

fail:
    g_enum_joystick->Release();
    g_enum_joystick = NULL;

    
return DIENUM_CONTINUE;
}

//--------------------------------------------------------------------------------
// Main function, routine entry.
//--------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
{
    WNDCLASS        win_class;
    MSG             msg;
    DIJOYSTATE      joy_state;
    
char            text[256];    

    LONG joystick_x = 0, joystick_y = 0; 
    BOOL is_first_render = TRUE;

    
// create window class and register it
    win_class.style         = CS_HREDRAW | CS_VREDRAW;
    win_class.lpfnWndProc   = window_proc;
    win_class.cbClsExtra    = 0;
    win_class.cbWndExtra    = DLGWINDOWEXTRA;
    win_class.hInstance     = inst;
    win_class.hIcon         = LoadIcon(inst, IDI_APPLICATION);
    win_class.hCursor       = LoadCursor(NULL, IDC_ARROW);
    win_class.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
    win_class.lpszMenuName  = NULL;
    win_class.lpszClassName = g_class_name;    

    
if(! RegisterClass(&win_class))
        
return FALSE;

    
// create the main window
    g_hwnd = CreateDialog(inst, MAKEINTRESOURCE(IDD_Joystick), 0, NULL);

    ShowWindow(g_hwnd, cmd_show);
    UpdateWindow(g_hwnd);

    
// initialize directinput and get keyboard device
    DirectInput8Create(inst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void **) &g_di, NULL);

    
// initialize mouse
    g_joystick = init_joystick(g_hwnd, g_di);

    
if(g_joystick != NULL)
    {
        
// start message pump, waiting for signal to quit.
        ZeroMemory(&msg, sizeof(MSG));

        
while(msg.message != WM_QUIT)
        {
            
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            
            
// read in mouse and display coordinates
            read_joystick(&joy_state, sizeof(DIJOYSTATE));

            
if(is_first_render || (joystick_x != joy_state.lX || joystick_y != joy_state.lY))
            {
                is_first_render = FALSE;
                
                sprintf(text, "%ld, %ld", joy_state.lX, joy_state.lY);
                SetWindowText(GetDlgItem(g_hwnd, IDC_COORDINATES), text);        
            }     

            joystick_x = joy_state.lX;
            joystick_y = joy_state.lY;
        }
    }
    
else
    {
        MessageBox(g_hwnd, "No Joysticks!", "Error", MB_OK);
        
return 0;
    }    

    
// release directinput objects
    g_joystick->Unacquire();
    g_joystick->Release();
    g_di->Release();

    UnregisterClass(g_class_name, inst);
    
    
return (int) msg.wParam;
}
 

程序截圖:

 

 

posted on 2007-09-19 00:39 lovedday 閱讀(1355) 評論(0)  編輯 收藏 引用

公告

導航

統(tǒng)計

常用鏈接

隨筆分類(178)

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

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩亚洲视频在线| 亚洲精品国产欧美| 久久免费精品日本久久中文字幕| 香蕉久久一区二区不卡无毒影院| 99精品国产99久久久久久福利| 亚洲免费观看| 亚洲一区bb| 欧美专区一区二区三区| 久久久久久日产精品| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美激情亚洲视频| 国产精品日韩精品| 国产一区二区三区四区老人| 亚洲第一区中文99精品| 99v久久综合狠狠综合久久| 亚洲综合电影一区二区三区| 久久精品综合| 亚洲精品久久久久久久久久久久 | 午夜精品影院在线观看| 久久er精品视频| 欧美另类综合| 国产一区二区三区在线观看精品| 亚洲福利视频一区二区| 亚洲欧美日本国产有色| 欧美成人精品在线播放| 亚洲视屏在线播放| 免费毛片一区二区三区久久久| 国产精品mv在线观看| 亚洲国产成人porn| 久久久久国产一区二区三区| 日韩视频精品在线| 老司机午夜精品| 国内视频一区| 欧美专区在线观看| 日韩午夜电影| 在线看欧美视频| 国内精品久久久久久久果冻传媒 | 最新日韩在线视频| 香蕉av777xxx色综合一区| 欧美激情亚洲综合一区| 好吊色欧美一区二区三区视频| 一区二区三区四区精品| 麻豆av福利av久久av| 午夜精品美女久久久久av福利| 欧美精品成人一区二区在线观看 | 欧美中文字幕第一页| 亚洲美女少妇无套啪啪呻吟| 美女国产一区| 亚洲成色精品| 玖玖综合伊人| 久久精选视频| 伊人精品在线| 美女精品国产| 久久综合九色99| 亚洲第一在线综合网站| 久久一区二区三区四区| 欧美在线日韩在线| 国产亚洲欧美一级| 欧美一区高清| 羞羞色国产精品| 国产亚洲欧洲| 久久香蕉国产线看观看网| 久久久精品一区二区三区| 影音先锋久久久| 美女日韩欧美| 欧美国产日韩一区| 一本综合久久| 国产欧美亚洲日本| 欧美第十八页| 久久色中文字幕| 黄色成人av网| 欧美bbbxxxxx| 欧美ab在线视频| 99视频精品在线| a91a精品视频在线观看| 国产精品国产精品| 亚洲欧美日韩在线| 欧美一区二区黄| 亚洲福利视频二区| 99国产欧美久久久精品| 国产精品欧美风情| 久久久久www| 欧美.com| 欧美一级视频| 狂野欧美一区| 亚洲在线播放电影| 久久精品视频99| 日韩视频免费观看高清完整版| 中国女人久久久| 亚洲精品社区| 亚洲国产成人久久综合| 欧美日韩的一区二区| 欧美一级淫片播放口| 久久久久99精品国产片| 亚洲精品乱码久久久久| 中日韩午夜理伦电影免费| 红桃视频成人| 一区二区三区成人| 在线免费观看成人网| 一本到高清视频免费精品| 国产一区二区久久久| 亚洲国产精品一区二区第四页av | 99国产精品久久久久老师| 一本综合精品| 在线播放日韩欧美| 一区二区毛片| 亚洲国产精品一区二区第一页| 在线视频亚洲欧美| 一区免费在线| 午夜精品久久久久久久久| 99视频有精品| 免费观看国产成人| 久久久久久久久岛国免费| 欧美三级在线视频| 亚洲国产欧美在线人成| 国产一区二区三区成人欧美日韩在线观看| 亚洲第一页在线| 激情小说另类小说亚洲欧美| 亚洲午夜精品福利| 亚洲午夜精品视频| 欧美激情亚洲另类| 欧美不卡激情三级在线观看| 国产亚洲一区在线播放| 亚洲一区二区网站| 亚洲一区二区影院| 欧美日韩一区二区三| 亚洲国产三级在线| 最新国产拍偷乱拍精品| 另类av一区二区| 免费在线亚洲| 亚洲国产成人久久| 免费一级欧美片在线观看| 你懂的国产精品| 1769国产精品| 快播亚洲色图| 亚洲国产欧美在线人成| 亚洲日本欧美天堂| 美女国产一区| 亚洲区欧美区| 中文精品在线| 国产精品视频内| 香蕉视频成人在线观看| 久久久精品999| 亚洲大胆女人| 欧美国产免费| 亚洲精品免费在线观看| 在线视频一区观看| 国产精品毛片a∨一区二区三区| 亚洲一级高清| 久久久久久九九九九| 黄色av一区| 欧美激情精品久久久久| 日韩视频在线免费| 欧美日韩一区二区三区视频 | 国产欧美日韩中文字幕在线| 亚洲专区一区| 久久全国免费视频| 亚洲区第一页| 国产精品久久久久久久久久久久久久| 亚洲视频一区二区| 久久频这里精品99香蕉| 最新中文字幕一区二区三区| 欧美精品乱人伦久久久久久| 伊人久久综合97精品| 亚洲欧美激情一区二区| 欧美精品成人| 亚洲一区二区三| 久久久久久久久久看片| 久久gogo国模裸体人体| 亚洲永久免费观看| 国产女人精品视频| 久久精品国产一区二区电影| 欧美高清在线| 午夜精品影院| 亚洲人成网在线播放| 欧美日韩综合不卡| 久久久人人人| 亚洲一区二区成人在线观看| 老司机一区二区| 亚洲自拍啪啪| 亚洲欧洲一区二区在线播放| 国产精品任我爽爆在线播放| 裸体丰满少妇做受久久99精品| 一区二区三区免费在线观看| 免费不卡中文字幕视频| 亚洲一区二区在| 亚洲精品视频在线观看免费| 国产日韩欧美日韩| 欧美日韩在线播放一区二区| 久久人人精品| 香蕉久久夜色精品国产使用方法| 亚洲欧洲一区二区三区| 久久久精品日韩欧美| 欧美日本二区| 久久精品盗摄| 一区二区三区视频在线观看| 久久久亚洲精品一区二区三区| 一区二区三区日韩精品视频| …久久精品99久久香蕉国产| 国产精品一香蕉国产线看观看 |