游戏杆编程心得二:如何判断按钮的有效按下
作者:朱金灿
来源: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
游戏杆编程心得二:如何判断按钮的有效按下相关推荐
- JoyStick游戏杆编程实践
概述 最近突然对如何编程读取游戏手柄输入比较感兴趣.所以上网找了找相关的资料,发现没有什么简单明了的教程,所以在此将收集到跟joystick游戏杆编程相关资料整理一下,方便大家参考使用. JoySti ...
- 第五课-第三讲05_03_bash脚本编程之二 条件判断
第五课-第三讲05_03_bash脚本编程之二 条件判断 变量名称:只能保含字母数字下划线,且不能数字开头.不能和系统中已存在的环境变量重名.见名知意 bash中如何实现条件判断? 条件测试类型: 整 ...
- Windows下对游戏杆编程
我现在所知道的获取游戏杆输入的方法有4种,第4种才是我要说的正题. 1.用DDK通过USB接口直接访问游戏杆 2.通过汇编访问游戏杆 据说在NT下不能这么用了 3.用Direct Input 也许会很 ...
- Unity 3D 游戏与编程
3D 游戏与编程--作业二 1.简答题 1)解释 游戏对象(GameObject)和 资源(Assets)的区别和联系 Assets 是游戏中具体的资源,比如 texture,mesh,materia ...
- 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)
原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...
- 游戏核心编程之一 概述
第一节. 概述 随着计算机技术的发展,计算机从高技术的神坛上走下来,走进我们的家庭,走进我们 的娱乐生活中.在家用计算机的使用中, ...
- 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7405479 作者:毛星云 邮箱: happyl ...
- 3D游戏设计读书笔记二
3D游戏设计读书笔记二 一.简答题 • 解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系. GameObjects是一个具体的实例,Assets是包括诸多游戏素材的资 ...
- CSDN 编程竞赛二十八期题解
竞赛总览 CSDN 编程竞赛二十八期:比赛详情 (csdn.net) 本期竞赛的题目都很简单,但是非常考验读题和编码速度.这一次没有遇到bug,竞赛体验较好. 竞赛题解 题目1.小Q的鲜榨柠檬汁 团建 ...
最新文章
- genisoimage命令用法
- python复数类型-python复数类型
- python上海培训哪里比较好-python培训班上海哪里比较好?
- EK算法应用,构图(POJ1149)
- 计算机的安全设置在哪儿,电脑防火墙在哪里设置
- php 显示中文utf,php adodb 从mysql数据库中输出中文显示到utf编码网页乱码问题
- windows绕开强制更新
- 办公软件在多屏宽屏上的应用设想
- 2022年武汉CMMI3-CMMI5认证企业名录
- JSONObject没有fromObject方法及其依赖引入
- (转)番茄时间管理法(Pomodoro Technique)
- 传奇世界3D手游电脑版使用教程:无需安卓模拟器,tcgames完美适配
- WPF Resource资源
- c语言写街机,C 实现 Atari 经典街机游戏《飞天蜈蚣》
- [20151018]SCZ训练
- 根据ParentId生成树状结构这po事
- Python用try-except的时候获取错误行信息和文件信息
- 工作遇坑-Cannot allocate memory问题解决方法
- windows 2003 R2+IIS ssl证书认证
- 李嘉诚--理财--如何支配你的金钱