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

📄 game_skinmesh.h

📁 自己写的一个D3D游戏Dome。实现了基本的游戏功能
💻 H
字号:
#pragma once
#include "stdafx.h"
#include "Game_Terrain.h"

#define	D3DFVF_CUSTOM_BOUNDINGBOX D3DFVF_XYZ|D3DFVF_DIFFUSE

struct D3DXFRAME_DERIVED: public D3DXFRAME{
    D3DXMATRIXA16        CombinedTransformationMatrix;//组合变换矩阵
};

struct D3DXMESHCONTAINER_DERIVED: public D3DXMESHCONTAINER{
    LPDIRECT3DTEXTURE9*  ppTextures;              
    LPD3DXMESH           pOrigMesh;
    LPD3DXATTRIBUTERANGE pAttributeTable;
    DWORD                NumAttributeGroups; 
    DWORD                NumInfl;
    LPD3DXBUFFER         pBoneCombinationBuf;
    D3DXMATRIX**         ppBoneMatrixPtrs;
    D3DXMATRIX*          pBoneOffsetMatrices;
    DWORD                NumPaletteEntries;
    bool                 UseSoftwareVP;
    DWORD                iAttributeSW; 
};

enum METHOD {
    D3DNONINDEXED,
    D3DINDEXED,
    SOFTWARE,
    NONE
};

class Game_SkinMesh;

class CAllocateHierarchy: public ID3DXAllocateHierarchy{
	public:
		STDMETHOD(CreateFrame)(THIS_ LPCSTR Name, LPD3DXFRAME *ppNewFrame);
		STDMETHOD(CreateMeshContainer)(THIS_ 
			LPCSTR Name, 
			CONST D3DXMESHDATA *pMeshData,
			CONST D3DXMATERIAL *pMaterials, 
			CONST D3DXEFFECTINSTANCE *pEffectInstances, 
			DWORD NumMaterials, 
			CONST DWORD *pAdjacency, 
			LPD3DXSKININFO pSkinInfo, 
			LPD3DXMESHCONTAINER *ppNewMeshContainer);
		STDMETHOD(DestroyFrame)(THIS_ LPD3DXFRAME pFrameToFree);
		STDMETHOD(DestroyMeshContainer)(THIS_ LPD3DXMESHCONTAINER pMeshContainerBase);
		CAllocateHierarchy(Game_SkinMesh *pSkinMesh) :m_pSkinMesh(pSkinMesh) {}

		Game_SkinMesh*		m_pSkinMesh;
};

//蒙皮动画
class Game_SkinMesh  {
	public:
		char m_strAnim[256];
		BOOL m_bnextAnim;
		//LPD3DXMESH  m_pAABBMesh;
		BOOL m_MouseMove;
		BOOL m_KeyMove;
		D3DXVECTOR3 m_destpoint;

		BOOL						m_isClone;
		float						m_fDeathTime;
		float						m_flotFrameTime;
		FLOAT						m_floattimeNow;
		FLOAT						m_fAngle;
		FLOAT						m_fScale;
		D3DXVECTOR3					m_vPos;
		D3DXVECTOR3					m_vbornPos;
		D3DXVECTOR3					m_vPosOld;
		D3DXVECTOR3					m_vTarget;
		bool						m_isMoving;
		float						m_speed1;		//跑步速度
		float						m_speed2;		//旋转速度
		BOOL						m_bLoop;		// 是否循环播放
		LPD3DXANIMATIONSET			m_pCurAnimSet;	// 当前动画
		float					m_CurTime;
		BOOL						m_bMoving;
		BOOL						m_isAttacking;
		BOOL						m_isdead;
		BOOL						m_BoundingBox;
		FLOAT						m_EXP;
		FLOAT						m_MAXHP;
		FLOAT						m_MAXMP;
		FLOAT						m_MAXEXP;
		FLOAT						m_CURHP;
		FLOAT						m_CURMP;
		FLOAT						m_CUREXP;
		LPD3DXANIMATIONCONTROLLER					m_pAnimControllerSRC;

