Пример c ++ DirectInput извлекает немедленные данные из джойстика

0

Я пытаюсь отправить через клиент-серверное приложение коды джойстика. После успешного отображения данных джойстика, используя API DirectInput, я не могу понять, в каких переменных хранятся данные из джойстика, чтобы передать их в буфер и отправить их. Любая помощь будет оценена по достоинству.

Блок кода, который отображает данные джойстика:

//--------------------------------------------------------------------------------------------------
// Name: UpdateInputState()
// Desc: Get the input device state and display it.
//--------------------------------------------------------------------------------------------------
HRESULT UpdateInputState(HWND hDlg)
{
    HRESULT hr;
    TCHAR strText[512] = {0}; // Device state text.
    DIJOYSTATE2 js; // DirectInput joypad state. 

    if(NULL == g_pJoypad)
        return S_OK;

    // Poll the device to read the current state.
    hr = g_pJoypad->Poll();
    if(FAILED(hr))
    {
        // DirectInput is telling us that the input stream has been interrupted. We aren't tracking
        // any state between polls, so we don't have any special reset that needs to be done. We just
        // re-acquire and try again.
        hr = g_pJoypad->Acquire();
        while(hr == DIERR_INPUTLOST)
            hr = g_pJoypad->Acquire();

        // hr may be DIERR_OTHERAPPHASPRIO or other errors. This may occur when the application is
        // minimized or in the process of switching, so just try again later.
        return S_OK;
    }

    // Get the input device state.
    // GetDeviceState() retrieves immediate data from the device. 
    if(FAILED(hr = g_pJoypad->GetDeviceState(sizeof(DIJOYSTATE2), &js)))
        return hr; // The device should have been acquired during the Poll().

    // Display joypad state to dialog.

    // Axes.
    _stprintf_s(strText, 512, TEXT("%ld"), js.lX);
    SetWindowText(GetDlgItem(hDlg, IDC_X_AXIS_L), strText);
    _stprintf_s(strText, 512, TEXT("%ld"), js.lY);
    SetWindowText(GetDlgItem(hDlg, IDC_Y_AXIS_L), strText);
    _stprintf_s(strText, 512, TEXT("%ld"), js.lZ);
    SetWindowText(GetDlgItem(hDlg, IDC_X_AXIS_R), strText);
    _stprintf_s(strText, 512, TEXT("%ld"), js.lRx);
    _stprintf_s(strText, 512, TEXT("%ld"), js.lRz);
    SetWindowText(GetDlgItem(hDlg, IDC_Y_AXIS_R), strText);

    // POV.
    _stprintf_s(strText, 512, TEXT("%lu"), js.rgdwPOV[0]);
    SetWindowText(GetDlgItem(hDlg, IDC_POV), strText);

    // Buttons.
    // Fill up text with which buttons are pressed.
    _tcscpy_s(strText, 512, TEXT(""));
    for(int i = 0; i < 128; i++)
    {
        if(js.rgbButtons[i] & 0x80)
        {
            TCHAR sz[128];
            _stprintf_s(sz, 128, TEXT("%02d"), i);
            _tcscat_s(strText, 512, sz);
        }
    }
    SetWindowText(GetDlgItem(hDlg, IDC_BUTTONS), strText);

    return S_OK;
}

Кодовый блок, который отправляет данные на сервер:

 // Send a message.
    if (send(ConnectSocket, sendbuf, sizeof(sendbuf), 0) == SOCKET_ERROR)
    {
        MessageBox(NULL, TEXT("The joypad data could not be sent."), TEXT("Client says"), 
                           MB_ICONERROR | MB_OK);
    }
Теги:
directx

1 ответ

0
Лучший ответ

Проще, чем я думал. Данные хранятся в strText (оси и POV) и в sz (кнопки). Однако оба этих буфера были объявлены TCHAR и требуется преобразование в CHAR для передачи в качестве параметра send() (вместо sendbuf).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню