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

📄 game_butterfly.cpp

📁 我做的毕业设计
💻 CPP
字号:
#include "Game_User.h"

struct D3DVERTEX
{
	float px, py, pz;
	float nx, ny, nz;
	static const DWORD FVF;
};
struct VERTEX 
{ 
	float x,y,z;
	float nx, ny, nz;
};
const DWORD D3DVERTEX::FVF = D3DFVF_XYZ|D3DFVF_NORMAL;

Mesh::Mesh(LPDIRECT3DDEVICE9 pD3DDevice)
{
	m_dwNumMaterials=0;
	m_pD3DDevice=pD3DDevice;
}

Mesh::~Mesh(void)
{
	m_pSourceMesh->Release();       
	m_pTargetMesh->Release();     
	m_pResultMesh->Release();
	m_pSourceVB->Release();   
	m_pTargetVB->Release();  
	m_pResultVB->Release(); 
}

HRESULT Mesh::InitMesh(LPDIRECT3DDEVICE9 pD3DDevice)
{
	HRESULT hr=0;
	D3DXMATERIAL* d3dxMaterials;			//缓冲区中材质的指针
	LPD3DXBUFFER pD3DXMtrlBuffer = NULL;	//缓冲区指针

	//创建源网格模型
	if(D3D_OK!=D3DXLoadMeshFromX( "butterfly_1.X", 0, 
		m_pD3DDevice, NULL, &pD3DXMtrlBuffer, NULL, 
		&m_dwNumMaterials, &m_pSourceMesh ))
		MessageBox(NULL,"butterfly_1.X",NULL,NULL);
	m_pMeshTextures = new LPDIRECT3DTEXTURE9[m_dwNumMaterials];		//纹理指针数组
	m_pMeshMaterials = new D3DMATERIAL9[m_dwNumMaterials];			//材质指针数组
	d3dxMaterials =(D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();//获取材质地址

	for(DWORD i=0; i<m_dwNumMaterials; i++ )
	{
		m_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;					//从缓冲区中拷贝材质
		m_pMeshMaterials[i].Ambient = m_pMeshMaterials[i].Diffuse;		//设置环境光属性
		m_pMeshTextures[i]  = NULL;										//初始成空

		if(D3D_OK!=D3DXCreateTextureFromFile( m_pD3DDevice, 
			d3dxMaterials[i].pTextureFilename, &m_pMeshTextures[i] ))
			MessageBox(NULL,d3dxMaterials[i].pTextureFilename,NULL,NULL);
	}

	//创建目标网格模型
	if(D3D_OK!=D3DXLoadMeshFromX( "butterfly_4.X", D3DXMESH_MANAGED, 
		m_pD3DDevice, NULL, NULL, NULL, 
		&m_dwNumMaterials, &m_pTargetMesh ))
	{
		MessageBox(NULL,"butterfly_4.X",NULL,NULL);
	}
	LPD3DXMESH pTempMesh = NULL;
	if( FAILED( m_pSourceMesh->CloneMeshFVF( m_pSourceMesh->GetOptions(), D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,
		m_pD3DDevice, &pTempMesh ) ) )
	{
		pTempMesh->Release();
		return E_FAIL;
	}
	m_pSourceMesh->Release();
	m_pSourceMesh = pTempMesh;

	//以指定的顶点格式克隆源网格模型
	if( FAILED( m_pTargetMesh->CloneMeshFVF( m_pTargetMesh->GetOptions(), D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,
		m_pD3DDevice, &pTempMesh ) ) )
	{
		pTempMesh->Release();
		return E_FAIL;
	}
	m_pTargetMesh->Release();
	m_pTargetMesh = pTempMesh;

	//以指定的顶点格式克隆结果网格模型
	if( FAILED( m_pTargetMesh->CloneMeshFVF( m_pTargetMesh->GetOptions(), D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,
		m_pD3DDevice, &m_pResultMesh ) ) )
	{
		m_pResultMesh->Release();
		return E_FAIL;
	}

	//通过网格模型获取顶点缓冲区
	m_pSourceMesh->GetVertexBuffer(&m_pSourceVB);
	m_pTargetMesh->GetVertexBuffer(&m_pTargetVB);
	m_pResultMesh->GetVertexBuffer(&m_pResultVB);    
	m_pD3DDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATER );

	m_pD3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE,  TRUE );
	m_pD3DDevice->SetRenderState( D3DRS_ALPHAREF, 0X000010 );

	return S_OK;
}

