2013-02-10 30 views
0

首先我想說我不確定標題是否合適,但這是我能找到的唯一合理解釋。SFML2 Mouse :: isButtonPressed填滿事件隊列

我想要做的是通過點擊一個精靈(有點像模擬一個標題欄)來移動我的窗口。 所有工作正常,直到我放開鼠標按鈕發出新的鼠標事件的速度會降低,並且在它們之間有1.5到2秒的巨大停頓時間。

是否有可能sf :: Mouse :: isBUttonPressed正在填充隊列還是另一個問題?

編輯:窗口類有一個sf :: Event對象,並將其傳遞給每個對象的事件處理程序。 Sprite類具有這種形式的一個事件處理程序:負責移動窗口

bool object::handleEvents(sf::Event& event) 
{ 
    switch(event.type) 
    { 
     case sf::Event::MouseMoved: 
     case sf::Event::MouseButtonPressed: 
     case sf::Event::MouseButtonReleased: 
     { 
      auto mouse_pos = sf::Mouse::getPosition(*this->parent); 

      if(this->isPointInside(mouse_pos)) 
      { 
       if(event.type == sf::Event::MouseMoved) 
       { 
        this->hovering = true; 

        if(this->callback["onHover"]) 
         this->callback["onHover"](this, nullptr); 

        return true; 
       } 
       else if(event.type == sf::Event::MouseButtonPressed) 
       { 
        this->clicked = true; 
        this->focused = true; 

        if(event.mouseButton.button == sf::Mouse::Left) 
         if(this->callback["onLClick"]) 
          this->callback["onLClick"](this, ref(mouse_pos)); 

        if(event.mouseButton.button == sf::Mouse::Right) 
         if(this->callback["onRClick"]) 
          this->callback["onRClick"](this, ref(mouse_pos)); 

        return true; 
       } 
       else if(event.type == sf::Event::MouseButtonReleased && this->clicked) 
        { 
         this->clicked = false; 

         if(event.mouseButton.button == sf::Mouse::Left) 
          if(this->callback["onLClickReleased"]) 
           this->callback["onLClickReleased"](this, ref(mouse_pos)); 

         if(event.mouseButton.button == sf::Mouse::Right) 
          if(this->callback["onRClickReleased"]) 
           this->callback["onRClickReleased"](this, ref(mouse_pos)); 

         return true; 
        } 
       } 
      else 
      { 
       if(this->hovering) 
       { 
        if(this->callback["onHoverLost"]) 
         this->callback["onHoverLost"](this, nullptr); 
        this->hovering = false; 
       } 
      } 
     }break; 

     default: ; 
    } 
    return false; 
} 

和代碼:

titlebar->callback["onLClick"] = [&](object* obj, void* data) 
{ 
    sf::Vector2i* relpos = (sf::Vector2i*)(data); 
    while(sf::Mouse::isButtonPressed(sf::Mouse::Left)) 
    { 
     sf::Vector2i abspos = sf::Mouse::getPosition(); 
     window.setPosition(sf::Vector2i((abspos.x - relpos->x),(abspos.y - relpos->y))); 
    } 
    titlebar->clicked = false; 
}; 
+0

一些代碼證明這個問題會很好。 – 2013-02-10 19:46:07

+0

新增了一些代碼 – user1233963 2013-02-10 19:56:20

回答

0

sf::Mouse類以及sf::Keyboardsf::Joystick沒有連接到事件系統,但是完全獨立,因此不可能對事件產生任何影響。

當您按下鼠標左鍵時,代碼中的真正問題是'無限'循環。如果按下鼠標左鍵,則應用程序中發生的所有事情都是窗口四處移動。將不會有任何事件派發(=處理),並且在該時間內發生的每個事件都將被放入事件隊列中。因此,當您返回處理事件時,您的隊列將比平常長,並將開始分派最早的事件。 所以,如果你現在將你的窗戶移動2秒鐘,你會得到一個值得2秒的隊列,這可能會延遲進一步的處理。

要解決此問題,您最有可能必須在移動窗口時分派所有事件。

+0

我應該怎麼做?我嘗試添加window.pollEvent(window.events);在while循環內但沒有成功。 – user1233963 2013-02-13 08:43:02

+0

那麼你基本上檢查是否按下鼠標每一幀迭代,如果是這樣的窗口移動。在每次幀迭代時都會自動處理事件。所以你實際上想用if語句來替換while循環,這會檢查'clicked'狀態。 – Lukas 2013-02-13 13:16:01