📄 player.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 + -