温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》
  • 首页 > 
  • 教程 > 
  • 开发技术 > 
  • Qt是一个不错的库。因此在一些场合下,可以基于Qt搭建程序和游戏框架。

Qt是一个不错的库。因此在一些场合下,可以基于Qt搭建程序和游戏框架。

发布时间:2020-07-29 01:50:06 来源:网络 阅读:859 作者: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