📄 game_chars.cpp
字号:
#include "Game_Chars.h"
#include "Global.h"
#include "WinMain.h"
///////////////////////////////////////////////////////////
// Overloaded character controller class functions
///////////////////////////////////////////////////////////
BOOL cChars::SetData(cApp *App)
{
if((m_App = App) == FALSE)
return FALSE;
return TRUE;
}
BOOL cChars::PCUpdate(sCharacter *Character, long Elapsed, \
float *XMove, float *YMove, float *ZMove)
{
float Speed;
if(Character->Action == CHAR_MOVE ){
Speed = (float)Elapsed / 1000.0f * GetSpeed(Character);
// Get the input flags
*XMove = (float)sin(Character->Direction) * Speed;
*ZMove = (float)cos(Character->Direction) * Speed;
}
return TRUE;
}
BOOL cChars::ValidateMove(sCharacter *Character, \
float *XMove, float *YMove, float *ZMove)
{
float Height;
// Check for height changes (can step up to 64 units)
Height = m_App->GetHeightBelow(&m_App->m_LevelMesh, *XMove + Character->XPos, Character->YPos + 64.0f, *ZMove + Character->ZPos);
// Print item name
*YMove = Height - Character->YPos;
// Check against terrain mesh for collision
if(m_App != NULL) {
if(m_App->CheckIntersect( \
&m_App->m_LevelMesh, \
Character->XPos, \
Character->YPos+64.0f, \
Character->ZPos, \
*XMove + Character->XPos, \
*YMove + Character->YPos + 64.0f, \
*ZMove + Character->ZPos) == TRUE)
return FALSE;
}
return TRUE;
}
BOOL cChars::CheckIntersect( \
float XStart, float YStart, float ZStart, \
float XEnd, float YEnd, float ZEnd)
{
sMesh *MeshPtr;
BOOL Hit;
float u, v, Dist;
float XDiff, YDiff, ZDiff, Size;
DWORD FaceIndex;
D3DXVECTOR3 vecDir;
// Start with parent mesh
if((MeshPtr = m_App->m_LevelMesh.GetParentMesh()) == NULL)
return FALSE; // No polygons hit
// Calculate ray
XDiff = XEnd - XStart;
YDiff = YEnd - YStart;
ZDiff = ZEnd - ZStart;
Size = (float)sqrt(XDiff*XDiff+YDiff*YDiff+ZDiff*ZDiff);
D3DXVec3Normalize(&vecDir, &D3DXVECTOR3(XDiff, YDiff, ZDiff));
// Go through each mesh looking for intersection
while(MeshPtr != NULL) {
D3DXIntersect(MeshPtr->m_Mesh, \
&D3DXVECTOR3(XStart,YStart,ZStart), &vecDir, \
&Hit, &FaceIndex, &u, &v, &Dist);
if(Hit == TRUE) {
if(Dist >= Size)
Hit = FALSE;
else return TRUE;
}
MeshPtr = MeshPtr->m_Next;
}
return Hit; // No polygons hit
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -