重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Qt是一个不错的库。因此在一些场合下,可以基于Qt搭建程序和游戏框架。
我们提供的服务有:成都网站制作、做网站、微信公众号开发、网站优化、网站认证、顺德ssl等。为近千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的顺德网站制作公司下面谈下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
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
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
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
踩
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。