用Qt開發遊戲時一些問題的解決方法(一)

2021-05-28 11:19:18 字數 1686 閱讀 3796

本文**

謝謝作者分享.

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

view plaincopy to clipboardprint?

void battlegamemanager::keypressevent(qkeyevent* evt)  

--mpressflag_w; //改變flag  

}  

break;

void battlegamemanager::keypressevent(qkeyevent* evt)

--mpressflag_w; //改變flag

}break;

keyrelease

view plaincopy to clipboardprint?

void keyreleaseevent(qkeyevent* evt)  

break;  

default: break;  

}  

qwidget::keyreleaseevent(evt);  

} void keyreleaseevent(qkeyevent* evt)

break;

default: break;

}qwidget::keyreleaseevent(evt);

}to be continued.

用ads除錯時遇到的一些問題

除錯這個程式好久了,今天終於也順利通過,對出現的一些問題也加以記錄。以便日後檢視 1.提示warning,inventing extern int 變數 這種情況一般是因為沒有給變數副初值造成。這是只要給變數附乙個值就ok了 如果是函式的話也可能是因為在呼叫這個函式前沒有對函式進行必要的申明 可以在...

開發遇到的一些問題

持續更新 1.禁止以複製 貼上以及剪下的方式操作密碼框中的內容 password bind copy cut paste function 2.當頁面取值為乙個字段,但是欄位中有很多資料,用,分割,展示的時候要換行,如何處理?半形的不斷行的空白格 推薦使用 半形的空格 全形的空格 3.比較值時,需要...

總結初用erlang 時的遇到一些問題

算起來接觸erlang 快四個月來,從零開始看書寫erlang 修改rabbitmq 業務開發 系統調優,總算是有點入門了。最難受的是邊學邊修改rabbitmq,難受只是暫時的,憋過去就海闊天空,最後提交修改2000 行 說到坑都是自己技術不過關造成,erlang 設計與一般語言很大不同,雖然簡單但...