2016-02-02 299 views
1

因此,我目前正在爲我的遊戲設計一個選項菜單,我有一個按鈕,當它按下時它將文本更改爲數組中的下一個分辨率,所以基本上用戶按下此按鈕來更改它們解析數組中的下一個字符串。SDL鼠標點擊

我的問題是獲取點擊事件。

現在,當用戶按下按鈕時,它將在鼠標關閉時返回true,而不是按下鼠標時返回true。我只想在鼠標按下時在鼠標事件中返回true。

我環顧四周,我發現的一切似乎都與我所做的相似,或者如我所說的,在鼠標關閉時返回true,而不是初始點擊。

我的活動都在eventmanager進行單處理,這裏是我看到的必要功能:

我的更新功能,這就是該事件被調查,值得注意的是我使用的是私有名爲「e」的SDL_Event。

void EventManager::update(){ 
    while(SDL_PollEvent(&e)){ 
     SDL_GetMouseState(&mouseX, &mouseY); 
     switch(e.type){ 
      case SDL_QUIT: 
       running = false; 

     } 
    } 
} 

我的鼠標按鈕功能,我想要一個鼠標按下返回。

int EventManager::mousePress(){ 
    if(e.type == SDL_MOUSEBUTTONDOWN){ 
     return e.button.button; 
    } 
    return 0; 
} 
+0

當你得到一個MOUSEBUTTONDOWN事件時,你可以設置一個布爾標誌,並且當你得到一個MOUSEBUTTONUP時清除它? –

+0

'(SDL_GetMouseState(&mouseX,&mouseY)&SDL_BUTTON(SDL_BUTTON_LEFT))'爲鼠標按下(左鍵單擊)? – share

+0

特里斯坦斑紋,這不會改變一件事,當e.type!= SDL_MOUSEBUTTONDOWN 0被返回,這意味着當鼠標左鍵被按住時,它將繼續返回true。正如我所說的,我希望它只在最初按下鼠標按鈕時才返回true。道歉,如果這在我的問題不夠清楚。 – genfy

回答

3

而不是使用SDL_GetMouseState(),它可以讓你的鼠標(那可能是其中它的名字來源於;)的實際狀態),使用要輪詢的事件。 SDL應該爲您提供一個SDL_MouseButtonEvent,其中包含您需要的信息,並且應該只排隊一次。

https://wiki.libsdl.org/SDL_MouseButtonEvent

編輯澄清我的意思:

你會使用這樣的:

void EventManager::update(){ 
    SDL_Event e; 
    while(SDL_PollEvent(&e)){ 
     switch(e.type){ 
      case SDL_QUIT: 
       running = false; 
       break; 
      case SDL_MOUSEBUTTONDOWN: 
       //do whatever you want to do after a mouse button was pressed, 
       // e.g.: 
       mousePress(e.button); 
       break; 

     } 
    } 
} 

裏面你mousePress-功能,您可以再進行測試,該鼠標按鈕已被按下:

void EventManager::mousePress(SDL_MouseButtonEvent& b){ 
    if(b.button == SDL_BUTTON_LEFT){ 
    //handle a left-click 
    } 
} 

This works,b因爲SDL_PollEvent只會爲每個事件返回一次。如果沒有新的事件,它將返回一個空的事件。因此,之後1次click = 1次SDL_PollEvent(),其中e爲SDL_MOUSEBUTTONDOWN類型,1次SDL_PollEvent(),其後e類型爲SDL_MOUSEBUTTONUP。如果您在之間或之後調用SDL_PollEvent(),它將返回0並將e保留爲空事件,根本不調用switch。如果您迴應MOUSEBUTTONDOWN或MOUSEBUTTONUP或兩者都取決於您...

我也宣佈SDL_Event爲update()的局部變量。爲什麼?一個事件背後的想法是,每當發生某個事件時,就有一個事件對象。然後你對事件做出反應並忘記它。所以他們不需要有一個全局變量。如果你想防止不斷的構造/破壞,你也可以聲明它是靜態的。但那只是一些提示,與您的原始問題無關。

+0

我將使用哪個成員?狀態在鼠標關閉時返回,類型也一樣。我將如何獲得最初的鼠標按下? – genfy

+1

我添加了一些代碼,希望澄清它 – Anedar