home *** CD-ROM | disk | FTP | other *** search
/ AI Game Programming Wisdom / AIGameProgrammingWisdom.iso / SourceCode / 06 General Architectures / 04 Christian / wander.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-16  |  2.0 KB  |  123 lines

  1.  
  2. #include "character.h"
  3. #include "Wander.h"
  4. #include "gametime.h"
  5. #include "util.h"
  6.  
  7. Wander::Wander()
  8. {
  9.     m_name      = "Wander"; // must match class name
  10.     m_owner     = NULL;
  11. }
  12.  
  13. void Wander::init   ( IEOwner * owner )
  14. {
  15.     m_owner = dynamic_cast<Character *> (owner);
  16.  
  17.     m_minWanderTime = 5.0f;
  18. }
  19.  
  20. bool Wander::start ()
  21. {
  22.     m_state = Go;
  23.  
  24.     m_owner->animStart ( CA_Walk );
  25.  
  26.     printf ( "%s starts walking.\n", m_owner->getName() );
  27.  
  28.     m_dirClock  = 0.0f;
  29.     newDirection();
  30.  
  31.     m_owner->setMotionSpeed ( m_owner->getWalkSpeed() );
  32.  
  33.     return false;
  34. }
  35.  
  36. bool Wander::update () 
  37. {
  38.     switch ( m_state )
  39.     {
  40.  
  41.     case Go:
  42.         m_owner->move ();
  43.  
  44.         m_dirClock += GameTime::dt;
  45.  
  46.         if ( m_dirClock > m_timeChangeDir )
  47.         {
  48.             newDirection();
  49.             m_dirClock = 0.0f;
  50.         }
  51.  
  52.         if ( m_owner->inNewPos() )
  53.         {
  54.             int x, y;
  55.             m_owner->getPos ( x, y );
  56.             printf ( "%s wandering at %d %d\n",
  57.                 m_owner->getName(), x, y );
  58.         }
  59.  
  60.         m_owner->burnEnergy();
  61.  
  62.         break;
  63.     }
  64.  
  65.     return true;
  66. }
  67.  
  68. bool Wander::finish ()
  69. {
  70.     return true;
  71. }
  72.  
  73. IEOwner * Wander::getOwner ()
  74. {
  75.     return m_owner;
  76. }
  77.  
  78. const char * Wander::getName()
  79. {
  80.     return m_name.c_str();
  81. }
  82.  
  83. void Wander::newDirection ()
  84. {
  85.     float r = frand();
  86.  
  87.     int xdir, ydir;
  88.  
  89.     // x direction
  90.     if ( r < 0.5f )
  91.     {
  92.         r = frand();
  93.  
  94.         if ( r < 0.5f )
  95.             xdir = 1;
  96.         else
  97.             xdir = -1;
  98.  
  99.         ydir = 0;
  100.     }
  101.  
  102.     // else y direction
  103.     else 
  104.     {
  105.         r = frand();
  106.  
  107.         if ( r < 0.5f )
  108.             ydir = 1;
  109.         else
  110.             ydir = -1;
  111.  
  112.         xdir = 0;
  113.     }
  114.  
  115.     //printf ( "changed dir %d %d\n", xdir, ydir );
  116.  
  117.     // figure the time to change next direction
  118.     r = frand();
  119.  
  120.     m_timeChangeDir = m_minWanderTime + ( r * 10.0f );
  121.  
  122.     m_owner->setDirection ( xdir, ydir );
  123. }