		VOID SetPosition(D3DXVECTOR3 *pPos){m_vPos=*pPos;};
		VOID SetPosition(float x,float y,float z){m_vPos.x=x;m_vPos.y=y;m_vPos.z=z;};
		VOID SetDirection(float fAngle){m_fAngle=fAngle;};
		VOID SetScale(float s){m_fScale=s;};

		VOID RenderAABB(D3DXVECTOR3 *pVmin,D3DXVECTOR3 *pVmax);
		VOID GetPosition(D3DXVECTOR3 *vPos);

		const LPD3DXVECTOR3 GetPosition();
		VOID MoveFront(D3DXVECTOR3 *vDir);
		VOID WalkFoward(float fDistance,Game_Terrain *Terrain);
		VOID GetDirection2(D3DXVECTOR3 *vDir);
		//VOID Render(float fElapsedAppTime,Game_Terrain *Terrain);
		VOID SetLoop(BOOL bLoop);
		BOOL IsAnimEnd(float& passTime);
		VOID GetBoundingBox(D3DXVECTOR3 *vMin,D3DXVECTOR3 *vMax);
		VOID Turn(float fAngle);
		VOID Back();
		VOID SetAltitude(float y);
		FLOAT DistanceOfTwoVec3(const D3DXVECTOR3 v1, const D3DXVECTOR3 v2);
		FLOAT GetYaw(const D3DXVECTOR3 v1, const D3DXVECTOR3 v2);
	public:
		VOID SetAnim(BOOL bAnim);
		BOOL InterSect( D3DVECTOR *pRayOrig,D3DVECTOR *pRayDir,D3DVECTOR* pVRet);
		VOID UpdateFrameMatrices( LPD3DXFRAME pFrameBase, LPD3DXMATRIX pParentMatrix );

		LPDIRECT3DVERTEXSHADER9 m_pIndexedVertexShader[4];
		D3DXMATRIXA16* m_pBoneMatrices;					//骨骼矩阵

		UINT		m_NumBoneMatricesMax;
		METHOD		m_SkinningMethod;
		D3DCAPS9 					m_d3dCaps;
		D3DXVECTOR3                 m_vObjectCenter;    // 物体的范围中心
		FLOAT                       m_fObjectRadius;    // 物体的范围半径
		D3DXVECTOR3                 m_vMin;    // 物体的范围中心的半径的最小值
		D3DXVECTOR3                 m_vMax;    //物体的范围中心的半径的最大值
		LPD3DXMESH  m_pAABBMesh;

		//控制变换的动作
		LPD3DXANIMATIONCONTROLLER GetAnimController(){return m_pAnimController;};

		BOOL SetAnimationName(char *strAnimName);//设置动作的名字
		VOID	Render(float fTimeFromLastFrame,D3DXVECTOR3 vPos,float angle,float scale=1.0f,bool change=true);//渲染
		HRESULT LoadFromXFile(WCHAR * strFileName,float scalex=0.5f,float scalez=0.5f);											   //导入文件
		HRESULT GenerateSkinnedMesh(D3DXMESHCONTAINER_DERIVED *pMeshContainer);				   //产生蒙皮动画

		Game_SkinMesh();

		HRESULT CalculateStaticBondingBox(LPD3DXFRAME pFrameBase, const LPD3DXVECTOR3 pVmin,const LPD3DXVECTOR3 pVmax);//绑定盒子
		virtual ~Game_SkinMesh();

		LPD3DXANIMATIONCONTROLLER	m_pAnimController;	 //动画收集器对象
		D3DXMATRIX                m_matWorld;
	protected:
		
		LPD3DXFRAME					m_pFrameRoot;

		FLOAT						m_fElapsedTime;      // Time elapsed since last frame


		VOID DrawMeshContainer(LPD3DXMESHCONTAINER pMeshContainerBase, LPD3DXFRAME pFrameBase);		//设置Mesh 容器
		VOID DrawFrame(LPD3DXFRAME pFrame);
		HRESULT SetupBoneMatrixPointersOnMesh( LPD3DXMESHCONTAINER pMeshContainerBase );
		HRESULT SetupBoneMatrixPointers( LPD3DXFRAME pFrame );
};

⌨️ 快捷键说明

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