如果做过游戏开发的朋友应该都知道,手柄的按键事件是非常敏感的,如果不对其进行延时处理,可能会让玩家觉得很难掌握和控制游戏,也就是所谓的没有“手感”,由于自己在开发项目中要用到这样的处理,所以写了延时功能的代码,仓促编写,可能有很多地方不合理,望大家批评指正,代码如下(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)的延时处理相关推荐

  1. 如何让游戏手柄joystick的按键映射键盘keyboard按键,方便不支持手柄的pygame游戏可以通过简单设置后用手柄进行操控

    如何让游戏手柄joystick的按键映射键盘keyboard按键,方便不支持手柄的pygame游戏可以通过简单设置后用手柄进行操控 近日下载了一款Justin Armstrong在github中的马里 ...

  2. python blit_pygame入门

    pygame入门 说明 在学习pygame时,主要参考了目光博客的教程.目光博客 原教程是2011年写的,年代比较久远了,使用Python2.我学习时使用python3将代码重新实现了一遍,同时补充了 ...

  3. pygame系列_游戏中的事件

    先看一下我做的demo: 当玩家按下键盘上的:上,下,左,右键的时候,后台会打印出玩家所按键的数字值,而图形会随之移动 这是客观上面存在的现象. 那么啥是事件呢? 你叫我做出定义,我不知道,我只能举个 ...

  4. 如何用Pygame写游戏(二)

    本文转自:http://eyehere.net/2011/python-pygame-novice-professional-2/ 上次我们试着写了一个最简单的Pygame程序并且解释了一个大概的框架 ...

  5. Python基础:第019课——窗口缩放事件、最小化状态及处理

    视频 观看视频 参考: pygame事件完整解析 pygame中display模块介绍 创建主窗口及绘制图像 Pygame 使用pygame.display.set_mode创建游戏的主窗口: scr ...

  6. python游戏库pygame经典教程

    目录 一.Pygame程序基本搭建过程 1.初始化化程序 2.创建Surface对象 3.事件监听 4.游戏循环 二.Pygame Display显示模块详解 1.将Surface对象粘贴至主窗口上 ...

  7. Pygame Event事件模块(示例)

    Pygame Event事件模块(示例) 原文链接 参考文章 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特 ...

  8. Pygame Event事件模块(详细示例)

    Pygame Event事件模块(详细示例) 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特定的情节.退出游 ...

  9. PyGame基础语法

    文章目录 PyGame 基础语法 一. 模块简介 1. 概述 2. 安装 3. 模块概览 4. 第一个程序 5. 事件循环 二. Display 1. 简介 2. 创建主窗口 3. 添加元素 3.1 ...

  10. pygame教程实例(三)游戏事件

    上一篇:pygame教程实例(二)模拟三体 下一篇:pygame教程实例(四)小球弹跳(事件) 本教程使用python3 在pygame教程实例(一)小球弹跳中我们写了一个小球在重力的作用下反复弹跳. ...

最新文章

  1. Facebook为其全球75%的用户推出反模仿工具
  2. P1991 无线通讯网
  3. sql delete删除的数据怎么恢复_如何恢复按下Shift + DELETE键永久删除的文件和资料夹?...
  4. Applications模块解析(一)
  5. 归并排序(C++版)
  6. 爱情麻辣烫:浓缩了中华美食精华与火锅的精髓
  7. 七年级上册计算机重点知识点,初一上册数学重点知识点
  8. js对象(Object)和字符串(String)互转 - 代码篇
  9. matlab虚拟现实之V-Realm Builder2建模第二部分
  10. ISO27001认证办理流程及2022年补贴政策汇总
  11. 3dmax导入shp面拉伸建模
  12. Windows7安装VC2015-2019_redist.x64提示“设置失败0xc8000222-未指定的错误”
  13. javaweb复习题库
  14. 基因家族鉴定分析实战操作手册
  15. 2022春季数据结构期中考试总结
  16. o.redisson.client.handler.CommandsQueue : Exception occured.
  17. 拉勾Java工程师P7训练营 高薪笔记
  18. Oracle Chp3 复杂查询 key point:数据分页;子查询;表连接;集合运算符
  19. 一个即将30岁的Android程序员妄想用他的「逆袭」来劝你不再「焦虑」
  20. java_实现公历转农历代码

热门文章

  1. 基于python+django框架+Mysql数据库的疫苗预约系统设计与实现
  2. android 警报声音_Android接近警报教程
  3. 撤销对计算机所有的更改 不断重启,win10撤销更改无限重启怎么解决
  4. Mac电脑DisplayPort/HDMI连接显示器后没声音
  5. 古琴岭南派传承人:古琴是精品教育 传承无需操之过急
  6. 禅道的测试模块(编写用例)
  7. 教你如何用PQ魔法师调整硬盘分区大小【图解教程】
  8. 【设计模式】职责链模式,MySQL+Tomcat+JVM,看完还怕面试官
  9. Unity3D新手入门教程_游戏开发100集课程 (含粒子
  10. 2017 华为软件精英挑战赛