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

📄 chud.cpp

📁 DirectX 中实现MMORPG类游戏中的HUD功能。即人物头顶文字、血条等效果。因为HUD是在3D空间中
💻 CPP
字号:
#include "CHud.h"

struct Vertex
{
	float x, y, z;
	float tu, tv;
};

Vertex m_quadVertices[] =
{
	{-1.0f, 0.23f, 0.0f,  0.0f,0.0f },
	{ 1.0f, 0.23f, 0.0f,  1.0f,0.0f },
	{-1.0f, 0.0f, 0.0f,  0.0f,1.0f },
	{ 1.0f, 0.0f, 0.0f,  1.0f,1.0f }
};
#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ | D3DFVF_TEX1 )


CHud::CHud()
:m_pdevice(NULL)
,m_pSourSurf(NULL)
,m_pTexture(NULL)
,m_pVertexBuffer(NULL)
,m_pRTSurf(NULL)
,m_pFont(NULL)
,m_pText(NULL)
{
};

CHud::~CHud()
{
	SAFE_RELEASE( m_pVertexBuffer );
	SAFE_RELEASE( m_pTexture );
	SAFE_RELEASE( m_pSourSurf );
	SAFE_RELEASE( m_pRTSurf );	
}


void CHud::init( LPDIRECT3DDEVICE9 pDevice, LPD3DXFONT pFont, char *pText )
{
	m_pdevice = pDevice;
	m_pFont = pFont;
	m_pText = pText;
	// 向纹理中绘制文字
	if (FAILED(m_pdevice->GetRenderTarget(0, &m_pSourSurf))) return ;
	HRESULT hr = D3DXCreateTexture( m_pdevice,
		120, 12, 
		0, // create a complete mipmap chain
		D3DUSAGE_RENDERTARGET, // usage
		D3DFMT_X8R8G8B8,// 32 bit XRGB format
		D3DPOOL_DEFAULT, &m_pTexture);

	if (FAILED(m_pTexture->GetSurfaceLevel(0, &m_pRTSurf))) 
	{
		return ;
	}
	if (FAILED(m_pdevice->SetRenderTarget(0, m_pRTSurf))) 
	{
		return ;
	}

	m_pdevice->BeginScene();
	m_pdevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
		D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f), 1.0f, 0);

	RendText( 0, 0 );
	m_pdevice->EndScene();

	// 将表面保存到文件
	//D3DXSaveSurfaceToFile( "HUD1.bmp", D3DXIFF_BMP, m_pRTSurf, NULL, NULL );
	m_pdevice->SetRenderTarget(0, m_pSourSurf);	// 设置回原来的后台表面



	m_pdevice->CreateVertexBuffer( 4*sizeof(Vertex), D3DUSAGE_WRITEONLY, 
                                      D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, 
                                      &m_pVertexBuffer, NULL );
    void *pVertices = NULL;

    m_pVertexBuffer->Lock( 0, sizeof(m_quadVertices), (void**)&pVertices, 0 );
    memcpy( pVertices, m_quadVertices, sizeof(m_quadVertices) );
    m_pVertexBuffer->Unlock();
};

void CHud::RendText( int x, int y )
{
	RECT destRect;
	SetRect( &destRect,  x, y, 120, 12 );
	m_pFont->DrawText( NULL, m_pText, -1, &destRect, DT_CENTER, 
		                   D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
}

void CHud::render( D3DXVECTOR3 pos )
{
	float fSacling = 1.0f;
	D3DXMATRIX matWorld, matSacling;
	D3DXMatrixTranslation( &matWorld, pos.x, pos.y, pos.z );
	D3DXMatrixScaling( &matSacling, fSacling, fSacling, fSacling );

	matWorld = matSacling * matWorld;
	m_pdevice->SetTransform(  D3DTS_WORLD, &matWorld );

	// 使字体变清晰
	m_pdevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
	m_pdevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
	m_pdevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
	// Alpha混合
	m_pdevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
	m_pdevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );

	m_pdevice->SetTexture( 0, m_pTexture );	
    m_pdevice->SetStreamSource( 0, m_pVertexBuffer, 0, sizeof(Vertex) );
	m_pdevice->SetFVF( D3DFVF_CUSTOMVERTEX );
	m_pdevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );

	m_pdevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
};

⌨️ 快捷键说明

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