日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用Qt开发游戏时一些问题的解决方法(一)

發布時間:2025/4/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Qt开发游戏时一些问题的解决方法(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://blog.csdn.net/wsrlyk/article/details/5631573

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 plaincopyprint?
  • void?MyWidget::keyPressEvent(QKeyEvent*?evt)??
  • {??
  • ????switch(evt->key()){??
  • ????????case?Qt::Key_W:???
  • ????????????if(!evt->isAutoRepeat()&&!mKeyW){??
  • ????????????????mKeyW=true;??
  • ????????????????//之后是按下w的事件處理語句 ??
  • ????????????}??
  • ????????????break;??
  • ????????default:?break;??
  • ????}??
  • ????QWidget::keyPressEvent(evt);??
  • }??
  • void MyWidget::keyPressEvent(QKeyEvent* evt) {switch(evt->key()){case Qt::Key_W: if(!evt->isAutoRepeat()&&!mKeyW){mKeyW=true;//之后是按下w的事件處理語句}break;default: break;}QWidget::keyPressEvent(evt); }

    keyRelease


    [c-sharp] view plaincopyprint?
  • void?MyWidget::keyReleaseEvent(QKeyEvent*?evt)??
  • {??
  • ????switch(evt->key()){??
  • ????????case?Qt::Key_W:???
  • ????????????if(mKeyW&&!evt->isAutoRepeat()){??
  • ????????????????mKeyW=false;??
  • ????????????????//之后是松開w的事件處理語句 ??
  • ????????????}??
  • ????????????break;??
  • ????????default:?break;??
  • ????}??
  • ????QWidget::keyReleaseEvent(evt);??
  • }??
  • void MyWidget::keyReleaseEvent(QKeyEvent* evt) {switch(evt->key()){case Qt::Key_W: if(mKeyW&&!evt->isAutoRepeat()){mKeyW=false;//之后是松開w的事件處理語句}break;default: break;}QWidget::keyReleaseEvent(evt); } ?

    ?

    ?

    To be continued.

    ?

    總結

    以上是生活随笔為你收集整理的用Qt开发游戏时一些问题的解决方法(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。