2015-02-10 79 views
0

我嘗試使用SDL來映射類似於xbox360遊戲手柄的遊戲手柄。現在使用的按鈕,我用這個代碼:如何在SDL 2.0 C++中使用操縱桿的數字鍵盤

std::vector<bool> tempButtons; 
       for (int j = 0; j < SDL_JoystickNumButtons(joy); j++) 
       { 
        tempButtons.push_back(false); 
       } 
       m_buttonStates.push_back(tempButtons); 

喜悅是SDL_Joystick *和m_buttonStates是一個載體。 不幸的是這個功能並沒有數碼板的4個按鈕,我現在不爲什麼...... 這是我的遊戲手柄: http://www.trust.com/it-it/all-products/17518-gxt-530-dual-stick-gamepad 謝謝你,對不起,我沒有很好的英語

回答

1

謝謝拉戈·席爾瓦,但一些測試後,我解決了這個代碼的問題:

void InputHandler::Update() { 
SDL_Event e; 
while (SDL_PollEvent(&e)){ 
    m_keyState = SDL_GetKeyboardState(NULL); 
    { 
     switch (e.type) 
     { 
     case SDL_QUIT:TheGame::Instance()->Quit(); break; 
     case SDL_KEYDOWN:KeyboardButtonDown(); break; 
     case SDL_KEYUP:KeyboardButtonUp(); break; 
     case SDL_JOYAXISMOTION:JoyAxisMotion(e); break; 
     case SDL_JOYBUTTONDOWN:JoyButtonDown(e); break; 
     case SDL_JOYBUTTONUP:JoyButtonUp(e); break; 
     case SDL_JOYHATMOTION:JoyHatMotion(e); break;  //this is the code that I have implemented 
     case SDL_MOUSEBUTTONDOWN:MouseButtonDown(e); break; 
     case SDL_MOUSEBUTTONUP:MouseButtonUp(e); break; 
     case SDL_MOUSEMOTION:MouseMotion(e); break; 
     default:break; 
     } 
    } 
}} 

代碼JoyHatMotion(E)調用這個函數:

void InputHandler::JoyHatMotion(SDL_Event e){ 
int whichOne = e.jaxis.which; 
switch (e.jhat.value) 
{ 
case SDL_HAT_DOWN:m_joyHatValues[whichOne]->Sety(1); m_joyHatValues[whichOne]->Setx(0); break; 
case SDL_HAT_CENTERED:m_joyHatValues[whichOne]->Setx(0); m_joyHatValues[whichOne]->Sety(0); break; 
case SDL_HAT_LEFTDOWN:m_joyHatValues[whichOne]->Setx(-1); m_joyHatValues[whichOne]->Sety(1); break; 
case SDL_HAT_LEFT:m_joyHatValues[whichOne]->Setx(-1); m_joyHatValues[whichOne]->Sety(0); break; 
case SDL_HAT_LEFTUP:m_joyHatValues[whichOne]->Setx(-1); m_joyHatValues[whichOne]->Sety(-1); break; 
case SDL_HAT_UP:m_joyHatValues[whichOne]->Setx(0); m_joyHatValues[whichOne]->Sety(-1); break; 
case SDL_HAT_RIGHTUP:m_joyHatValues[whichOne]->Setx(1); m_joyHatValues[whichOne]->Sety(-1); break; 
case SDL_HAT_RIGHT:m_joyHatValues[whichOne]->Setx(1); m_joyHatValues[whichOne]->Sety(0); break; 
case SDL_HAT_RIGHTDOWN:m_joyHatValues[whichOne]->Setx(1); m_joyHatValues[whichOne]->Sety(1); break; 
}} 

注ŧ帽子m_joyHatValues是的Vector2D *

class Vector2D{private: 
float x; 
float y; 

公共: 的Vector2D(浮動_x,浮子_y):X(_x),Y(_y){}

float Getx(){ return x; } 
float Gety(){ return y; } 
void Setx(float _x){ this->x = _x; } 
void Sety(float _y){ this->y = _y; } 

float Length(){ return sqrt((x*x) + (y*y)); }  //la distanza dall'origine 

Vector2D operator+(const Vector2D&v2)const{ return Vector2D(this->x + v2.x, this->y + v2.y); } 
friend Vector2D operator+=(Vector2D& v1, const Vector2D& v2){ v1.x += v2.x; v1.y += v2.y; return v1; } 
Vector2D operator- (const Vector2D&v2)const{ return Vector2D(this->x - v2.x, this->y - v2.y); } 
friend Vector2D operator-=(Vector2D& v1, const Vector2D&v2){ v1.x -= v2.x; v1.y -= v2.y; return v1; } 
Vector2D operator*(float scala){ return Vector2D(this->x*scala, this->y*scala); } 
Vector2D& operator*=(float scala){ this->x *= scala; this->y *= scala; return *this; } 
Vector2D operator/(float scala){ return Vector2D(this->x/scala, this->y/scala); } 
Vector2D& operator/=(float scala){ this->x /= scala; this->y /= scala; return *this; } 

void Normalize();  //porta la distanza a 0 moltiplicanto il vector2D per il suo reciproco 

};