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

📄 aicar.cpp

📁 3D赛车游戏源代码-用Visual Studio 2005
💻 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 + -