转自: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?
  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. }

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?
  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. }

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开发游戏时一些问题的解决方法(一)相关推荐

  1. Eclipse + Pydev开发Python时import报错解决方法

    一.  原文链接:http://blog.csdn.net/lhanchao/article/details/51306626            用eclipse +PyDev开发python时, ...

  2. 《古墓丽影8》游戏时atiumdag.dll 崩溃解决方法

    最近玩<古墓丽影8>时经常出现一个错误,在事件查看器里有如下内容: Faulting application name: tru.exe, version: 1.0.0.0, time s ...

  3. Qt中“调试器未设置”的解决方法

    Qt中"调试器未设置"的解决方法 1.问题的提出 QtCreator + Qt5 进行开发.然而,在此过程中,我发现程序按F5可以直接运行.但设置断点进入调试模式时,却弹出&quo ...

  4. 编译Qt“NMAKE:fatal error U1077”错误的解决方法

    编译Qt"NMAKE:fatal error U1077"错误的解决方法 分类: 错误与解决方法 2013-03-18 20:17 1775人阅读 评论(0) 收藏 举报 Qtfa ...

  5. 手机游戏显示不了服务器闪退,手机为什么玩游戏闪退_手机游戏进去就闪退解决方法...

    智能手机在我们平时生活中扮演的角色越来越重要,但在使用过程中或多或少都会遇到一些问题.例如最近就用户小伙伴跟小编反映说,自己的手机出现了玩游戏闪退的情况,这是为什么呢?我们又该怎么来处理呢?对此下面为 ...

  6. 前端开发中遇到的问题及解决方法

    前端开发中遇到的问题及解决方法 1,何为MVVM? view层: 视觉层:在前端开发中,通常是DOM层:主要作用是给用户展示各种信息: Model层: 数据层:数据可能是我们固定的死数据,更多的是来自 ...

  7. 项目开发使用教程和常见问题和解决方法

    项目开发使用教程和常见问题和解决方法 目录 目录 项目开发使用教程和常见问题和解决方法 一.Python开发环境搭建 1. 安装cuda cudnn(深度学习入门必装) (1)Windows安装方法 ...

  8. 关于安装nagios make all时出现问题的解决方法

    关于安装nagios make all时出现问题的解决方法 在安装nagios时经常会出现 make[1]: *** [cmd.cgi] Error 1 make[1]: Leaving direct ...

  9. Qt QComboBox下拉框文字重叠解决方法

    Qt QComboBox下拉框文字重叠解决方法 参考文章: (1)Qt QComboBox下拉框文字重叠解决方法 (2)https://www.cnblogs.com/nanqiang/p/10559 ...

最新文章

  1. linux 文件操作函数,Linux下的文件操作函数及creat用法
  2. C++知识点44——类的继承概述
  3. H5Stream播放RTSP流视频
  4. 如何把python文件发给别人没_如何把自己写的python程序给别人用
  5. java客户端服务器聊天程序流程图_基于java的socket简单聊天编程
  6. Spring 框架RCE 安全漏洞及解决方式
  7. 蓝桥杯——说好的进阶之入学考试
  8. 剑指:合并两个排序的链表
  9. synaptics触摸板_使用Dell Synaptics触摸板修复Firefox滚动问题
  10. 外贸网站服务器搬迁方案,WordPress网站迁移到新服务器教程
  11. irq_desc操作
  12. 漫话:如何给女朋友解释什么是CDN?
  13. md5加密校验 java_Java实现MD5加密和文件校验
  14. 使用python爬取某药品网站药品说明
  15. win10左右声道音量不一致的解决方法
  16. [文心大模型创意项目]还在愁没有头像?属于你的个人头像来了!
  17. 网易邮箱恢复服务器上删除邮件吗,网易企业邮箱普通邮箱删除邮件找回
  18. C语言:猴子吃桃问题:猴子第一天摘下若干桃子,当即吃了一半多一个,第二天将剩下的桃子吃掉一半多一个,以后每天都吃掉前一天剩下桃子的一半多一个。到第10天想再吃时,只剩下一个桃子。
  19. 微信公众号还会有二次繁荣吗?
  20. discuzx不同网站孪生共用应用中心,或者应用中心密码忘记找不回的问题

热门文章

  1. No changes detected
  2. PolyBase 指南
  3. [LeetCode] Binary Tree Postorder题解
  4. XX公司珠宝进销分销系统设计
  5. 字符集详解 ------------------------ UNICODE +UTF8
  6. jquery ajax 序列化表单传参提交实体对象到后台action
  7. SharePoint 如何检查一个SPWeb是否存在
  8. C#调试中,在VS的输出窗口或即时窗口显示消息
  9. 使用纯C语言开始win32 sdk编程
  10. DEVICE_ATTR