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

天行健 君子當自強而不息

使用DirectInput進行交互(3)

 

本篇是使用DirectInput進行交互(2)的續篇。


使用鼠標玩游戲

鼠標的工作原理理解起來并不難,在最底層,鼠標通知系統它要移動到某個方向,每次移動一個記號,驅動程序讀取這個數據后,將記號轉化為相對移動值。

在通常的應用程序中,windows得到鼠標的移動并通過消息處理函數將移動作為消息報告給用戶。使用消息處理函數有時速度會非常慢,因為傳遞給消息處理函數的每個消息要被插入到隊列中,這樣消息就只會按照他們加入到隊列中的順序被處理。要加快接收以及處理鼠標輸入的過程,就必須直接同鼠標的驅動程序進行交互,而不采用windows消息處理函數。

不論采用哪種移動方式接收鼠標移動,都要從跟蹤鼠標在屏幕上的坐標開始,可以選擇追蹤絕對鼠標坐標或相對鼠標坐標。絕對表示當前的鼠標位置都是基于某個固定點(通常是屏幕的左上角)。

如下圖所示,通過鼠標距屏幕左上角的像素數量來衡量鼠標的絕對坐標。

相對指的是從上個已知位置到當前位置所發生的移動量,上個位置可能位于左邊、右邊、上邊或下邊。

 

使用DirectInput處理鼠標

除了指定的是鼠標標識符以及鼠標數據格式外,初始化鼠標就和初始化鍵盤幾乎完全相同。

