⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3dinpdev.h

📁 经典游戏之源程序-飞行模拟器,方便学习和自我娱乐
💻 H
字号:
// 3dInpDev.h
//
// Copyright (c) Nigel Thompson 1996
//
// This file defines the input device classes
// It is automatically included in 3dPlus.h
//

#ifndef _3DINPDEV_H_
#define _3DINPDEV_H_

// Controller notification flags
#define CONTROL_X_CHANGE		0x00000001
#define CONTROL_Y_CHANGE		0x00000002
#define CONTROL_Z_CHANGE		0x00000004
#define CONTROL_R_CHANGE		0x00000008
#define CONTROL_U_CHANGE		0x00000010
#define CONTROL_V_CHANGE		0x00000020
#define CONTROL_POV_CHANGE		0x00000040
#define CONTROL_BTN_CHANGE		0x00000080
#define CONTROL_NOTIFY_ALL		0xFFFFFFFF

//////////////////////////////////////////////////////////////////
// Input device state structure

typedef struct __3DINPUTSTATE {
	double dX;		// -1 <= value <= 1
	double dY;		// -1 <= value <= 1
	double dZ;		// -1 <= value <= 1
	double dR;		// -1 <= value <= 1
	double dU;		// -1 <= value <= 1
	double dV;		// -1 <= value <= 1
	double dPov;	//  0 <= value <= 359
	                // (< 0 indicates not valid)
	DWORD dwButtons;// 1 = active (pressed)
} _3DINPUTSTATE;

// Called to request a pointer to a 3dFrame object to manipulate
typedef C3dFrame* (CALLBACK * GET3DFRAMEFN)(void *pArg);

// Controller notification function
typedef void (CALLBACK * CONTROLNOTIFYFN)(void* pArg,
										  DWORD dwFlags,
										  const _3DINPUTSTATE* pState);

//////////////////////////////////////////////////////////////////
// C3dInputDevice
//
// All input devices are derived from this class
//
// Note: the ShowConfigDlg() fn is rather pointless unless
// the class also implements serialization so you can save
// and restore the configuration.
//

class C3dInputDevice : public CObject
{
public:
	DECLARE_SERIAL(C3dInputDevice);
    C3dInputDevice();
    virtual ~C3dInputDevice();
	virtual const char* GetName() {return (const char*) m_strName;}
	virtual BOOL ShowConfigDlg();
	virtual BOOL GetState(_3DINPUTSTATE& st);
	virtual void OnUserEvent(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam);

protected:
	CString m_strName;
};
	
//////////////////////////////////////////////////////////////////
// C3dKeyInDev
//

class C3dKeyInDev : public C3dInputDevice
{
public:
	DECLARE_SERIAL(C3dKeyInDev);
    C3dKeyInDev();
    virtual ~C3dKeyInDev();
	virtual BOOL GetState(_3DINPUTSTATE& st);
	virtual void OnUserEvent(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam);
	virtual void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
	virtual void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);

protected:
	_3DINPUTSTATE m_st;
	BOOL m_bShift;
	BOOL m_bControl;
};

//////////////////////////////////////////////////////////////////
// C3dMouseInDev
//

class C3dMouseInDev : public C3dInputDevice
{
public:
	DECLARE_SERIAL(C3dMouseInDev);
    C3dMouseInDev();
    virtual ~C3dMouseInDev();
	virtual void OnUserEvent(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam);
	virtual BOOL GetState(_3DINPUTSTATE& st);

protected:
	_3DINPUTSTATE m_st;
	CPoint m_ptPrev;
	CPoint m_ptCur;
	DWORD m_dwFlags;
	BOOL m_bCaptured;
};

//////////////////////////////////////////////////////////////////
// C3dJoyInDev
//

// data structures for joystick configuration
typedef struct _JOYAXIS {
	int iInput;				// input chanel 0=X, 1=Y, 2=Z, 3=R, 4=U, 5=V
	int iButton;			// non-zero if button required
	int iDead;				// dead zone as percentage of range
	double dSens;			// sensitivity. 1.0 is norm.
} JOYAXIS;

typedef struct _JOYCONFIG {
	JOYAXIS axis[6];
} JOYCONFIG;

class C3dJoyInDev : public C3dInputDevice
{
public:
	DECLARE_SERIAL(C3dJoyInDev);
    C3dJoyInDev();
    virtual ~C3dJoyInDev();
	virtual BOOL GetState(_3DINPUTSTATE& st);
	virtual BOOL ShowConfigDlg();
	JOYCAPS* GetCaps() {return &m_caps;}
	JOYINFOEX* GetInfo();
	JOYCONFIG* GetConfig() {return &m_cfg;}
	BOOL IsPresent() {return m_bDevPresent;}

protected:
	BOOL m_bDevPresent;
	JOYCAPS m_caps;
	JOYINFOEX m_inf;
	JOYCONFIG m_cfg;
};

//////////////////////////////////////////////////////////////////
// C3dController
//

class C3dController : public CObject
{
public:
	DECLARE_SERIAL(C3dController);
	C3dController(); // used for serialization only
    BOOL Create(C3dWnd* pWnd,
				GET3DFRAMEFN pGet3dFrameFn,
				void* pArg = NULL,
				CONTROLNOTIFYFN pNotifyFn = NULL,
				DWORD dwNotify = CONTROL_NOTIFY_ALL);
    virtual ~C3dController();
	virtual BOOL ShowConfigDlg();
	virtual void Update();
	virtual void OnUserEvent(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam);
	virtual int GetNumDevices() {return m_iDevs;}
	virtual BOOL SelectDevice(int i);
	virtual const char* GetDeviceName(int i);
	int GetCurDevice() {return m_iCurDevice;}
	C3dInputDevice* GetInputDevice() {return m_pInpDev;}

protected:
	GET3DFRAMEFN m_pGet3dFrameFn;
	void* m_pArg;
	CONTROLNOTIFYFN m_pNotifyFn;
	DWORD m_dwNotify;
	C3dInputDevice* m_pInpDev;
	_3DINPUTSTATE m_PrevState;
	C3dWnd* m_pWnd;
	int m_iCurDevice;

	virtual void OnUpdate(_3DINPUTSTATE& st, C3dFrame* pFrame);
	BOOL _InRange(double x, double min, double max)
	{return ((x >= min) && (x <= max));}

private:
	int m_iDevs;
	C3dJoyInDev m_JoyDev;
	C3dMouseInDev m_MouseDev;
	C3dKeyInDev m_KeyDev;
};

//////////////////////////////////////////////////////////////////
// C3dPosCtlr - positioning controller
//

class C3dPosCtlr : public C3dController
{
public:
	DECLARE_SERIAL(C3dPosCtlr);

protected:
	virtual void OnUpdate(_3DINPUTSTATE& st, C3dFrame* pFrame);
};

//////////////////////////////////////////////////////////////////
// C3dFlyCtlr - flying controller
//

class C3dFlyCtlr : public C3dController
{
public:
	DECLARE_SERIAL(C3dFlyCtlr);

protected:
	virtual void OnUpdate(_3DINPUTSTATE& st, C3dFrame* pFrame);
};

#endif // _3DINPDEV_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -