您好,登錄后才能下訂單哦!
Qt是一個不錯的庫。因此在一些場合下,可以基于Qt搭建程序和游戲框架。
下面談下Qt作為游戲框架所遇到的問題及解決方法
(一)按鍵
可重載Widget中的keyPressEvent、keyReleaseEvent、mousePressEvent、mouseReleaseEvent、mouseMoveEvent函數(shù)處理
但keyPressEvent有一個問題。在Windows下(別的環(huán)境我不知道……),按住一個鍵時,會先響應(yīng)一次,停頓一會,然后才開始不斷響應(yīng)。在游戲中這種特性的表現(xiàn)是 人物先走一步,停一下,然后繼續(xù)不斷地走。
這個特性非常影響游戲體驗,因此通常的解決方法是:press時,設(shè)置某個flag為true,release時,設(shè)flag為false,然后在游戲渲染循環(huán)中根據(jù)flag的值決定人物的行動(即通過忙等待方式而不是中斷方式)
但Qt的鍵盤函數(shù)仍然有一個問題,它不是“人按下按鍵才觸發(fā)keyPressEvent,彈起按鍵才觸發(fā)keyReleaseEvent”,而是“輸出按鍵消息前觸發(fā)keyPressEvent,輸出后觸發(fā)keyReleaseEvent”。表現(xiàn)為按住一個鍵時,不斷地press、release、press、release、press、release……
好在Qt提供了另一個功能,鍵盤事件類QKeyEvent中提供autorepeat判斷,即按住按鍵時觸發(fā)的那些鍵盤事件屬于autorepeat類型,因此可據(jù)此排除中間的那些press、release
但Qt的鍵盤事件依然有一個非常囧的現(xiàn)象(我不清楚為啥會這樣),按住一個鍵時:
1. 觸發(fā)keyPressEvent,isAutoRepeat()返回false
2. 沒有觸發(fā)keyReleaseEvent,停頓一會
3. 觸發(fā)keyPressEvent,isAutoRepeat()返回true
4. 觸發(fā)keyReleaseEvent
5. 若沒松開按鍵,isAutoRepeat()返回true,返回3;松開按鍵,isAutoRepeat()返回false
所以有時需要設(shè)置一個flag避免第二步造成的影響
最終代碼如下:
keyPress
[cpp] view plaincopy
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);
}
[cpp] view plain copy
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 plaincopy
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);
}
[c-sharp] view plain copy
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.
頂
0
踩
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。