//--------------------------------------------------------------------------------
// Initialize mouse interface, return a mouse interface pointer.
//--------------------------------------------------------------------------------
IDirectInputDevice8* Init_Mouse(HWND hwnd, IDirectInput8* directinput)
{
    IDirectInputDevice8* directinput_device;

    
// create the device object
    if(FAILED(directinput->CreateDevice(GUID_SysMouse, &directinput_device, NULL)))
        
return NULL;

    
// set the data format
    if(FAILED(directinput_device->SetDataFormat(&c_dfDIMouse)))
    {
        directinput_device->Release();
        
return NULL;
    }

    
// set the coooperative mode
    if(FAILED(directinput_device->SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
    {
        directinput_device->Release();
        
return NULL;
    }

    
// acquire the device for use
    if(FAILED(directinput_device->Acquire()))
    {
        directinput_device->Release();
        
return NULL;
    }

    
// everything well, so return a vaild pointer.
    return directinput_device;
}

要調用DirectInputDevice8::GetDeviceState,使用諸如相對移動和按鍵狀態等鼠標的相關信息來填充 DIMOUSESTATE結構體。

DIMOUSESTATE結構體的定義如下:

Describes the state of a mouse device that has up to four buttons, or another device that is being accessed as if it were a mouse device. This structure is used with the IDirectInputDevice8::GetDeviceState method.

typedef struct DIMOUSESTATE {
LONG lX;
LONG lY;
LONG lZ;
BYTE rgbButtons[4];
} DIMOUSESTATE, *LPDIMOUSESTATE;

Members

lX
X-axis.
lY
Y-axis.
lZ
Z-axis, typically a wheel. If the mouse does not have a z-axis, the value is 0.
rgbButtons
Array of buttons. The high-order bit of the byte is set if the corresponding button is down.

Remarks

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

The mouse is a relative-axis device, so the absolute axis positions for mouse axes are accumulated relative motion. Therefore, the value of the absolute axis position is not meaningful except in comparison with other absolute axis positions.

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.



點擊下載源碼和工程

完整源碼示例:

/***************************************************************************************
PURPOSE:
    Mouse 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[] = "MouseClass";

IDirectInput8* g_directinput;               
// directinput component
IDirectInputDevice8* g_directinput_device;  // mouse device

//--------------------------------------------------------------------------------
// 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 mouse interface, return a mouse interface pointer.
//--------------------------------------------------------------------------------
IDirectInputDevice8* Init_Mouse(HWND hwnd, IDirectInput8* directinput)
{
    IDirectInputDevice8* directinput_device;

    
// create the device object
    if(FAILED(directinput->CreateDevice(GUID_SysMouse, &directinput_device, NULL)))
        
return NULL;

    
// set the data format
    if(FAILED(directinput_device->SetDataFormat(&c_dfDIMouse)))
    {
        directinput_device->Release();
        
return NULL;
    }

    
// set the coooperative mode
    if(FAILED(directinput_device->SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
    {
        directinput_device->Release();
        
return NULL;
    }

    
// acquire the device for use
    if(FAILED(directinput_device->Acquire()))
    {
        directinput_device->Release();
        
return NULL;
    }

    
// everything well, so return a vaild pointer.
    return directinput_device;
}

//--------------------------------------------------------------------------------
// Read mouse buffer.
//--------------------------------------------------------------------------------
BOOL Read_Device(IDirectInputDevice8* directinput_device, void* buffer, long buffer_size)
{
    HRESULT rv;

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

        
// read in state
        if(SUCCEEDED(rv = g_directinput_device->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_directinput_device->Acquire()))
            
return FALSE;
    }

    
return TRUE;
}

//--------------------------------------------------------------------------------
// Main function, routine entry.
//--------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
{
    WNDCLASS        win_class;
    MSG             msg;
    DIMOUSESTATE    mouse_state = {0};
    
char            text[256];
    
long            x_pos = 0, y_pos = 0;

    
// 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_MOUSE), 0, NULL);

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

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

    
// initialize mouse
    g_directinput_device = Init_Mouse(g_hwnd, g_directinput);

    
// 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_Device(g_directinput_device, &mouse_state, sizeof(DIMOUSESTATE));

        x_pos += mouse_state.lX;
        y_pos += mouse_state.lY;

        
if(mouse_state.lX != 0 || mouse_state.lY != 0)
        {
            sprintf(text, "%ld, %ld", x_pos, y_pos);
            SetWindowText(GetDlgItem(g_hwnd, IDC_COORDINATES), text);
        }
    }

    
// release directinput objects
    g_directinput_device->Unacquire();
    g_directinput_device->Release();
    g_directinput->Release();

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

運行截圖:



閱讀下篇:使用DirectInput進行交互(4)

posted on 2007-07-25 15:14 lovedday 閱讀(1413) 評論(1)  編輯 收藏 引用

評論

# re: 使用DirectInput進行交互(3) 2007-07-26 00:08 小禹

謝謝您的文章,給了我很大的幫助。希望您能個寫一些3D碰撞檢測實現方法的文章。期待中。。。  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线亚洲国产精品网站| 久久精品理论片| 欧美日韩在线另类| 在线亚洲观看| 这里只有精品电影| 国产欧美精品在线播放| 久久久久久久一区二区三区| 性欧美8khd高清极品| 一区二区三区在线免费播放| 欧美成人免费一级人片100| 欧美激情精品久久久久久大尺度| 99亚洲一区二区| 亚洲一区二区三区四区在线观看 | 久久久国产成人精品| 尤物在线精品| 日韩视频在线一区| 国产精品一区免费视频| 裸体一区二区三区| 欧美黄网免费在线观看| 亚洲欧美日韩一区二区在线| 久久岛国电影| 一区二区三区四区五区视频 | 欧美激情中文字幕在线| 欧美日韩精品免费| 久久久久久久999精品视频| 欧美bbbxxxxx| 亚洲欧美视频一区| 免费成人在线观看视频| 亚洲男人av电影| 久热精品视频在线观看| 亚洲在线视频| 欧美成人国产一区二区| 久久福利精品| 欧美日韩国产综合一区二区| 玖玖玖国产精品| 国产精品久久久久久久久久免费 | 欧美一区二区三区四区在线观看| 亚洲国产精品美女| 午夜视频在线观看一区二区| 亚洲精品视频免费观看| 久久成人羞羞网站| 午夜视频久久久| 欧美国产日韩a欧美在线观看| 久久精品综合| 国产精品入口| 日韩亚洲视频在线| 亚洲精品国偷自产在线99热| 欧美一区二区三区在线看| 亚洲图片欧洲图片日韩av| 麻豆精品精华液| 久久一区欧美| 国产一区成人| 先锋影院在线亚洲| 亚洲欧美日韩天堂| 欧美性事免费在线观看| 亚洲人午夜精品| 精品51国产黑色丝袜高跟鞋| 亚洲欧美日韩国产综合| 亚洲在线免费视频| 国产精品高精视频免费| 亚洲麻豆一区| 一本综合精品| 欧美日韩三级电影在线| 亚洲精品五月天| 一本久久综合亚洲鲁鲁| 欧美顶级少妇做爰| 最近看过的日韩成人| 亚洲破处大片| 欧美精品激情| 99热精品在线| 午夜久久久久久| 国产乱码精品| 久久成人精品一区二区三区| 久久综合九色综合久99| 永久555www成人免费| 老司机一区二区| 亚洲国产精品成人综合色在线婷婷| 亚洲高清毛片| 欧美精品免费在线观看| 99精品99久久久久久宅男| 亚洲女人小视频在线观看| 国产精品爽黄69| 欧美在线日韩精品| 亚洲福利电影| 亚洲在线视频网站| 国产午夜精品美女毛片视频| 久久精品国产亚洲高清剧情介绍| 蜜桃视频一区| 一区二区三区成人| 国产农村妇女毛片精品久久莱园子| 午夜日本精品| 亚洲国产人成综合网站| 亚洲欧美成人在线| 精品88久久久久88久久久| 欧美国产精品人人做人人爱| 一区二区福利| 免费视频一区二区三区在线观看| 亚洲精品之草原avav久久| 欧美视频第二页| 欧美一级久久久| 亚洲日本成人在线观看| 欧美一区影院| 亚洲免费av观看| 国产日韩一区在线| 欧美激情一区二区三区四区| 亚洲综合国产| 亚洲国产成人porn| 久久久精品久久久久| 亚洲每日更新| 一区二区三区亚洲| 国产精品另类一区| 欧美电影电视剧在线观看| 亚洲欧美精品suv| 亚洲精品久久嫩草网站秘色| 久久久噜噜噜久久久| 亚洲视频一区在线| 亚洲黄色在线观看| 国产日韩欧美在线一区| 欧美日韩国产999| 美国十次成人| 久久精品综合一区| 亚洲欧美国产高清| 日韩一二三区视频| 亚洲大片在线观看| 久久亚洲一区二区三区四区| 亚洲自拍啪啪| 在线亚洲精品福利网址导航| 亚洲人www| 亚洲国产精品电影| 黑人一区二区| 国产在线不卡| 国产日韩精品一区观看| 欧美手机在线视频| 欧美日韩网址| 欧美日韩dvd在线观看| 欧美国产日韩一区二区三区| 久久天天综合| 久久久亚洲高清| 久久久青草青青国产亚洲免观| 亚洲欧美日韩另类| 亚洲男女自偷自拍| 午夜精品美女久久久久av福利| 一个色综合av| 一区二区久久久久| 在线一区欧美| 亚洲一区二区视频| 午夜在线一区| 久久精品国产一区二区三| 欧美一区二区三区日韩视频| 午夜精品视频| 久久久7777| 久久影视精品| 欧美激情第二页| 欧美日韩在线视频一区二区| 欧美婷婷在线| 国产毛片一区二区| 国产亚洲在线| 在线精品国精品国产尤物884a| 亚洲福利视频三区| 亚洲免费av片| 亚洲欧美色一区| 久久久福利视频| 欧美刺激午夜性久久久久久久| 亚洲国产精品精华液2区45| 亚洲人成人一区二区在线观看| 日韩亚洲欧美一区二区三区| 亚洲一区激情| 久久天天狠狠| 欧美网站大全在线观看| 国产欧美日韩亚洲一区二区三区| 国产一区二区三区四区五区美女| 亚洲成人自拍视频| 日韩亚洲不卡在线| 欧美一区二视频| 亚洲电影天堂av| 亚洲视频一二三| 乱码第一页成人| 国产精品免费区二区三区观看| 一区精品在线| 亚洲欧美国产另类| 免费成人高清| 中文在线一区| 美女主播精品视频一二三四| 欧美特黄一级| 在线精品视频免费观看| 亚洲字幕在线观看| 欧美成人日韩| 亚洲欧美视频在线观看| 欧美激情综合色| 黄色一区二区在线观看| 亚洲网站在线观看| 欧美搞黄网站| 欧美亚洲一区二区在线| 欧美日韩国产999| 在线看日韩av| 久久成人这里只有精品| 夜夜嗨av一区二区三区四季av| 久久福利精品| 国产精品一区亚洲| 99综合在线|