游戏手柄(JoyStick)的延时处理
生活随笔
收集整理的這篇文章主要介紹了
游戏手柄(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)的延时处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Phabricator】教科书一般的P
- 下一篇: 联发科mt8516价格_一颗神U创造历史