游戏手柄(JoyStick)的延时处理
生活随笔
收集整理的這篇文章主要介紹了
游戏手柄(JoyStick)的延时处理
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
如果做過(guò)游戲開(kāi)發(fā)的朋友應(yīng)該都知道,手柄的按鍵事件是非常敏感的,如果不對(duì)其進(jìn)行延時(shí)處理,可能會(huì)讓玩家覺(jué)得很難掌握和控制游戲,也就是所謂的沒(méi)有“手感”,由于自己在開(kāi)發(fā)項(xiàng)目中要用到這樣的處理,所以寫(xiě)了延時(shí)功能的代碼,倉(cāng)促編寫(xiě),可能有很多地方不合理,望大家批評(píng)指正,代碼如下(vc6):
?
?
#include <Dinput.h> #include <mmsystem.h>#pragma comment(lib,"Winmm.lib ")//時(shí)間差 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;}};//調(diào)節(jié)手柄靈敏度 class BTNDELTA { private:long btnCount;long btnMaxPressCount;//默認(rèn)為連續(xù)觸發(fā)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;//狀態(tài)標(biāo)記bool isPressed;//狀態(tài)標(biāo)記DWORD firstTime;DWORD otherCountDt;DELTATIME btnDtTime;//時(shí)間差BTNDELTA btnContDt;DIJOYSTATE *js;//dx8.1中的手柄狀態(tài)信息結(jié)構(gòu)體bool isDirectionBtn;//是否是方向鍵,判斷方向鍵是比較特殊的bool isGoNext;//連續(xù)按住是否會(huì)不停觸發(fā)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){//如果是現(xiàn)在的狀態(tài)沒(méi)按下,但是確實(shí)是被按過(guò),那么就要復(fù)位isPressed=false;isStartPress=false;btnDtTime.ClearTime();btnContDt.ClearCount();}if(ret==true){ if(isStartPress==false){if(isPressed==false){btnDtTime.ClearTime();//如果是剛開(kāi)始就要清除一下時(shí)間}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;}};?
一下是判斷按鍵狀態(tài)的代碼:
?
#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;}總結(jié)
以上是生活随笔為你收集整理的游戏手柄(JoyStick)的延时处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Phabricator】教科书一般的P
- 下一篇: 联发科mt8516价格_一颗神U创造历史