首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Xbox控制器没有响应?

为什么Xbox控制器没有响应?
EN

Stack Overflow用户
提问于 2012-07-08 07:26:51
回答 1查看 1.2K关注 0票数 1

我正在学习CodeProject上的教程和input,我想我自己也可以做一些。因此,我尝试生成以下代码,但当我按下D-pad或其他按钮时,什么也没有发生。但当我按下“开始”和“后退”按钮时,它就会注册。提前谢谢。

CXBOXController

代码语言:javascript
复制
#ifndef _XBOX_CONTROLLER_H_
#define _XBOX_CONTROLLER_H_

// No MFC
#define WIN32_LEAN_AND_MEAN

// We need the Windows Header and the XInput Header
#include <windows.h>
#include <XInput.h>

// Now, the XInput Library
// NOTE: COMMENT THIS OUT IF YOU ARE NOT USING
// A COMPILER THAT SUPPORTS THIS METHOD OF LINKING LIBRARIES
#pragma comment(lib, "XInput.lib")

// XBOX Controller Class Definition
class CXBOXController
{
private:
XINPUT_STATE _controllerState;
int _controllerNum;
public:
CXBOXController(int playerNumber);
XINPUT_STATE GetState();
bool IsConnected();
void Vibrate(int leftVal = 0, int rightVal = 0);
};

#endif

CXBOXController::CXBOXController(int playerNumber)
{
// Set the Controller Number
_controllerNum = playerNumber - 1;
}

XINPUT_STATE CXBOXController::GetState()
{
// Zeroise the state
ZeroMemory(&_controllerState, sizeof(XINPUT_STATE));

// Get the state
XInputGetState(_controllerNum, &_controllerState);

return _controllerState;
}

bool CXBOXController::IsConnected()
{
// Zeroise the state
ZeroMemory(&_controllerState, sizeof(XINPUT_STATE));

// Get the state
DWORD Result = XInputGetState(_controllerNum, &_controllerState);

if(Result == ERROR_SUCCESS)
{
    return true;
}
else
{
    return false;
}
}

void CXBOXController::Vibrate(int leftVal, int rightVal)
{
// Create a Vibraton State
XINPUT_VIBRATION Vibration;

// Zeroise the Vibration
ZeroMemory(&Vibration, sizeof(XINPUT_VIBRATION));

// Set the Vibration Values
Vibration.wLeftMotorSpeed = leftVal;
Vibration.wRightMotorSpeed = rightVal;

// Vibrate the controller
XInputSetState(_controllerNum, &Vibration);
}

代码

代码语言:javascript
复制
                Player1 = new CXBOXController(1);

                if(Player1->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP)
                {
                    std::cout << "Up";
                }

                if(Player1->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN)
                {
                    std::cout << "Down";
                }

                if(Player1->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT)
                                    {
                    std::cout << "Right";
                }

                if(Player1->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT)
                {
                    std::cout << "Left";
                }

                if(Player1->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_B)
                {
                    std::cout << "Right-Click";
                }

                if(Player1->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_A)
                {
                    std::cout << "Click";
                }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-08 18:43:37

我在我的游戏引擎中使用了以下代码;区分上升和下降键的诀窍是测量游戏键盘前后的状态:

代码语言:javascript
复制
void Nitro::GamePadState::GetState(u32 playerIndex)
{
    XINPUT_STATE xinputState;

    DWORD result = XInputGetState(playerIndex, &xinputState);

    if (result == ERROR_SUCCESS)
    {
        Triggers.Left = xinputState.Gamepad.bLeftTrigger;
        Triggers.Right = xinputState.Gamepad.bRightTrigger;
        ThumbSticks.Left = short2 (xinputState.Gamepad.sThumbLX, xinputState.Gamepad.sThumbLY);
        ThumbSticks.Right = short2 (xinputState.Gamepad.sThumbRX, xinputState.Gamepad.sThumbRY);
        mButtonStates.Update(xinputState.Gamepad.wButtons);
    }
}

class NitroAPI ButtonState
{
private:
    u32 mButtonStates;      // Current buttons' state
    u32 mPrevButtonStates;  // Previous buttons' state
    u32 mButtonDowns;       // 1 = button pressed this frame
    u32 mButtonUps;         // 1 = button released this frame

public:
    ButtonState();
    void Update(u32 newState);

    bool IsButtonDown(Buttons button) const;
    bool IsButtonFalling(Buttons button) const;
    bool IsButtonUp(Buttons button) const;
    bool IsButtonRising(Buttons button) const;
};

重要的方法是Update和IsButton*。我对上一个和当前按钮的状态进行异或运算,以区分发生了什么变化:

代码语言:javascript
复制
void Nitro::ButtonState::Update(u32 newState)
{
    mPrevButtonStates = mButtonStates;
    mButtonStates = newState;

    u32 buttonChanges = mButtonStates ^ mPrevButtonStates;
    mButtonDowns = buttonChanges & mButtonStates;
    mButtonUps = buttonChanges & (~mButtonStates);
}

然后进行简单的比较,看看哪个按钮发生了变化:

代码语言:javascript
复制
bool Nitro::ButtonState::IsButtonFalling(Buttons button) const
{
    return ((mButtonStates & button) != 0) && ((mPrevButtonStates & button) == 0);
}

bool Nitro::ButtonState::IsButtonRising(Buttons button) const
{
    return ((mButtonStates & button) == 0) && ((mPrevButtonStates & button) != 0);
}

bool Nitro::ButtonState::IsButtonDown(Buttons button) const
{
    return ((mButtonStates & button) != 0);
}

bool Nitro::ButtonState::IsButtonUp(Buttons button) const
{
    return ((mButtonStates & button) == 0);
}

在您的例子中,您可以通过将代码放在while循环中来缓解问题,或者使用类似于我发布的内容来跟踪瞬变:

代码语言:javascript
复制
while (true)
{
    DWORD Result = XInputGetState(_controllerNum, &_controllerState);
    if (result == ERROR_SUCCESS)
    {
        if(_controllerState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP)
        // ...
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11379466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档