www.pudn.com > BucklandSimpleSoccer.rar > SoccerBall.h


#ifndef SOCCERBALL_H 
#define SOCCERBALL_H 
#pragma warning (disable:4786) 
//------------------------------------------------------------------------ 
// 
//  Name: SoccerBall.h 
// 
//  Desc: Class to implement a soccer ball. This class inherits from 
//        MovingEntity and provides further functionality for collision 
//        testing and position prediction. 
// 
//  Author: Mat Buckland 2003 (fup@ai-junkie.com) 
// 
//------------------------------------------------------------------------ 
#include  
 
#include "Game/MovingEntity.h" 
#include "constants.h" 
 
 
class Wall2D; 
class PlayerBase; 
 
 
class SoccerBall : public MovingEntity 
{ 
private: 
 
  //keeps a record of the ball's position at the last update 
  Vector2D                  m_vOldPos; 
 
  //a local reference to the Walls that make up the pitch boundary 
  const std::vector& m_PitchBoundary;                                       
 
 
   
 
public: 
    //tests to see if the ball has collided with a ball and reflects  
  //the ball's velocity accordingly 
  void TestCollisionWithWalls(const std::vector& walls); 
 
  SoccerBall(Vector2D           pos,             
             double               BallSize, 
             double               mass, 
             std::vector& PitchBoundary): 
   
      //set up the base class 
      MovingEntity(pos, 
                  BallSize, 
                  Vector2D(0,0), 
                  -1.0,                //max speed - unused 
                  Vector2D(0,1), 
                  mass, 
                  Vector2D(1.0,1.0),  //scale     - unused 
                  0,                   //turn rate - unused 
                  0),                  //max force - unused 
     m_PitchBoundary(PitchBoundary) 
  {} 
   
  //implement base class Update 
  void      Update(); 
 
  //implement base class Render 
  void      Render(); 
 
  //a soccer ball doesn't need to handle messages 
  bool      HandleMessage(const Telegram& msg){return false;} 
 
  //this method applies a directional force to the ball (kicks it!) 
  void      Kick(Vector2D direction, double force); 
 
  //given a kicking force and a distance to traverse defined by start 
  //and finish points, this method calculates how long it will take the 
  //ball to cover the distance. 
  double    TimeToCoverDistance(Vector2D from, 
                               Vector2D to, 
                               double     force)const; 
 
  //this method calculates where the ball will in 'time' seconds 
  Vector2D FuturePosition(double time)const; 
 
  //this is used by players and goalkeepers to 'trap' a ball -- to stop 
  //it dead. That player is then assumed to be in possession of the ball 
  //and m_pOwner is adjusted accordingly 
  void      Trap(){m_vVelocity.Zero();}   
 
  Vector2D  OldPos()const{return m_vOldPos;} 
   
  //this places the ball at the desired location and sets its velocity to zero 
  void      PlaceAtPosition(Vector2D NewPos); 
}; 
 
 
 
//this can be used to vary the accuracy of a player's kick. 
Vector2D AddNoiseToKick(Vector2D BallPos, Vector2D BallTarget); 
 
 
 
#endif