作者:朱金灿
来源:http://blog.csdn.net/clever101

在游戏杆编程中通过一般需要获取按钮状态来执行特定事件,比如实现按下按钮1一次,变量num递增100,但在调试系统时往往会出现这种情况:明明按下按钮一次,但是变量num已经递增了好几百。这是怎么回事呢?开始我有点百思不得其解。但经过查看程序和思考,我找到了原因。原来程序中我使用了时钟事件,设置了一个时钟,这个时钟表示系统每50毫秒获取游戏杆的按钮状态,具体代码如下:

SetTimer( hDlg, 0, 50, NULL );

同时在Ontimer函数里判断按钮按下时我采用了这样的判断语句:

// js.rgbButtons[0]表示按钮1,js.rgbButtons[0] & 0x80表示按钮1处于被按下状态 if( js.rgbButtons[0] & 0x80 ) { num = num +100; }

后来我认为这种判断条件是有问题。问题在哪里?主要是没有考虑状态的实时更新性,为什么会出现按下按钮一次,但是变量num已经递增了好几百的情况下?这是因为人按下按钮的持续时间(即按钮从被按下到弹起的时间间隔)是不确定,有可能是几十毫秒或几秒,但系统获取按钮状态的时间却是确定的(系统不管你的按钮已被按下了多少秒,总之系统就是每50毫秒获取一次按钮状态),那么会出现这样一种情况:当你按下按钮的时间超过100毫秒时,那么系统认为你已经按下按钮已经2次了。一种直接的解决办法是将时钟事件的响应时间从50毫秒改为几秒,这下按下按钮短于这个时间的都会认为有效。但我认为这不是一个有效的解决办法,因为无法证明时钟事件响应时间设定为多长是合适的。我想了一个更为有效的办法,就是重新定义有效按下:有效按下就是按钮现在处于弹起状态,但它的前一个状态为按下,具体代码为:

/*! /brief 按钮状态枚举变量,Down为按下状态,Up为弹起状态 */ enum Status { Down = 0, Up };

然后在获取游戏杆状态的对话框类里定义一个私有数据成员:

Status m_Btn1PreStatus; // 用于保存按钮的前一个状态

在对话框类的构造函数初始化m_Btn1PreStatus为弹起状态:

m_Btn1PreStatus = Up;

修改变量num递增100的判断部分代码:

// 如果当前按钮被按下而它的前状态为弹起,则修改它的前状态为按下 if((js.rgbButtons[0] & 0x80)&&( m_Btn1PreStatus==Up)) { m_Btn1PreStatus = Down; } //如果当前按钮的状态为弹起而它的前状态为按下,则num递增,同时修改它的前状态为弹起 else if((js.rgbButtons[0] & 0x80)==0)&&( m_Btn1PreStatus ==Down) { num = num +100; m_Btn1PreStatus = Up; }

这次得到的经验是获取硬件状态必须考虑它的实时性。

转载于:https://www.cnblogs.com/lanzhi/archive/2009/12/28/6471102.html

游戏杆编程心得二:如何判断按钮的有效按下相关推荐

  1. JoyStick游戏杆编程实践

    概述 最近突然对如何编程读取游戏手柄输入比较感兴趣.所以上网找了找相关的资料,发现没有什么简单明了的教程,所以在此将收集到跟joystick游戏杆编程相关资料整理一下,方便大家参考使用. JoySti ...

  2. 第五课-第三讲05_03_bash脚本编程之二 条件判断

    第五课-第三讲05_03_bash脚本编程之二 条件判断 变量名称:只能保含字母数字下划线,且不能数字开头.不能和系统中已存在的环境变量重名.见名知意 bash中如何实现条件判断? 条件测试类型: 整 ...

  3. Windows下对游戏杆编程

    我现在所知道的获取游戏杆输入的方法有4种,第4种才是我要说的正题. 1.用DDK通过USB接口直接访问游戏杆 2.通过汇编访问游戏杆 据说在NT下不能这么用了 3.用Direct Input 也许会很 ...

  4. Unity 3D 游戏与编程

    3D 游戏与编程--作业二 1.简答题 1)解释 游戏对象(GameObject)和 资源(Assets)的区别和联系 Assets 是游戏中具体的资源,比如 texture,mesh,materia ...

  5. 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)

    原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...

  6. 游戏核心编程之一 概述

    第一节.                                    概述 随着计算机技术的发展,计算机从高技术的神坛上走下来,走进我们的家庭,走进我们 的娱乐生活中.在家用计算机的使用中, ...

  7. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理

    本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7405479 作者:毛星云    邮箱: happyl ...

  8. 3D游戏设计读书笔记二

    3D游戏设计读书笔记二 一.简答题 • 解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系.   GameObjects是一个具体的实例,Assets是包括诸多游戏素材的资 ...

  9. CSDN 编程竞赛二十八期题解

    竞赛总览 CSDN 编程竞赛二十八期:比赛详情 (csdn.net) 本期竞赛的题目都很简单,但是非常考验读题和编码速度.这一次没有遇到bug,竞赛体验较好. 竞赛题解 题目1.小Q的鲜榨柠檬汁 团建 ...

最新文章

  1. genisoimage命令用法
  2. python复数类型-python复数类型
  3. python上海培训哪里比较好-python培训班上海哪里比较好?
  4. EK算法应用,构图(POJ1149)
  5. 计算机的安全设置在哪儿,电脑防火墙在哪里设置
  6. php 显示中文utf,php adodb 从mysql数据库中输出中文显示到utf编码网页乱码问题
  7. windows绕开强制更新
  8. 办公软件在多屏宽屏上的应用设想
  9. 2022年武汉CMMI3-CMMI5认证企业名录
  10. JSONObject没有fromObject方法及其依赖引入
  11. (转)番茄时间管理法(Pomodoro Technique)
  12. 传奇世界3D手游电脑版使用教程:无需安卓模拟器,tcgames完美适配
  13. WPF Resource资源
  14. c语言写街机,C 实现 Atari 经典街机游戏《飞天蜈蚣》
  15. [20151018]SCZ训练
  16. 根据ParentId生成树状结构这po事
  17. Python用try-except的时候获取错误行信息和文件信息
  18. 工作遇坑-Cannot allocate memory问题解决方法
  19. windows 2003 R2+IIS ssl证书认证
  20. 李嘉诚--理财--如何支配你的金钱

热门文章

  1. 【最佳实践】如何通过OSS的Bucket Policy设置访问授权?
  2. OpenVAS漏洞扫描
  3. 集群调度架构的变革 (二)
  4. UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
  5. 仓库管理系统gitlab
  6. 屏蔽敏感词的正则表达式
  7. Linux学习之CentOS(三十四)--配置域主DNS服务器
  8. cisco交换机Telnet配置
  9. 2673(2673)shǎ崽 OrOrOrOrz
  10. java多线程实现归并排序_利用多线程对数组进行归并排序