diff options
Diffstat (limited to 'source/logic/PlayerCar.cpp')
-rw-r--r-- | source/logic/PlayerCar.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/source/logic/PlayerCar.cpp b/source/logic/PlayerCar.cpp new file mode 100644 index 0000000..5da4ba0 --- /dev/null +++ b/source/logic/PlayerCar.cpp @@ -0,0 +1,87 @@ +#include "PlayerCar.h" + +PlayerCar::PlayerCar(double x, double y, Maze::Direction facing) + :Car(x,y,BitmapStore::PLAYER, facing), + _input(_facing), + _petrol(1) +{ +} + +void PlayerCar::update(const Maze& maze, list<Smokescreen>& currentSmoke) +{ + _petrol -= PETROL_USE_RATE; + if (_petrol<0) + { + _speed = _baseSpeed/2; + _petrol = 0; + } + + _facing = _input.getFacing(); + move(maze); + + if (_input.getSmokescreen()) + { + makeSmoke(currentSmoke); + } +} + +void PlayerCar::makeSmoke(list<Smokescreen>& currentSmoke) +{ + if (_petrol < PETROL_USE_SMOKESCREEN) return; + + double targetX = 0; + double targetY = 0; + + switch(_facing) + { + case Maze::UP: + targetX = round(_x); + targetY = round(_y+1); + break; + case Maze::DOWN: + targetX = round(_x); + targetY = round(_y-1); + break; + case Maze::LEFT: + targetX = round(_x+1); + targetY = round(_y); + break; + case Maze::RIGHT: + targetX = round(_x-1); + targetY = round(_y); + break; + } + + bool overlap = false; + + for (list<Smokescreen>::const_iterator iter = currentSmoke.begin(); iter!=currentSmoke.end(); ++iter) + { + if ((abs(iter->x() - targetX)<1)&&(abs(iter->y() - targetY)<1)) + { + overlap = true; + break; + } + } + + if (!overlap) + { + currentSmoke.push_back(Smokescreen(targetX, targetY)); + _petrol -= PETROL_USE_SMOKESCREEN; + } +} + +void PlayerCar::crash() +{ + _destroyed = true; +} + +void PlayerCar::gotCheckpoint() +{ + _petrol+=PETROL_FROM_CHECKPOINT; + _speed = _baseSpeed; +} + +double PlayerCar::petrol() const +{ + return _petrol; +} |