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

📄 m_map.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
字号:
#include "m_map.h"

CElement::CElement ()
{
	m_nTex = -1;
}
CElement::~CElement ()
{
	Release ();
}

BOOL CElement::Create ( LPCSTR lpFilename )
{
	if ( m_nTex > -1 )
		Texture_Unload ( &g_lpTex[m_nTex] );

	C3Texture *tex;
	if ( Texture_Load ( &tex, ( char* )lpFilename, 1 ) == -1 )
		return false;
	m_nTex = tex->nID;

	// 创建一个平行于 xz 轴的平面
	m_Vec[0].x  = 0;							m_Vec[0].y  = 0;	m_Vec[0].z  = 0;
	m_Vec[0].nx = 0;							m_Vec[0].ny = -1;	m_Vec[0].nz = 0;
	m_Vec[0].u  = 0;							m_Vec[0].v  = 0;

	m_Vec[1].x  = ( float )tex->Info.Width;		m_Vec[1].y  = 0;	m_Vec[1].z  = 0;
	m_Vec[1].nx = 0;							m_Vec[1].ny = -1;	m_Vec[1].nz = 0;
	m_Vec[1].u  = 1;							m_Vec[1].v  = 0;

	m_Vec[2].x  = 0;							m_Vec[2].y  = 0;	m_Vec[2].z  = ( float )tex->Info.Height;
	m_Vec[2].nx = 0;							m_Vec[2].ny = -1;	m_Vec[2].nz = 0;
	m_Vec[2].u  = 0;							m_Vec[2].v  = 1;

	m_Vec[3].x  = ( float )tex->Info.Width;		m_Vec[3].y  = 0;	m_Vec[3].z  = ( float )tex->Info.Height;
	m_Vec[3].nx = 0;							m_Vec[3].ny = -1;	m_Vec[1].nz = 0;
	m_Vec[3].u  = 1;							m_Vec[3].v  = 1;

	return true;
}
void CElement::Release ( void )
{
	if ( m_nTex > -1 )
		Texture_Unload ( &g_lpTex[m_nTex] );
}
void CElement::Prepare ( void )
{
	SetRenderState ( D3DRS_ZENABLE, false );
	SetRenderState ( D3DRS_ZWRITEENABLE, false );
	SetRenderState ( D3DRS_SHADEMODE, D3DSHADE_FLAT );
	SetRenderState ( D3DRS_DITHERENABLE, false );
	SetRenderState ( D3DRS_CULLMODE, D3DCULL_NONE );
	SetRenderState ( D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_COLOR1 );
	SetRenderState ( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1 );
	SetRenderState ( D3DRS_SOFTWAREVERTEXPROCESSING, false );

	SetTextureStageState ( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
	SetTextureStageState ( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
	SetTextureStageState ( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );

	SetTextureStageState ( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
	SetTextureStageState ( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
	SetTextureStageState ( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );

	SetTextureStageState ( 0, D3DTSS_MINFILTER, D3DTEXF_POINT );
	SetTextureStageState ( 0, D3DTSS_MAGFILTER, D3DTEXF_POINT );
	SetTextureStageState ( 0, D3DTSS_MIPFILTER, D3DTEXF_POINT );

	SetTextureStageState ( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
	SetTextureStageState ( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
	SetTextureStageState ( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );

	SetTextureStageState ( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
	SetTextureStageState ( 1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
	SetTextureStageState ( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );

	SetTextureStageState ( 1, D3DTSS_MINFILTER, D3DTEXF_NONE );
	SetTextureStageState ( 1, D3DTSS_MAGFILTER, D3DTEXF_NONE );
	SetTextureStageState ( 1, D3DTSS_MIPFILTER, D3DTEXF_NONE );

	// mode
	CMyBitmap::s_nShowMode	=modeElement;
}

BOOL CElement::Draw ( int nOffsetX, int nOffsetY )
{
	if (CMyBitmap::s_nShowMode != modeElement)
		CElement::Prepare();

	if ( g_lpTex[m_nTex]->Info.Format == D3DFMT_A8R8G8B8 ||
		 g_lpTex[m_nTex]->Info.Format == D3DFMT_A1R5G5B5 ||
		 g_lpTex[m_nTex]->Info.Format == D3DFMT_A4R4G4B4 ||
		 g_lpTex[m_nTex]->Info.Format == D3DFMT_A8 ||
		 g_lpTex[m_nTex]->Info.Format == D3DFMT_A8R3G3B2 )
	{
		SetRenderState ( D3DRS_ALPHABLENDENABLE, true );
		SetRenderState ( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
		SetRenderState ( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

        SetRenderState ( D3DRS_ALPHATESTENABLE, true );
        SetRenderState ( D3DRS_ALPHAREF, 0x08 );
        SetRenderState ( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
	}
	else
	{
		SetRenderState ( D3DRS_ALPHABLENDENABLE, false );
        SetRenderState ( D3DRS_ALPHATESTENABLE, false );
	}

	// 当前贴图
	if ( FAILED ( g_D3DDevice->SetTexture ( 0, g_lpTex[m_nTex]->lpTex ) ) )
		return false;

	D3DXMATRIXA16 matrix;
	D3DXMatrixTranslation ( &matrix, ( float )nOffsetX, 0, ( float )nOffsetY );
	if ( FAILED ( g_D3DDevice->SetTransform ( D3DTS_WORLD,
											  &matrix ) ) )
		return false;
	// vertex shader
	if ( FAILED ( g_D3DDevice->SetVertexShader ( MAP_VERTEX ) ) )
		return false;
	// 绘制场景
	if ( FAILED ( g_D3DDevice->DrawPrimitiveUP ( D3DPT_TRIANGLESTRIP,
												 2,
												 m_Vec,
												 sizeof ( MAPVERTEX ) ) ) )
		return false;
	return true;
}

void CElement::GetSize (UINT& uWidth, UINT& uHeight)
{
	if (!g_lpTex[m_nTex])
		return;

	uWidth	=g_lpTex[m_nTex]->Info.Width;
	uHeight	=g_lpTex[m_nTex]->Info.Height;
}

CMapBackground::CMapBackground ()
{
	lpElement = 0;
	m_dwXBlock = 0;
	m_dwYBlock = 0;

	m_Coordinate.x = 0;
	m_Coordinate.y = 0;

	m_camera = 0;
}

CMapBackground::~CMapBackground ()
{
	Release ();
}

void CMapBackground::GetSize (UINT& uWidth, UINT& uHeight)
{
	if (!lpElement)
		return;

	UINT uElementWidth, uElementHeight;
	lpElement[0].GetSize(uElementWidth, uElementHeight);
	
	uWidth	=uElementWidth*m_dwXBlock;
	uHeight	=uElementHeight*m_dwYBlock;
}

BOOL CMapBackground::Create ( const char* pszDir, DWORD dwXBlock, DWORD dwYBlock )
{
	lpElement = new CElement[dwXBlock * dwYBlock];

	char name[256];
	for ( DWORD n = 0; n < dwXBlock * dwYBlock; n++ )
	{
		sprintf ( name, "%s/%02d.dds", pszDir, n );
		if ( !lpElement[n].Create ( name ) )
			return false;
	}

	m_dwXBlock = dwXBlock;
	m_dwYBlock = dwYBlock;

	m_camera = new C3Camera;
	Camera_Clear ( m_camera );

	m_camera->lpFrom = new D3DXVECTOR3[1];
	m_camera->lpFrom[0].x =  _SCR_WIDTH/2;
	m_camera->lpFrom[0].y = -1000;
	m_camera->lpFrom[0].z =  _SCR_HEIGHT/2;

	m_camera->lpTo = new D3DXVECTOR3[1];
	m_camera->lpTo[0].x =  _SCR_WIDTH/2;
	m_camera->lpTo[0].y = 0;
	m_camera->lpTo[0].z =  _SCR_HEIGHT/2;

	m_camera->fNear = 1.0f;
	m_camera->fFar = 10000.0f;

	return true;
}
void CMapBackground::Release ( void )
{
	for ( DWORD n = 0; n < m_dwXBlock * m_dwYBlock; n++ )
		lpElement[n].Release ();

	if ( m_camera )
	{
		SafeDeleteEx ( m_camera->lpFrom );
		SafeDeleteEx ( m_camera->lpTo );
		SafeDelete ( m_camera );
	}
}
void CMapBackground::SetViewport ( int nX, int nY )
{
	m_Coordinate.x = nX;
	m_Coordinate.y = nY;

	m_camera->lpFrom[0].x = _SCR_WIDTH/2 + ( float )nX;
	m_camera->lpFrom[0].z = _SCR_HEIGHT/2 + ( float )nY;

	m_camera->lpTo[0].x = _SCR_WIDTH/2 + ( float )nX;
	m_camera->lpTo[0].z = _SCR_HEIGHT/2 + ( float )nY;
}

void CMapBackground::Prepare ( void )
{
	CElement::Prepare ();
}

void CMapBackground::Draw ( void )
{
	Camera_BuildView ( m_camera, true );
	Camera_BuildOrtho ( m_camera, _SCR_WIDTH, _SCR_HEIGHT, true );
	//Camera_BuildProject ( m_camera, true );
	//Camera_BuildMix ( m_camera );

	// 画地图
	// 得到左上的所在格子  g_dwXTitles * g_dwYTitles
	int sbx = m_Coordinate.x / 256;
	int sby = m_Coordinate.y / 256;

	int ebx = ( m_Coordinate.x + _SCR_WIDTH ) / 256;
	int eby = ( m_Coordinate.y + _SCR_HEIGHT ) / 256;
	RECT mode = { 0, 0, _SCR_WIDTH, _SCR_HEIGHT };
	RECT bb = { 0, 0, 255, 255 };

	for ( int y = sby; y <= eby; y++ )
	{
		for ( int x = sbx; x <= ebx; x++ )
		{
			if ( y < 0 || x < 0 || y >= m_dwYBlock || x >= m_dwXBlock )
				continue;
			lpElement[y * m_dwXBlock + x].Draw ( x * 256, y * 256 );
		}
	}
}

/*CMapBackground::CMapBackground ()
{
	m_lpElement = 0;
	m_dwXBlock = 0;
	m_dwYBlock = 0;

	m_Coordinate.x = 0;
	m_Coordinate.y = 0;

	m_camera = 0;
}
CMapBackground::~CMapBackground ()
{
	Release ();
}

BOOL CMapBackground::Create ( DWORD dwXBlock, DWORD dwYBlock )
{
	m_lpElement = new CMyBitmap[dwXBlock * dwYBlock];

	char name[256];
	for ( DWORD n = 0; n < dwXBlock * dwYBlock; n++ )
	{
		sprintf ( name, "%d.dds", n + 1 );
		if ( !m_lpElement[n].Load ( name ) )
			return false;
	}

	m_dwXBlock = dwXBlock;
	m_dwYBlock = dwYBlock;

	m_camera = new C3Camera;
	Camera_Clear ( m_camera );

	m_camera->lpFrom = new D3DXVECTOR3[1];
	m_camera->lpFrom[0].x = 400;
	m_camera->lpFrom[0].y = -1000;
	m_camera->lpFrom[0].z = 300;

	m_camera->lpTo = new D3DXVECTOR3[1];
	m_camera->lpTo[0].x = 400;
	m_camera->lpTo[0].y = 0;
	m_camera->lpTo[0].z = 300;

	m_camera->fNear = 1.0f;
	m_camera->fFar = 10000.0f;

	return true;
}
void CMapBackground::Release ( void )
{
	for ( DWORD n = 0; n < m_dwXBlock * m_dwYBlock; n++ )
		m_lpElement[n].Destroy ();

	if ( m_camera )
	{
		SafeDeleteEx ( m_camera->lpFrom );
		SafeDeleteEx ( m_camera->lpTo );
		SafeDelete ( m_camera );
	}
}
void CMapBackground::SetPos ( int nX, int nY )
{
	m_Coordinate.x = nX;
	m_Coordinate.y = nY;

	m_camera->lpFrom[0].x = 400 + ( float )nX;
	m_camera->lpFrom[0].z = 300 + ( float )nY;

	m_camera->lpTo[0].x = 400 + ( float )nX;
	m_camera->lpTo[0].z = 300 + ( float )nY;
}
void CMapBackground::Prepare ( void )
{
	SetRenderState ( D3DRS_ZENABLE, false );
	SetRenderState ( D3DRS_ZWRITEENABLE, true );
	SetRenderState ( D3DRS_SHADEMODE, D3DSHADE_FLAT );
	SetRenderState ( D3DRS_DITHERENABLE, false );
	SetRenderState ( D3DRS_CULLMODE, D3DCULL_NONE );
	SetRenderState ( D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_COLOR1 );
	SetRenderState ( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1 );

	SetTextureStageState ( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
	SetTextureStageState ( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
	SetTextureStageState ( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );

	SetTextureStageState ( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
	SetTextureStageState ( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
	SetTextureStageState ( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );

	SetTextureStageState ( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
	SetTextureStageState ( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
	SetTextureStageState ( 0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR );

	SetTextureStageState ( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
	SetTextureStageState ( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
	SetTextureStageState ( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );

	SetTextureStageState ( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
	SetTextureStageState ( 1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
	SetTextureStageState ( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );

	SetTextureStageState ( 1, D3DTSS_MINFILTER, D3DTEXF_NONE );
	SetTextureStageState ( 1, D3DTSS_MAGFILTER, D3DTEXF_NONE );
	SetTextureStageState ( 1, D3DTSS_MIPFILTER, D3DTEXF_NONE );
}
void CMapBackground::Draw ( void )
{
	Camera_BuildView ( m_camera, true );
	Camera_BuildOrtho ( m_camera, 800, 600, true );
	Camera_BuildMix ( m_camera );

	// 画地图
	CMyBitmap::PrepareSprite ();

	// 得到左上的所在格子  g_dwXTitles * g_dwYTitles
	int sbx = m_Coordinate.x / 256;
	int sby = m_Coordinate.y / 256;

	int ebx = ( m_Coordinate.x + 800 ) / 256;
	int eby = ( m_Coordinate.y + 600 ) / 256;
	RECT mode = { 0, 0, 800, 600 };
	RECT bb = { 0, 0, 255, 255 };

	for ( int y = sby; y <= eby; y++ )
	{
		for ( int x = sbx; x <= ebx; x++ )
		{
			if ( y < 0 || x < 0 || y >= m_dwYBlock || x >= m_dwXBlock )
				continue;
			m_lpElement[y * m_dwXBlock + x].Show ( x * 256 - m_Coordinate.x, y * 256 - m_Coordinate.y );
		}
	}
}
*/

⌨️ 快捷键说明

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