?? ogro.cpp
字號:
#include "ogro.h"
#include "rocket.h"
void COgroEnemy::OnCollision(CObject *collisionObject)
{
// 只有模型沒有死亡,才有可能與其它對象碰撞
if (modelState != MODEL_DIE)
{
// 如果敵人與另外的敵人碰撞
if ((typeid(*collisionObject) == typeid(CSodEnemy)) ||
(typeid(*collisionObject) == typeid(COgroEnemy)))
{
aiState = AI_UNCARING;
}
// 如果敵人于地面碰撞
else if (typeid(*collisionObject) == typeid(CTerrain))
{
position.y = ((CTerrain*)collisionObject)->GetHeight(position.x, position.z) + size;
if (position.x <= ((CTerrain*)collisionObject)->GetScanDepth())
position.x = ((CTerrain*)collisionObject)->GetScanDepth();
if (position.x >= ((CTerrain*)collisionObject)->GetWidth()*((CTerrain*)collisionObject)->GetMul() - ((CTerrain*)collisionObject)->GetScanDepth())
position.x = ((CTerrain*)collisionObject)->GetWidth()*((CTerrain*)collisionObject)->GetMul() - ((CTerrain*)collisionObject)->GetScanDepth();
if (position.z <= ((CTerrain*)collisionObject)->GetScanDepth())
position.z = ((CTerrain*)collisionObject)->GetScanDepth();
if (position.z >= ((CTerrain*)collisionObject)->GetWidth()*((CTerrain*)collisionObject)->GetMul() - ((CTerrain*)collisionObject)->GetScanDepth())
position.z = ((CTerrain*)collisionObject)->GetWidth()*((CTerrain*)collisionObject)->GetMul() - ((CTerrain*)collisionObject)->GetScanDepth();
}
else if (typeid(*collisionObject) == typeid(CRocket))
{
// 殺死ogre
aiState = AI_DEAD;
velocity = CVector(0.0, 0.0, 0.0);
}
}
}
void COgroEnemy::OnPrepare()
{
float dirToPlayer; // 敵人與游戲者的角度方向
CVector diff; // 從敵人到游戲者的方向矢量
diff.x = position.x - player->position.x;
diff.z = position.z - player->position.z;
diff.Normalize();
// 在場景中計算從敵人到游戲者的方向矢量與z軸負方向的夾角
dirToPlayer = RAD2DEG(diff.Angle(CVector(0,0,-1)));
// 產生隨機數種子
srand((unsigned int)time(NULL));
ProcessAI();
// 根據AIstate設置模型狀態
switch (aiState)
{
case AI_SCARED:
direction = (dirToPlayer - 90) + ((rand()%90)-45); // 設置敵人的方向
// -90 - 90
modelState = MODEL_RUN;
velocity = CVector(0.0, 0.0, 15.0);
break;
case AI_UNCARING:
direction = float(rand() % 360);
if ((rand() % 4) != 0)
{
modelState = MODEL_IDLE;
velocity = CVector(0.0, 0.0, 0.0);
}
else
{
velocity = CVector(0.0, 0.0, 15.0);
modelState = MODEL_RUN;
}
break;
case AI_DEAD:
modelState = MODEL_DIE;
velocity = CVector(0.0, 0.0, 0.0);
if (nextFrame == stateStart)
{
// 殺死魔鬼
isDead = true;
}
break;
default:
break;
}
// 準備MD2模型
CEntity::OnPrepare();
}
void COgroEnemy::Load()
{
// 裝人三維模型
CMD2Model::Load("models\\ogro\\tris.md2", "models\\ogro\\ogrobase.pcx");
}
void COgroEnemy::OnProcessAI()
{
// 計算與游戲者之間的距離
CVector diff = player->position - position;
if (aiState != AI_DEAD)
{
// 如果與游戲者距離非常近,敵人的狀態會很恐怖
distFromPlayer = sqrt(diff.x*diff.x + diff.y*diff.y + diff.z*diff.z);
if (distFromPlayer < 100.0)
aiState = AI_SCARED;
else
aiState = AI_UNCARING;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -