Rally X
ELEN3009 Project by Justin Wernick and David Schneider
|
00001 #include "PlayerCar.h" 00002 00003 PlayerCar::PlayerCar(double x, double y, Maze::Direction facing) 00004 :Car(x,y,BitmapStore::PLAYER, facing), 00005 _input(_facing), 00006 _petrol(1) 00007 { 00008 } 00009 00010 void PlayerCar::update(const Maze& maze, list<Smokescreen>& currentSmoke) 00011 { 00012 _petrol -= PETROL_USE_RATE; 00013 if (_petrol<0) 00014 { 00015 _speed = _baseSpeed/2; 00016 _petrol = 0; 00017 } 00018 00019 _facing = _input.getFacing(); 00020 move(maze); 00021 00022 if (_input.getSmokescreen()) 00023 { 00024 makeSmoke(currentSmoke); 00025 } 00026 } 00027 00028 void PlayerCar::makeSmoke(list<Smokescreen>& currentSmoke) 00029 { 00030 if (_petrol < PETROL_USE_SMOKESCREEN) return; 00031 00032 double targetX = 0; 00033 double targetY = 0; 00034 00035 switch(_facing) 00036 { 00037 case Maze::UP: 00038 targetX = round(_x); 00039 targetY = round(_y+1); 00040 break; 00041 case Maze::DOWN: 00042 targetX = round(_x); 00043 targetY = round(_y-1); 00044 break; 00045 case Maze::LEFT: 00046 targetX = round(_x+1); 00047 targetY = round(_y); 00048 break; 00049 case Maze::RIGHT: 00050 targetX = round(_x-1); 00051 targetY = round(_y); 00052 break; 00053 } 00054 00055 bool overlap = false; 00056 00057 for (list<Smokescreen>::const_iterator iter = currentSmoke.begin(); iter!=currentSmoke.end(); ++iter) 00058 { 00059 if ((abs(iter->x() - targetX)<1)&&(abs(iter->y() - targetY)<1)) 00060 { 00061 overlap = true; 00062 break; 00063 } 00064 } 00065 00066 if (!overlap) 00067 { 00068 currentSmoke.push_back(Smokescreen(targetX, targetY)); 00069 _petrol -= PETROL_USE_SMOKESCREEN; 00070 } 00071 } 00072 00073 void PlayerCar::crash() 00074 { 00075 _destroyed = true; 00076 } 00077 00078 void PlayerCar::gotCheckpoint() 00079 { 00080 _petrol+=PETROL_FROM_CHECKPOINT; 00081 _speed = _baseSpeed; 00082 } 00083 00084 double PlayerCar::petrol() const 00085 { 00086 return _petrol; 00087 }