OGRO.CPP
Upload User: nthssl
Upload Date: 2022-04-05
Package Size: 25357k
Code Size: 4k
Category:

OpenCV

Development Platform:

Visual C++

  1. #include "ogro.h"
  2. #include "rocket.h"
  3. void COgroEnemy::OnCollision(CObject *collisionObject)
  4. {
  5. // 只有模型没有死亡,才有可能与其它对象碰撞
  6. if (modelState != MODEL_DIE)
  7. {
  8. // 如果敌人与另外的敌人碰撞
  9. if ((typeid(*collisionObject) == typeid(CSodEnemy)) ||
  10. (typeid(*collisionObject) == typeid(COgroEnemy)))
  11. {
  12. aiState = AI_UNCARING;
  13. }
  14. // 如果敌人于地面碰撞
  15. else if (typeid(*collisionObject) == typeid(CTerrain))
  16. {
  17. position.y = ((CTerrain*)collisionObject)->GetHeight(position.x, position.z) + size;
  18. if (position.x <= ((CTerrain*)collisionObject)->GetScanDepth())
  19. position.x = ((CTerrain*)collisionObject)->GetScanDepth();
  20. if (position.x >= ((CTerrain*)collisionObject)->GetWidth()*((CTerrain*)collisionObject)->GetMul() - ((CTerrain*)collisionObject)->GetScanDepth())
  21. position.x = ((CTerrain*)collisionObject)->GetWidth()*((CTerrain*)collisionObject)->GetMul() - ((CTerrain*)collisionObject)->GetScanDepth();
  22. if (position.z <= ((CTerrain*)collisionObject)->GetScanDepth())
  23. position.z = ((CTerrain*)collisionObject)->GetScanDepth();
  24. if (position.z >= ((CTerrain*)collisionObject)->GetWidth()*((CTerrain*)collisionObject)->GetMul() - ((CTerrain*)collisionObject)->GetScanDepth())
  25. position.z = ((CTerrain*)collisionObject)->GetWidth()*((CTerrain*)collisionObject)->GetMul() - ((CTerrain*)collisionObject)->GetScanDepth();
  26. }
  27. else if (typeid(*collisionObject) == typeid(CRocket))
  28. {
  29. // 杀死ogre
  30. aiState = AI_DEAD;
  31. velocity = CVector(0.0, 0.0, 0.0);
  32. }
  33. }
  34. }
  35. void COgroEnemy::OnPrepare() 
  36. {
  37.      float dirToPlayer;  // 敌人与游戏者的角度方向
  38.      CVector diff;       // 从敌人到游戏者的方向矢量
  39.      diff.x = position.x - player->position.x;
  40.      diff.z = position.z - player->position.z;
  41.      diff.Normalize();
  42.      // 在场景中计算从敌人到游戏者的方向矢量与z轴负方向的夹角
  43.      dirToPlayer = RAD2DEG(diff.Angle(CVector(0,0,-1)));
  44.      // 产生随机数种子
  45.      srand((unsigned int)time(NULL));
  46.      ProcessAI();
  47.      // 根据AIstate设置模型状态
  48.      switch (aiState)
  49.      {
  50.      case AI_SCARED:
  51.           direction = (dirToPlayer - 90) + ((rand()%90)-45);  // 设置敌人的方向
  52.                                                               // -90 - 90 
  53.           modelState = MODEL_RUN;
  54.           velocity = CVector(0.0, 0.0, 15.0);
  55.           break;
  56.      case AI_UNCARING:
  57.           direction = float(rand() % 360);
  58.           if ((rand() % 4) != 0)
  59.           {
  60.                modelState = MODEL_IDLE;
  61.                velocity = CVector(0.0, 0.0, 0.0);
  62.           }
  63.           else
  64.           {
  65.                velocity = CVector(0.0, 0.0, 15.0);
  66.                modelState = MODEL_RUN;
  67.           }
  68.           break;
  69.      case AI_DEAD:
  70.           modelState = MODEL_DIE;
  71.           velocity = CVector(0.0, 0.0, 0.0);
  72.           if (nextFrame == stateStart)
  73.           {
  74.                // 杀死魔鬼
  75.                isDead = true;
  76.           }
  77.           break;
  78.      default:
  79.           break;
  80.      }
  81.      // 准备MD2模型
  82.      CEntity::OnPrepare();
  83. }
  84. void COgroEnemy::Load()
  85. {
  86. // 装人三维模型
  87. CMD2Model::Load("models\ogro\tris.md2", "models\ogro\ogrobase.pcx");
  88. }
  89. void COgroEnemy::OnProcessAI()
  90. {
  91.      // 计算与游戏者之间的距离
  92.      CVector diff = player->position - position;
  93.      if (aiState != AI_DEAD)
  94.      {
  95.           // 如果与游戏者距离非常近,敌人的状态会很恐怖
  96.           distFromPlayer = sqrt(diff.x*diff.x + diff.y*diff.y + diff.z*diff.z);
  97.           if (distFromPlayer < 100.0)
  98.                aiState = AI_SCARED;
  99.           else
  100.                aiState = AI_UNCARING;
  101.      }
  102. }