Thu dữ liệu vào từ Chuột

Một phần của tài liệu Beginning DirectX9 pot (Trang 146 - 149)

Đọc dữ liệu vào từ chuột cũng tương tự như từ bàn phím. Sự khác nhau cơ bản ởđây là GUID

được gán cho hàm CreateDevice và cấu trúc DIDATAFORMAT lưu dữ liệu vào của thiết bị này.

Ở ví dụ trước, việc gọi hàm CreateDevice sử dụng GUID_SysKeyboard cho tham số thứ nhất. Khi bạn sử dụng chuột, bạn phải thiết lập GUID kiểu GUID_SysMouse cho

CreateDevice.

Chú ý:

Khi thiết lập cooperative level ở chếđộđộc quyền cho chuột thì Input ngăn chặn con trỏ Windows hiển thị. Trong chếđộđộc quyền, bạn có trách nhiệm phải vẽ con trỏ chuột. Đoạn chương trình sau chỉ ra cách sử dụng hàm CreateDevice như thế nào

//gọi hàm CreateDevice sử dụng tham số GUID_SysMouse

hr=g_lpDI->CreateDevice(GUID_SysMouse, &g_lpDiDevice, NULL); //kiểm tra giá trị trả về cảu hàm CreateDevice

nếu FAILED (hr)

return FALSE;

Việc gọi tới hàm SetDataFormat đã sử dụng định dạng dữ liệu định trước

c_dfDIKeyboard. Bạn phải thay đổi giá trị này thành c_dfDIMouse khi bạn sử dụng chuột

là Input Device.

//thiết lập định dạng dữ liệu cho Chuột

hr= g_lpDIDevice->SetDataFomat(&c_dfDIMouse); //kiểm tra giá trị trả về cho hàm SetDataFormat if FAILED (hr)

return FALSE;

Sự thay đổi cuối cùng cần phải làm trước khi bạn đọc từ chuột là bộ nhớ mà được định nghĩa bởi

DIDATAFORMAT. Bàn phím cần một bộ nhớ ký tự chứa 256 phần tử, ngược lại chuột chỉ cần

một buffer có kiểu DIMOUSESTATE.

Cấu trúc DIMOUSESTATE bao gồm 3 biến để lưu vị trí của chuột là X,Y và Z. Đồng thời nó cần thêm một ma trận kiểu BYTE có 4 phần tử để lưu trạng thái của nút bấm chuột. Cấu trúc

DIMOUSESTATEđược định nghĩa như sau:

Typedef struct DIMOUSESTATE{

LONG lX; //lưu khoảng cách mà chuột đã di chuyển trên trục X LONG lY; //lưu khoảng cách mà chuột đã di chuyển trên trục Y; LONG lZ; //lưu khoảng cách mà chuột đã di chuyển trên trục Z; BYTE rgbButtons[4]; //trạng thái hiện tại của các nút nhấn chuột. } DIMOUSESTATE, *LPDIMOUSESTATE;

Phần trước, một macro đã giúp xác định phím riêng biệt nào trên bàn phím được nhấn. Bạn có thể sử dụng macro tương tựđể kiểm tra trạng thái của nút bấm chuột.

#define BUTTONDOWN(name, key){name.rgbButtons[key] & 0x80} Macro này trả vềTRUE hoặc FALSE cho mỗi nút bấm trên chuột.

Giá trị X, Y và Z trong cấu trúc DIMOUSESTATE không lưu vị trí hiện tại cảu chuột; đúng hơn là chúng lưu vị trí tương đối của chuột so với vị trí trước. Ví dụ, nếu bạn chuyển chuột xuống 10 đơn vị, giá trị Y sẽ bằng 10. Khi bạn dọc từ chuột, bạn phải giữ lại các giá trịđọc từ chuột ở trạng thái trước. Như vậy bạn có thể giải thích chính xác dịch chuyển của chuột.

Đoạn chương trình sau minh họa giá trị cần đểđọc thiết bị chuột. Điều khiển giá trị này kiểm tra cả sự dịch chuyển của chuột và trạng thái của mỗi nút bấm trên chuột.

//xác định macro cần để kiểm tra trạng thái của các phím trên bàn phím. #define KEYDOWN (name, key) { name[key]& 0x80}

//cần lưu trạng thái của chuột.

//biến này lưu giữ trạng thái hiện tại của thiết bị chuột. DIMOUSESTATE mouseState;

//biến này lưu giữ vị trí hiện tại X của sprite LONG currentXpos;

//biến này lưu giữ vị trí hiện Y tại của sprite LONG currentYpos;

//biến này lưu giữ vị trí hiện tại Z của sprite LONG currentZpos;

//thiết lập vị trí theo mặc định cho sprite curretnXpos=320;

curretnYpos=240;

//đây là vòng lặp chính của game, đọc từ thiết bị chuột mỗi trạng thái. While(1)

{

//kiểm tra chuột và lấy trạng thái hiện tại của nút được nhấn.

g_lpDIDevice->GetDeviceState(sizeof (mouseState), (LPVOID) &mouseState); //làm gì đó với Input

//BUTTONDOWN macro này kiểm tra nếu nút bấm chuột thứ nhât được nhấn if (BUTTONDOWN (mouseState, 0))

{

//làm gì đó với nút bấm chuột này }

//kiểm tra sự dịch chuyển của chuột

//xem xét hướng đi của chuột theo trục X được dịch chuyển bao xa currentXpos +=mousesState.lX;

//xem xét hướng đi của chuột theo trục Y được dịch chuyển bao xa currentYpos +=mousesState.lY;

//làm gì đó vói dịch chuỷên chuột }

Bạn có thể tìm thấy mã nguồn của ví dụ trong thư mục chapter9\example2 trên đĩa CD-ROM. Ví dụ này minh họa dịch chuyển của chuột sử dụng 2D sprite, nhấn trái và nhấn phải chuột được biểu diễn băng là mũi tên định hướng trên màn hình. Hình 9.3 chỉ ra ví dụ này.

Hình 9.3 chỉđịnh dịch chuyển chuột bằng sprite. Chú ý:

Cấu trúc DIMOUSESTATE cung cấp biến để lưu giữ trạng thái của chuột với 8 nút hỗ trợ.

Một phần của tài liệu Beginning DirectX9 pot (Trang 146 - 149)