用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?
keyRelease
?
?
To be continued.
?
總結
以上是生活随笔為你收集整理的用Qt开发游戏时一些问题的解决方法(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt性能调节
- 下一篇: 用Xlib库进行基本图形编程