📄 aicar.cpp
字号:
#include "StdAfx.h"
#include "AiCar.h"
//-------------------------------------------------------------------------------
// AI汽车构造函数
//-------------------------------------------------------------------------------
CAiCar::CAiCar()
{
m_pCurRoad = NULL;
m_iCurRoadPos = 0;
}
//-------------------------------------------------------------------------------
// AI汽车析构函数
//-------------------------------------------------------------------------------
CAiCar::~CAiCar()
{
}
//-------------------------------------------------------------------------------
// 更新
//-------------------------------------------------------------------------------
void CAiCar::Update()
{
Parent::Update();
if (m_pCurRoad == NULL || m_iCurRoadPos < 0)
{
return ;
}
Vector3 vNextPos = (*m_pCurRoad)[m_iCurRoadPos];
Vector3 vCurPos = GetPosition();
vNextPos.z = vCurPos.z;
Vector3 vNextDir = vNextPos - vCurPos;
float fDiff = fabsf(vNextDir.x + vNextDir.y);
if (vCurPos == vNextPos || fDiff <= 0.86f)
{
++m_iCurRoadPos;
if (m_iCurRoadPos >= (int)m_pCurRoad->size())
{
m_pCurRoad = NULL;
m_iCurRoadPos = 0;
}
return ;
}
vNextDir.Normalize();
Vector3 vCurDir;
GetTransformObjToWorld().GetRow(1, &vCurDir);
if (vCurDir != vNextDir)
{
Vector3 vDirDiff = vNextDir - vCurDir;
float fDirDiff = fabsf(vDirDiff.x + vDirDiff.y);
//vDirDiff *= GetTransformObjToWorld();
if (fDirDiff <= 0.02f)
{
}
else if (fDirDiff <= 1.0f)
{
vCurDir = vNextDir;
Vector3 vX = CrossProduct(vCurDir, Vector3(0.f, 0.f, 1.f));
CMatrix44F mat = GetTransformObjToWorld();
mat.SetRow(0, vX);
mat.SetRow(1, vCurDir);
SetTransform(mat);
return ;
}
else
{
float fCurDir = vCurDir.y;// + vCurDir.x;
if (fCurDir > 0.f && (vDirDiff.x + vDirDiff.y < 0.f)
|| fCurDir < 0.f && (vDirDiff.x + vDirDiff.y > 0.f))
{
TurnLeft();
}
else
{
TurnRight();
}
return ;
}
}
if (fDiff <= 1.2f)
{
if (m_fMoveSpeed >= 4.f)
{
SubMoveSpeed(0.022f);
}
else if (m_fMoveSpeed >= 2.f)
{
SubMoveSpeed(0.002f);
}
else
{
AddMoveSpeed(0.02f);
}
}
else
{
AddMoveSpeed(0.042f);
}
}
//-------------------------------------------------------------------------------
// 设置AI路径
//-------------------------------------------------------------------------------
bool CAiCar::SetAiRoad(int index)
{
m_pCurRoad = g_AiRoadManager.GetAiRoad(index);
m_iCurRoadPos = 0;
return m_pCurRoad != NULL;
}
//-------------------------------------------------------------------------------
// 一个全局的AI路径管理变量
//-------------------------------------------------------------------------------
CAiRoadManager g_AiRoadManager;
//-------------------------------------------------------------------------------
// 根据文件名载入AI路径
//-------------------------------------------------------------------------------
bool CAiRoadManager::LoadAiRoad(const char *szAiFile)
{
ifstream inf(szAiFile);
if (!inf)
{
return false;
}
int iRoadCount;
inf >> iRoadCount;
m_lstAiRoads.resize(iRoadCount);
for (int i=0; i<iRoadCount; ++i)
{
int iPosCount;
inf >> iPosCount;
m_lstAiRoads[i].resize(iPosCount);
for (int j=0; j<iPosCount; ++j)
{
Vector3 &curPos = m_lstAiRoads[i][j];
inf >> curPos.x >> curPos.y;
curPos.z = 0.f;
}
}
return true;
}
//-------------------------------------------------------------------------------
// 获取AI路径个数
//-------------------------------------------------------------------------------
int CAiRoadManager::GetRoadCount() const
{
return (int)m_lstAiRoads.size();
}
//-------------------------------------------------------------------------------
// 获取指定索引的AI路径
//-------------------------------------------------------------------------------
const AIRoad* CAiRoadManager::GetAiRoad(int index) const
{
if (index < 0 || index > GetRoadCount())
{
return NULL;
}
return &m_lstAiRoads[index];
}
//-------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -