游戏手柄(JoyStick)的延时处理
如果做过游戏开发的朋友应该都知道,手柄的按键事件是非常敏感的,如果不对其进行延时处理,可能会让玩家觉得很难掌握和控制游戏,也就是所谓的没有“手感”,由于自己在开发项目中要用到这样的处理,所以写了延时功能的代码,仓促编写,可能有很多地方不合理,望大家批评指正,代码如下(vc6):
#include <Dinput.h> #include <mmsystem.h> #pragma comment(lib,"Winmm.lib ") //时间差 class DELTATIME { private: DWORD tmpTime; public: DWORD DeltaTimes; DELTATIME() { DeltaTimes=0; tmpTime=timeGetTime(); } void ClearTime() { DeltaTimes=0; tmpTime=timeGetTime(); } DWORD getDtTime() { DeltaTimes=timeGetTime()-tmpTime; return DeltaTimes; } }; //调节手柄灵敏度 class BTNDELTA { private: long btnCount; long btnMaxPressCount;//默认为连续触发10次算一次 public: BTNDELTA() { btnCount=0; btnMaxPressCount=6; } void SetMaxCount(long nMax) { btnMaxPressCount=nMax; btnCount=0; } bool isGotOnePress() { if(++btnCount>btnMaxPressCount) { return true; } return false; } void ClearCount() { btnCount=0; } }; class JOYBUTTON { UINT btnID; //要使用的按键,可以是方向键也可以是普通按键 bool isStartPress;//状态标记 bool isPressed;//状态标记 DWORD firstTime; DWORD otherCountDt; DELTATIME btnDtTime;//时间差 BTNDELTA btnContDt; DIJOYSTATE *js;//dx8.1中的手柄状态信息结构体 bool isDirectionBtn;//是否是方向键,判断方向键是比较特殊的 bool isGoNext;//连续按住是否会不停触发 public: JOYBUTTON() { /* isPressed=false; isStartPress=false; js=NULL; firstTime=500; btnContDt.ClearCount();*/ } void SetIsCanGoNext(bool isGoNext=true) { this->isGoNext=isGoNext; } void SetJoyButtonInfo(DWORD bIDorDirection,DIJOYSTATE *btnjs,bool isDirection=false,bool isGoNext=true,long firstWaitTime=500,long otherWaitTime=5) { isPressed=false; isStartPress=false; js=NULL; firstTime=500; btnContDt.ClearCount(); otherCountDt=otherWaitTime; btnID=bIDorDirection; js=btnjs; firstTime=firstWaitTime; btnContDt.SetMaxCount(otherWaitTime); isDirectionBtn=isDirection; this->isGoNext=isGoNext; } bool isCanGoNext() { bool ret=false; if(isDirectionBtn==true) { if(getJoyDirection(js)==btnID) { ret=true; } } else { ret=isJoyPressed(js,btnID); } if(ret==false&&isPressed==true) { //如果是现在的状态没按下,但是确实是被按过,那么就要复位 isPressed=false; isStartPress=false; btnDtTime.ClearTime(); btnContDt.ClearCount(); } if(ret==true) { if(isStartPress==false) { if(isPressed==false) { btnDtTime.ClearTime();//如果是刚开始就要清除一下时间 } if(btnDtTime.getDtTime()<firstTime) { if(isPressed==false) { isPressed=true; return true; } } else { btnContDt.ClearCount(); isStartPress=true;//第一次完毕啦 } } else { if(isGoNext==true) { if(btnContDt.isGotOnePress()) { btnContDt.ClearCount(); return true; } } } } return false; } };
一下是判断按键状态的代码:
#define JOY_DIC_UP 1 #define JOY_DIC_RIGHT 2 #define JOY_DIC_DOWN 4 #define JOY_DIC_LEFT 8 #define JOY_DIC_UPRIGHT 3 #define JOY_DIC_DOWNRIGHT 6 #define JOY_DIC_LEFTUP 9 #define JOY_DIC_LEFTDOWN 12 bool isJoyPressed(DIJOYSTATE *js,UINT btnID) { if(js->rgbButtons[btnID]&0x80) { return true; } return false; } DWORD getJoyDirection(DIJOYSTATE *js) { DWORD dwDirect=0; if(js->lY<0) dwDirect|=JOY_DIC_UP; if(js->lY>0) dwDirect|=JOY_DIC_DOWN; if(js->lX<0) dwDirect|=JOY_DIC_LEFT; if(js->lX>0) dwDirect|=JOY_DIC_RIGHT; return dwDirect; }
游戏手柄(JoyStick)的延时处理相关推荐
- 如何让游戏手柄joystick的按键映射键盘keyboard按键,方便不支持手柄的pygame游戏可以通过简单设置后用手柄进行操控
如何让游戏手柄joystick的按键映射键盘keyboard按键,方便不支持手柄的pygame游戏可以通过简单设置后用手柄进行操控 近日下载了一款Justin Armstrong在github中的马里 ...
- python blit_pygame入门
pygame入门 说明 在学习pygame时,主要参考了目光博客的教程.目光博客 原教程是2011年写的,年代比较久远了,使用Python2.我学习时使用python3将代码重新实现了一遍,同时补充了 ...
- pygame系列_游戏中的事件
先看一下我做的demo: 当玩家按下键盘上的:上,下,左,右键的时候,后台会打印出玩家所按键的数字值,而图形会随之移动 这是客观上面存在的现象. 那么啥是事件呢? 你叫我做出定义,我不知道,我只能举个 ...
- 如何用Pygame写游戏(二)
本文转自:http://eyehere.net/2011/python-pygame-novice-professional-2/ 上次我们试着写了一个最简单的Pygame程序并且解释了一个大概的框架 ...
- Python基础:第019课——窗口缩放事件、最小化状态及处理
视频 观看视频 参考: pygame事件完整解析 pygame中display模块介绍 创建主窗口及绘制图像 Pygame 使用pygame.display.set_mode创建游戏的主窗口: scr ...
- python游戏库pygame经典教程
目录 一.Pygame程序基本搭建过程 1.初始化化程序 2.创建Surface对象 3.事件监听 4.游戏循环 二.Pygame Display显示模块详解 1.将Surface对象粘贴至主窗口上 ...
- Pygame Event事件模块(示例)
Pygame Event事件模块(示例) 原文链接 参考文章 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特 ...
- Pygame Event事件模块(详细示例)
Pygame Event事件模块(详细示例) 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特定的情节.退出游 ...
- PyGame基础语法
文章目录 PyGame 基础语法 一. 模块简介 1. 概述 2. 安装 3. 模块概览 4. 第一个程序 5. 事件循环 二. Display 1. 简介 2. 创建主窗口 3. 添加元素 3.1 ...
- pygame教程实例(三)游戏事件
上一篇:pygame教程实例(二)模拟三体 下一篇:pygame教程实例(四)小球弹跳(事件) 本教程使用python3 在pygame教程实例(一)小球弹跳中我们写了一个小球在重力的作用下反复弹跳. ...
最新文章
- Facebook为其全球75%的用户推出反模仿工具
- P1991 无线通讯网
- sql delete删除的数据怎么恢复_如何恢复按下Shift + DELETE键永久删除的文件和资料夹?...
- Applications模块解析(一)
- 归并排序(C++版)
- 爱情麻辣烫:浓缩了中华美食精华与火锅的精髓
- 七年级上册计算机重点知识点,初一上册数学重点知识点
- js对象(Object)和字符串(String)互转 - 代码篇
- matlab虚拟现实之V-Realm Builder2建模第二部分
- ISO27001认证办理流程及2022年补贴政策汇总
- 3dmax导入shp面拉伸建模
- Windows7安装VC2015-2019_redist.x64提示“设置失败0xc8000222-未指定的错误”
- javaweb复习题库
- 基因家族鉴定分析实战操作手册
- 2022春季数据结构期中考试总结
- o.redisson.client.handler.CommandsQueue : Exception occured.
- 拉勾Java工程师P7训练营 高薪笔记
- Oracle Chp3 复杂查询 key point:数据分页;子查询;表连接;集合运算符
- 一个即将30岁的Android程序员妄想用他的「逆袭」来劝你不再「焦虑」
- java_实现公历转农历代码
热门文章
- 基于python+django框架+Mysql数据库的疫苗预约系统设计与实现
- android 警报声音_Android接近警报教程
- 撤销对计算机所有的更改 不断重启,win10撤销更改无限重启怎么解决
- Mac电脑DisplayPort/HDMI连接显示器后没声音
- 古琴岭南派传承人:古琴是精品教育 传承无需操之过急
- 禅道的测试模块(编写用例)
- 教你如何用PQ魔法师调整硬盘分区大小【图解教程】
- 【设计模式】职责链模式,MySQL+Tomcat+JVM,看完还怕面试官
- Unity3D新手入门教程_游戏开发100集课程 (含粒子
- 2017 华为软件精英挑战赛