summaryrefslogtreecommitdiff
path: root/source/logic/PlayerCar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/logic/PlayerCar.cpp')
-rw-r--r--source/logic/PlayerCar.cpp87
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;
+}