用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
- 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);
- }
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
- 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);
- }
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开发游戏时一些问题的解决方法(一)相关推荐
- Eclipse + Pydev开发Python时import报错解决方法
一. 原文链接:http://blog.csdn.net/lhanchao/article/details/51306626 用eclipse +PyDev开发python时, ...
- 《古墓丽影8》游戏时atiumdag.dll 崩溃解决方法
最近玩<古墓丽影8>时经常出现一个错误,在事件查看器里有如下内容: Faulting application name: tru.exe, version: 1.0.0.0, time s ...
- Qt中“调试器未设置”的解决方法
Qt中"调试器未设置"的解决方法 1.问题的提出 QtCreator + Qt5 进行开发.然而,在此过程中,我发现程序按F5可以直接运行.但设置断点进入调试模式时,却弹出&quo ...
- 编译Qt“NMAKE:fatal error U1077”错误的解决方法
编译Qt"NMAKE:fatal error U1077"错误的解决方法 分类: 错误与解决方法 2013-03-18 20:17 1775人阅读 评论(0) 收藏 举报 Qtfa ...
- 手机游戏显示不了服务器闪退,手机为什么玩游戏闪退_手机游戏进去就闪退解决方法...
智能手机在我们平时生活中扮演的角色越来越重要,但在使用过程中或多或少都会遇到一些问题.例如最近就用户小伙伴跟小编反映说,自己的手机出现了玩游戏闪退的情况,这是为什么呢?我们又该怎么来处理呢?对此下面为 ...
- 前端开发中遇到的问题及解决方法
前端开发中遇到的问题及解决方法 1,何为MVVM? view层: 视觉层:在前端开发中,通常是DOM层:主要作用是给用户展示各种信息: Model层: 数据层:数据可能是我们固定的死数据,更多的是来自 ...
- 项目开发使用教程和常见问题和解决方法
项目开发使用教程和常见问题和解决方法 目录 目录 项目开发使用教程和常见问题和解决方法 一.Python开发环境搭建 1. 安装cuda cudnn(深度学习入门必装) (1)Windows安装方法 ...
- 关于安装nagios make all时出现问题的解决方法
关于安装nagios make all时出现问题的解决方法 在安装nagios时经常会出现 make[1]: *** [cmd.cgi] Error 1 make[1]: Leaving direct ...
- Qt QComboBox下拉框文字重叠解决方法
Qt QComboBox下拉框文字重叠解决方法 参考文章: (1)Qt QComboBox下拉框文字重叠解决方法 (2)https://www.cnblogs.com/nanqiang/p/10559 ...
最新文章
- linux 文件操作函数,Linux下的文件操作函数及creat用法
- C++知识点44——类的继承概述
- H5Stream播放RTSP流视频
- 如何把python文件发给别人没_如何把自己写的python程序给别人用
- java客户端服务器聊天程序流程图_基于java的socket简单聊天编程
- Spring 框架RCE 安全漏洞及解决方式
- 蓝桥杯——说好的进阶之入学考试
- 剑指:合并两个排序的链表
- synaptics触摸板_使用Dell Synaptics触摸板修复Firefox滚动问题
- 外贸网站服务器搬迁方案,WordPress网站迁移到新服务器教程
- irq_desc操作
- 漫话:如何给女朋友解释什么是CDN?
- md5加密校验 java_Java实现MD5加密和文件校验
- 使用python爬取某药品网站药品说明
- win10左右声道音量不一致的解决方法
- [文心大模型创意项目]还在愁没有头像?属于你的个人头像来了!
- 网易邮箱恢复服务器上删除邮件吗,网易企业邮箱普通邮箱删除邮件找回
- C语言:猴子吃桃问题:猴子第一天摘下若干桃子,当即吃了一半多一个,第二天将剩下的桃子吃掉一半多一个,以后每天都吃掉前一天剩下桃子的一半多一个。到第10天想再吃时,只剩下一个桃子。
- 微信公众号还会有二次繁荣吗?
- discuzx不同网站孪生共用应用中心,或者应用中心密码忘记找不回的问题