void Mesh::Render(void)
{
	for( DWORD i=0; i<m_dwNumMaterials; i++ )
	{
		m_pD3DDevice->SetMaterial(&m_pMeshMaterials[i]);
		m_pD3DDevice->SetTexture(0,m_pMeshTextures[i]);
		m_pResultMesh->DrawSubset( i );
	}

}

void Mesh::OnFrameMove( IDirect3DDevice9* pd3dDevice, double m, float fElapsedTime)
{
	static float mmm=0;
	mmm+=0.03f;

	VERTEX    *pSourceVertices;
	VERTEX    *pTargetVertices;
	D3DVERTEX    *pResultVertices;

	//锁定各网格模型顶点缓冲区
	m_pSourceVB->Lock( 0, 0, (void**)&pSourceVertices, 0 );
	m_pTargetVB->Lock( 0, 0, (void**)&pTargetVertices, 0 );
	m_pResultVB->Lock( 0, 0, (void**)&pResultVertices, 0 );

	//生成渐变网格
	float DolphinTimeFactor = (float)(timeGetTime() % 2000) / 1000.0f;
	float Scalar = (DolphinTimeFactor<=1.0f)?DolphinTimeFactor:(2.0f-DolphinTimeFactor);

	for( DWORD i=0; i<m_pResultMesh->GetNumVertices(); i++ )
	{
		//对顶点坐标进行插值
		pResultVertices[i].px= pSourceVertices[i].x*(1.0f - Scalar) + pTargetVertices[i].x*Scalar;
		pResultVertices[i].py= pSourceVertices[i].y*(1.0f - Scalar) + pTargetVertices[i].y*Scalar;
		pResultVertices[i].pz= pSourceVertices[i].z*(1.0f - Scalar) + pTargetVertices[i].z*Scalar;

		//顶点法线进行插值
		pResultVertices[i].nx= pSourceVertices[i].nx*(1.0f - Scalar) + pTargetVertices[i].nx*Scalar;
		pResultVertices[i].ny= pSourceVertices[i].ny*(1.0f - Scalar) + pTargetVertices[i].ny*Scalar;
		pResultVertices[i].nz= pSourceVertices[i].nz*(1.0f - Scalar) + pTargetVertices[i].nz*Scalar;
	}

	//释放各网格模型顶点缓冲区
	m_pSourceVB->Unlock();
	m_pTargetVB->Unlock();
	m_pResultVB->Unlock();

	D3DXMATRIXA16 matTransPos,matTrans,matRota,matScal;
	static float fAng = 0.0f;
	INT  r=0;											//Butterfly旋转半径


	fAng=mmm*(2*D3DX_PI/49);


	D3DXMatrixRotationY(&matRota,0*(2*D3DX_PI/49)-90);
	D3DXMatrixTranslation( &matTransPos,m_x,m_y,m_z);
	D3DXMatrixTranslation( &matTrans,(FLOAT)r*sinf(fAng), (FLOAT)m, (FLOAT)r*cosf(fAng));//Butterfly逆时针旋转
	/*D3DXMatrixTranslation( &matTrans, r*cosf(fAng), 0.0f,r*sinf(fAng) );*///Butterfly顺时针旋转
	D3DXMatrixMultiply(&matTrans,&matTransPos,&matTrans);
	D3DXMatrixScaling(&matScal,1,1,1);
	D3DXMatrixMultiply(&matTrans,&matRota,&matTrans);
	D3DXMatrixMultiply(&matTrans,&matScal,&matTrans);
	pd3dDevice->SetTransform( D3DTS_WORLD, &matTrans );
}

⌨️ 快捷键说明

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