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

📄 3dsimpleobj.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
字号:
// 3DSimpleObj.cpp: implementation of the C3DSimpleObj class.
//
//////////////////////////////////////////////////////////////////////

#include "3DSimpleObj.h"
#include "3DRoleData.h"
#include "GameDataSet.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

C3DSimpleObj::C3DSimpleObj()
{
	m_nPosX = m_nPosY = 0;
	m_nRotate = 0;
	m_fScale = 1.0f;
	
	m_LightOffset.x = 0;
	m_LightOffset.y = 0;
	m_LightOffset.z = -1000;
	
	m_nShadowType = 2;
	
	m_a = 1.0f;
	m_r = 0.3f;
	m_g = 0.3f;
	m_b = 0.3f;
	m_bOblique = true;
}

C3DSimpleObj::~C3DSimpleObj()
{

}

//------------------------------------------------------------------
void C3DSimpleObj::SetPos(int nX, int nY, int nHeight, int nRotate, float fScale)
{
	m_nPosX = nX;
	m_nPosY = nY;
	m_nRotate = nRotate;
	m_fScale = fScale;
	m_nPosH = nHeight*2;
}

//------------------------------------------------------------------
BOOL C3DSimpleObj::Draw2BG(int nMapX, int nMapY)
{
	if (CMyBitmap::s_nShowMode != modeMesh)
		C3DObj::Prepare();
	float br = D3DXToRadian ( ( float )( m_nRotate % 45 ) );

	D3DXMATRIXA16 bmatrix;
	D3DXMatrixIdentity ( &bmatrix );

	Common_Translate ( &bmatrix, 0, 0, m_nPosH );
	
	Common_Rotate ( &bmatrix, 0, 0, br );
	Common_Scale ( &bmatrix, m_fScale - m_fScale * 0.2f, m_fScale - m_fScale * 0.2f, m_fScale - m_fScale * 0.3f );
	Common_Translate ( &bmatrix, m_nPosX, 0, m_nPosY );
	

	D3DXVECTOR3 min, max;
	
	this->TransformCoordforSimpleObj(&min, &max, &bmatrix);

	float temp;
	if ( min.x > max.x )
	{
		temp = min.x;
		min.x = max.x;
		max.x = temp;
	}
	if ( min.y > max.y )
	{
		temp = min.y;
		min.y = max.y;
		max.y = temp;
	}
	if ( min.z > max.z )
	{
		temp = min.z;
		min.z = max.z;
		max.z = temp;
	}
	
	// temp
	if ((max.z  - min.z) < 1)
		max.z += 1;
	RECT rect = { min.x, min.z, max.x, max.z };
	if(rect.left == rect.right)
		rect.right ++;
	if(rect.top == rect.bottom)
		rect.bottom ++;

	RECT mode = { nMapX, nMapY, _SCR_WIDTH + nMapX, _SCR_HEIGHT + nMapY };
	if ( !IntersectRect ( &rect, &mode, &rect ) )
		return false;
	
	D3DXMATRIXA16 matrix;
	D3DXMatrixIdentity ( &matrix );

	Common_Translate ( &matrix, 0, 0, m_nPosH );

	Common_Rotate ( &matrix, 0, 0, D3DXToRadian ( ( float )m_nRotate ) );
	if(m_bOblique)
		Common_Rotate ( &matrix, D3DXToRadian ( -45 ), 0, 0 );
	Common_Scale ( &matrix, m_fScale, m_fScale, m_fScale );
	Common_Translate ( &matrix, m_nPosX, 0, m_nPosY );


	//this->SetDefaultMotion();
 	this->SetTexture();
	this->MuliplyPhy(&matrix);
	C3DRolePart::Draw(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b);
	C3DRolePart::DrawAlpha(m_nShadowType, m_LightOffset.x, m_LightOffset.y, m_LightOffset.z, m_a, m_r, m_g, m_b, m_nPosH);
	this->ClearMatrix();
	return true;
}
//------------------------------------------------------------------
BOOL C3DSimpleObj::HitTest(int nHitScreenX, int nHitScreenY, int nMapX, int nMapY)
{
	float br = D3DXToRadian ( ( float )( m_nRotate % 45 ) );
	
	D3DXMATRIXA16 matrix;
	D3DXMatrixIdentity ( &matrix );
	Common_Rotate ( &matrix, 0, 0, br );
	Common_Scale ( &matrix, m_fScale - m_fScale * 0.2f, m_fScale - m_fScale * 0.2f, m_fScale - m_fScale * 0.3f );
	Common_Translate ( &matrix, m_nPosX, 0, m_nPosY );
	
	D3DXVECTOR3 min, max;
	this->TransformCoordforSimpleObj(&min, &max, &matrix);

	float temp;
	if ( min.x > max.x )
	{
		temp = min.x;
		min.x = max.x;
		max.x = temp;
	}
	if ( min.y > max.y )
	{
		temp = min.y;
		min.y = max.y;
		max.y = temp;
	}
	if ( min.z > max.z )
	{
		temp = min.z;
		min.z = max.z;
		max.z = temp;
	}
	
	D3DXVECTOR3 from, to, dir;
	from.x = nMapX + _SCR_WIDTH/2;			
	from.y = -1000;			
	from.z = nMapY + _SCR_HEIGHT/2;
	to.x = nHitScreenX + nMapX;		
	to.y = 0;				
	to.z = nHitScreenY + nMapY;
	dir = to - from;
	D3DXVec3Normalize ( &dir, &dir );
	
	return D3DXBoxBoundProbe ( &min, &max, &from, &dir );
}
//------------------------------------------------------------------
void C3DSimpleObj::SetLightOffset(int type, float x, float y, float z, float a, float r, float g, float b)
{
	m_nShadowType = type;
	
	m_LightOffset.x = x;
	m_LightOffset.y = -y;
	m_LightOffset.z = -z;
	
	m_a = a;
	m_r = r;
	m_g = g;
	m_b = b;
}

//------------------------------------------------------------------
C3DSimpleObj* C3DSimpleObj::CreateNew(OBJID idType)
{
	if(idType == ID_NONE)
		return NULL;

	C3DSimpleObj* pData = new C3DSimpleObj;
	if(!pData)
		return NULL;

	if(!pData->Create(idType))
	{
		SAFE_DELETE(pData);
		return NULL;
	}

	return pData;
}

//--------------------------------------------------------------------
BOOL C3DSimpleObj::Create(OBJID idType)
{
	if(idType == ID_NONE)
		return false;
	this->Destroy();
	C3DSimpleObjInfo* pInfo = g_obj3DRoleData.Get3DSimpleObjInfo(idType);
	if(!pInfo || pInfo->nParts <= 0)
		return false;

	m_infoPart.idMesh = pInfo->idMesh[0];
	m_infoPart.idTexture = pInfo->idTexture[0];
	m_infoPart.p3DMesh = g_objGameDataSet.Get3DObj(m_infoPart.idMesh);

	this->SetDefaultMotion();
	return true;
}
//--------------------------------------------------------------------
void C3DSimpleObj::Create(OBJID idMesh, OBJID idTexture)
{
	m_infoPart.idMesh = idMesh;
	m_infoPart.idTexture = idTexture;
	m_infoPart.p3DMesh = g_objGameDataSet.Get3DObj(m_infoPart.idMesh);
	this->SetDefaultMotion();
}

⌨️ 快捷键说明

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