Thỉnh thoảng trong khi học làm game, Input device bị mất. Nếu game của bạn đã thiết lập cooperative level cho mỗi thiết bị thành truy cập không độc quyền, thì ứng dụng khác phải bắt đầu hạn chế truy cập của bạn tới thiết bị này. Trong trường hợp như vậy, bạn cần dành lại thiết bị trước khi bạn có thể tiếp tục đọc từ nó và sử dụng Input của nó.
Khi truy cập tới một thiết bị đã bị mất, giá trị trả về từ hàm GetDeviceState sẽ bằng
DIERR_INPUTLOST. Khi việc này xảy ra, bạn cần gọi hàm Acquire trong vòng lặp cho đến
khi truy cập tới thiết bịđược hoàn lại.
Đoạn chương trình sau minh họa cách dành lại thiết bị một truy cập đã bị mất như thế nào: HRESULT hr; //biến giữ giá trị trả về
//đây là vòng lặp chính, đọc dữ liệu từInput Device mỗi trạng thái. While(1)
{
//gọi hàm GetDeviceState và save lại giá trị trả về
hr= DI_Device->GetDeviceState (sizeof(DIMOUSESTATE), (LPVOID)&mouseState); //kiểm tra trạng thái trả về để biết thiết bị có còn truy cập được không if FAILED (hr)
{
//thử dành lại Input Device hr= DI_Device->Acquire();
//tiếp tục vòng lặp cho đến khi thiết bị dành lại đựoc while (hr==DIER_INPUTLOST)
hr=DI_Device->Acquire();
//chỉ trả về và không làm gì với trạng thái này continue;
}
//kiểm tra Input và làm gì đó với nó }
chú ý:
Hầu hết các game cần nhiều Input Device để nhiều người chơi cùng một lúc. Bằng cách tạo nhiều DirectInput Device, bạn có thể hỗ trợ nhiều thiết bị riêng biệt.
Làm sạch DirectInput
DirectInput giống như Direct3D điều nó cần là bạn xử lý các đối tượng bạn tạo trong khi hoàn thành ứng dụng của bạn. Trong việc tính toán đến đối tựong DirectInput, bạn cũng phải xóa bỏ mọi dành lại các thiết bị mà bạn đã lấy được điều khiển trước đó. Nếu bạn quên xóa bỏ các Input Device mà bạn đã sử dụng, khi game kết thúc, những thiết bị này vẫn còn bị khóa bởi hệ thống vì thế bạn không thể sử dụng chúng nứa. Mặc dù một joystick hoặc gamepad bị khóa không ảnh hưởng nhiều lắm, nhưng với chuột và bàn phím thì có thể làm cho bạn phải restart lại máy tính để lấy chúng trở lại.
Hàm Unacquire xử lý một thiết bị mà dành lại được trước đó qua DirectInput.
HRESULT Unacquire(VOID);
//Unacquire là một phương thức mà giao diện DirectInput Device cung cấp //Đoạn ví dụ sau xóa bỏ thiết bị Input và xử lý cả DirectInput Device và //DirectInput Object.
//kiểm tra bạn có một DirectInput Object hợp lệ hay không if (DI_Object)
{
//kiểm tra để biết bạ có một DirectInput Device hợp lệ không if (DI_Device)
{
//xóa bỏ Input Device DI_Device-> Unacquire(); //xử lý DirectInput Device DI_Device->Release();
//đưa biến DirectInput Device về NULL DI_ Device =NULL;
}
//xử lý DirectInput Object DI_Object->Release();
//đưa biến DirectInput Object về NULL DI_ Object =NULL;
}
Ở đây bạn nên hiểu biết rõ ràng về gán và đọc từ Input Device chuẩn qua DirectInput. Trong phần tiếp theo, bạn sẽ học làm thế nào để sử dụng force feedback để nhúng player vào thế giới mà bạn tạo.