summaryrefslogtreecommitdiff
path: root/source/logic/Car.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/logic/Car.cpp')
-rw-r--r--source/logic/Car.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/source/logic/Car.cpp b/source/logic/Car.cpp
new file mode 100644
index 0000000..3e531a3
--- /dev/null
+++ b/source/logic/Car.cpp
@@ -0,0 +1,75 @@
+#include "Car.h"
+
+Car::Car(double x, double y, BitmapStore::Image image, Maze::Direction facing)
+ :GameObject(x,y,image,facing),
+ _speed(_baseSpeed)
+{
+}
+
+double Car::speed() const
+{
+ return _speed;
+}
+
+void Car::move(const Maze& maze)
+{
+ double targetX = 0;
+ double targetY = 0;
+
+ int checkX = 0;
+ int checkY = 0;
+
+ switch(_facing)
+ {
+ case Maze::UP:
+ targetX = MazeMath::round(_x);
+ targetY = _y - _speed;
+ checkX = floor(targetX);
+ checkY = floor(targetY);
+ break;
+ case Maze::DOWN:
+ targetX = MazeMath::round(_x);
+ targetY = _y + _speed;
+ checkX = floor(targetX);
+ checkY = ceil(targetY);
+ break;
+ case Maze::LEFT:
+ targetX = _x - _speed;
+ targetY = MazeMath::round(_y);
+ checkX = floor(targetX);
+ checkY = floor(targetY);
+ break;
+ case Maze::RIGHT:
+ targetX = _x + _speed;
+ targetY = MazeMath::round(_y);
+ checkX = ceil(targetX);
+ checkY = floor(targetY);
+ break;
+ }
+
+ if (!maze.getSolid(checkX, checkY))
+ {
+ //can move that way
+ _x = targetX;
+ _y = targetY;
+ }
+ else
+ {
+ //can not move to targetX and targetY, but move to the edge of current block
+ switch(_facing)
+ {
+ case Maze::UP:
+ _y = floor(_y);
+ break;
+ case Maze::DOWN:
+ _y = ceil(_y);
+ break;
+ case Maze::LEFT:
+ _x = floor(_x);
+ break;
+ case Maze::RIGHT:
+ _x = ceil(_x);
+ break;
+ }
+ }
+}