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

📄 player.cpp

📁 3D游戏展示程序
💻 CPP
字号:
//--------------------------------------------------
//  Desc: 主角
//  Author: artsylee/2007.3.20
//--------------------------------------------------

#include "Common.h"
#include "Player.h"
#include "Heightmap.h"

extern CHeightmap g_Hmap;

CPlayer::CPlayer():
m_pFrameRightHand(NULL),
m_vDirection(0.0f, -1.0f),
m_fSpeed(75.0f)
{
	m_PlayerAniIndex = 0;
	m_WeaponIndex = 0;
}

CPlayer::~CPlayer()
{
}

void CPlayer::Load(void)
{
	m_PlayerMesh.Load("Model\\Krew_Sim_BC.x");
	D3DXVECTOR3 MeshPos(1280.0f, 0.0f, 3746.0f);
	float height = g_Hmap.GetHeight(&MeshPos);
	MeshPos.y = height;
	m_PlayerMesh.SetAnimation(0);
	m_PlayerMesh.SetAnimationSpeed(0.01f);
	m_PlayerMesh.GetXFrameFromFile("Bip01_R_Hand", m_pFrameRightHand);
	m_PlayerMesh.SetPosition(MeshPos);
	m_PlayerMesh.SetScale(D3DXVECTOR3(0.2f, 0.2f, 0.2f));
	m_PlayerMesh.SetName("Player");
	//m_PlayerMesh.SetRotateY(2.0f);

	// 计算朝向
	D3DXVECTOR3 vDir = D3DXVECTOR3(m_vDirection.x, 0, m_vDirection.y);
	D3DXMATRIX	matRot = m_PlayerMesh.GetDerivedOrientation();
	D3DXVec3TransformNormal(&vDir, &vDir, &matRot);
	m_vDirection.x = vDir.x;
	m_vDirection.y = vDir.z;

	LoadWeapon("Config\\Weapon.ini", m_WeaponIndex);
	// ak47 OK
	// firearm OK
	// gun OK
	// sword OK
	// Knife OK
	// Bow OK
	// SaveWeapon("Config\\Weapon.ini", 5);
	CCameraLock::Load();
	m_PlayerMesh.AddChildNode(m_pMVCamera);
}

//--------------------------------------------------
// Save Weapon
//--------------------------------------------------
void CPlayer::SaveWeapon(const char *pFile, int index) const
{
	/*
	CIniFile weapon(pFile);
	char szindex[64];
	sprintf(szindex, "Weapon_%d", index);
	weapon.WriteString(szindex, "Name", "Bow");
	weapon.WriteString(szindex, "File", "Model\\bow.x");
	weapon.WriteVec3D(szindex, "Scale", Vec3D(10.0f, 10.0f, 10.0f));
	weapon.WriteVec3D(szindex, "Position", Vec3D(10.0f, 10.0f, 10.0f));
	weapon.WriteVec3D(szindex, "Rotate", Vec3D(0.0f, 0.0f, 0.0f));
	weapon.Save();
	*/
}

//--------------------------------------------------
// Load Weapon
//--------------------------------------------------
void CPlayer::LoadWeapon(const char *pFile, int index)
{
	CIniFile weapon(pFile);
	char szindex[64];
	sprintf(szindex, "Weapon_%d", index);
	char szModelName[256];
	char szName[64];
	weapon.ReadString(szindex, "File", szModelName);
	weapon.ReadString(szindex, "Name", szName);
	D3DXVECTOR3 weaponscale = Vec3DToD3D(weapon.ReadVec3D(szindex, "Scale"));
	D3DXVECTOR3 pos = Vec3DToD3D(weapon.ReadVec3D(szindex, "Position"));
	D3DXVECTOR3 Rotate = Vec3DToD3D(weapon.ReadVec3D(szindex, "Rotate"));
	
	m_Weapon.Load(szModelName);
	m_Weapon.SetName(szName);
	m_Weapon.SetScale(weaponscale);
	D3DXMatrixScaling(&m_matWeaponScale, weaponscale.x, weaponscale.y, weaponscale.z);
	m_Weapon.SetPosition(pos);
	m_Weapon.SetRotate(D3DXVECTOR3(AS_PI*(Rotate.x), AS_PI*(Rotate.y), AS_PI*(Rotate.z)));
}

void CPlayer::Update(void)
{
	m_PlayerAniIndex = PA_IDLE;
	if(GetCamera()==0)
	{
	//	if(KEYDOWN_W)	{ Move(m_fSpeed);	m_PlayerAniIndex = PA_RUN;	}
	//	if(KEYDOWN_S))	{ Move(-m_fSpeed);	m_PlayerAniIndex = PA_WALK;	}
	//	if(KEYDOWN_A))	{ Turn(-0.02f);		m_PlayerAniIndex = PA_RUN;	}
	//	if(KEYDOWN_D))	{ Turn(0.02f);		m_PlayerAniIndex = PA_RUN;	}
	}
	CCameraLock::CameraControl();
	
	m_PlayerMesh.SetAnimation(m_PlayerAniIndex);
	m_PlayerMesh.Update();
	m_Weapon.SetParentMatrix(m_matWeaponScale*m_pFrameRightHand->CombinedTransformationMatrix);
	m_Weapon.Update();
}

void CPlayer::Render(void)
{
	m_Weapon.Render();
	m_PlayerMesh.Render();
	CCameraLock::RenderInfo();
}

void CPlayer::GetCameraPostion(D3DXVECTOR3 *pos)
{
	m_pCurCamera->GetPosition(pos);
}

//---------------------------------------------------
// 前后移动
//---------------------------------------------------
void CPlayer::Move(float fSpeed)
{
	float fSpeedLen = fSpeed * g_ElapsedTime * 0.001f;
	m_PlayerMesh.Translate(D3DXVECTOR3(m_vDirection.x*fSpeedLen, 0, m_vDirection.y*fSpeedLen));
	D3DXVECTOR3 worldPos = m_PlayerMesh.GetDerivedPos();	
	float height = g_Hmap.GetHeight(&worldPos);
	D3DXVECTOR3 pos;
	m_PlayerMesh.GetPosition(&pos);
	pos.y = height;
	m_PlayerMesh.SetPosition(pos);
	m_bUpdateViewer = true;
}

//---------------------------------------------------
// 左右转身
//---------------------------------------------------
void CPlayer::Turn(float fAngle)
{
	// 此处需要改为先获取Y旋转再加上fAngle
	m_PlayerMesh.SetRotateY(fAngle);
//	m_pCurCamera->RotateUp(fAngle);
	// 计算朝向
	D3DXVECTOR3 vDir = D3DXVECTOR3(m_vDirection.x, 0, m_vDirection.y);
	D3DXMATRIX	matRot;
	D3DXMatrixRotationY(&matRot, fAngle);
	D3DXVec3TransformNormal(&vDir, &vDir, &matRot);
	m_vDirection.x = vDir.x;
	m_vDirection.y = vDir.z;
}


⌨️ 快捷键说明

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