欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

游戏手柄(JoyStick)的延时处理

发布时间:2023/12/16 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 游戏手柄(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 12bool 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)的延时处理的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。