游戏手柄(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)的延时处理)