2012-07-07 25 views
1

我正在按照教程CodeProject輸入,並認爲我會自己做一些。所以我試圖生成下面的代碼,但是當我按下D-pad或其他按鈕時,什麼也沒有發生。但是當我按下開始和返回按鈕時,它會註冊。提前致謝。爲什麼不是Xbox控制器響應?

CXBOXController

#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); 
} 

代碼

   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"; 
       } 

回答

1

我用我的遊戲引擎下​​面的代碼;招區分上升和下降鍵是前後來衡量遊戲鍵盤的狀態:

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; 
}; 

的重要方法是更新和IsButton *。我XOR以前和當前按鈕狀態來區分哪些改變:

void Nitro::ButtonState::Update(u32 newState) 
{ 
    mPrevButtonStates = mButtonStates; 
    mButtonStates = newState; 

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

然後,它是一個簡單的對比,看看改變什麼按鈕:

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循環,或者使用類似的東西是什麼我張貼,以跟蹤瞬態:

while (true) 
{ 
    DWORD Result = XInputGetState(_controllerNum, &_controllerState); 
    if (result == ERROR_SUCCESS) 
    { 
     if(_controllerState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) 
     // ... 
    } 
} 
+0

感謝,但這個錯誤是因爲你必須按下一個按鈕啓動之前做到這一點,但它是網元在if語句中,所以我給它分配了一個布爾值,如果布爾值爲true,那麼這些按鈕就起作用了 – 2012-07-08 13:04:16

相關問題