91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • Qt是一個不錯的庫。因此在一些場合下,可以基于Qt搭建程序和游戲框架。

Qt是一個不錯的庫。因此在一些場合下,可以基于Qt搭建程序和游戲框架。

發布時間:2020-07-29 01:50:06 來源:網絡 閱讀:860 作者:WZM3558862 欄目:開發技術

Qt是一個不錯的庫。因此在一些場合下,可以基于Qt搭建程序和游戲框架。

 

下面談下Qt作為游戲框架所遇到的問題及解決方法

 

(一)按鍵

 

可重載Widget中的keyPressEvent、keyReleaseEvent、mousePressEvent、mouseReleaseEvent、mouseMoveEvent函數處理

 

但keyPressEvent有一個問題。在Windows下(別的環境我不知道……),按住一個鍵時,會先響應一次,停頓一會,然后才開始不斷響應。在游戲中這種特性的表現是 人物先走一步,停一下,然后繼續不斷地走。

 

這個特性非常影響游戲體驗,因此通常的解決方法是:press時,設置某個flag為true,release時,設flag為false,然后在游戲渲染循環中根據flag的值決定人物的行動(即通過忙等待方式而不是中斷方式)

 

但Qt的鍵盤函數仍然有一個問題,它不是“人按下按鍵才觸發keyPressEvent,彈起按鍵才觸發keyReleaseEvent”,而是“輸出按鍵消息前觸發keyPressEvent,輸出后觸發keyReleaseEvent”。表現為按住一個鍵時,不斷地press、release、press、release、press、release……

 

好在Qt提供了另一個功能,鍵盤事件類QKeyEvent中提供autorepeat判斷,即按住按鍵時觸發的那些鍵盤事件屬于autorepeat類型,因此可據此排除中間的那些press、release

 

但Qt的鍵盤事件依然有一個非常囧的現象(我不清楚為啥會這樣),按住一個鍵時:

 

1. 觸發keyPressEvent,isAutoRepeat()返回false

2. 沒有觸發keyReleaseEvent,停頓一會

3. 觸發keyPressEvent,isAutoRepeat()返回true

4. 觸發keyReleaseEvent

5. 若沒松開按鍵,isAutoRepeat()返回true,返回3;松開按鍵,isAutoRepeat()返回false

 

所以有時需要設置一個flag避免第二步造成的影響

 

最終代碼如下:

 

keyPress

 

[cpp] view plaincopy

  1. void MyWidget::keyPressEvent(QKeyEvent* evt)  

  2. {  

  3.     switch(evt->key()){  

  4.         case Qt::Key_W:   

  5.             if(!evt->isAutoRepeat()&&!mKeyW){  

  6.                 mKeyW=true;  

  7.                 //之后是按下w的事件處理語句   

  8.             }  

  9.             break;  

  10.         defaultbreak;  

  11.     }  

  12.     QWidget::keyPressEvent(evt);  

  13. }  

[cpp] view plain copy

  1. void MyWidget::keyPressEvent(QKeyEvent* evt)  

  2. {  

  3.     switch(evt->key()){  

  4.         case Qt::Key_W:   

  5.             if(!evt->isAutoRepeat()&&!mKeyW){  

  6.                 mKeyW=true;  

  7.                 //之后是按下w的事件處理語句  

  8.             }  

  9.             break;  

  10.         defaultbreak;  

  11.     }  

  12.     QWidget::keyPressEvent(evt);  

  13. }  




keyRelease



[c-sharp] view plaincopy

  1. void MyWidget::keyReleaseEvent(QKeyEvent* evt)  

  2. {  

  3.     switch(evt->key()){  

  4.         case Qt::Key_W:   

  5.             if(mKeyW&&!evt->isAutoRepeat()){  

  6.                 mKeyW=false;  

  7.                 //之后是松開w的事件處理語句   

  8.             }  

  9.             break;  

  10.         defaultbreak;  

  11.     }  

  12.     QWidget::keyReleaseEvent(evt);  

  13. }  

[c-sharp] view plain copy

  1. void MyWidget::keyReleaseEvent(QKeyEvent* evt)  

  2. {  

  3.     switch(evt->key()){  

  4.         case Qt::Key_W:   

  5.             if(mKeyW&&!evt->isAutoRepeat()){  

  6.                 mKeyW=false;  

  7.                 //之后是松開w的事件處理語句  

  8.             }  

  9.             break;  

  10.         defaultbreak;  

  11.     }  

  12.     QWidget::keyReleaseEvent(evt);  

  13. }  

Qt是一個不錯的庫。因此在一些場合下,可以基于Qt搭建程序和游戲框架。

 




 

 

To be continued.

 

  • 0


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南江县| 栾川县| 西畴县| 盖州市| 宁化县| 舟山市| 仙游县| 九台市| 无极县| 平利县| 汕头市| 丰镇市| 乌恰县| 甘洛县| 托克托县| 南雄市| 阳高县| 綦江县| 万安县| 申扎县| 启东市| 四会市| 大姚县| 博野县| 绩溪县| 金乡县| 巴彦淖尔市| 罗源县| 新余市| 伊川县| 汕头市| 武鸣县| 恩平市| 惠东县| 枣庄市| 张北县| 山东| 嵩明县| 万安县| 呼和浩特市| 武义县|