summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcflip <cflip@cflip.net>2022-02-27 13:11:49 -0700
committercflip <cflip@cflip.net>2022-02-27 13:11:49 -0700
commit5e35269921281f38f77fcfe2150c937290cafe46 (patch)
tree052036c6af1b93e85050554f5862ca71a5ad1bb0
parent8c8096dab1538592e6bacea6ba4e1f9882ae6e0b (diff)
Automatically set train direction on right-click
-rw-r--r--src/main.cpp2
-rw-r--r--src/train.cpp62
-rw-r--r--src/train.h8
3 files changed, 37 insertions, 35 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 7b22928..f2099d5 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -14,7 +14,7 @@ int main(int argc, char** argv)
Level level(32, 32);
Bitmap bitmap(Width, Height);
- Train car;
+ Train car(level);
int xOffs = 0, yOffs = 0;
int xDrag, yDrag;
diff --git a/src/train.cpp b/src/train.cpp
index d401572..06c43b2 100644
--- a/src/train.cpp
+++ b/src/train.cpp
@@ -14,52 +14,52 @@ void Train::update(Level& level)
return;
}
- m_progress = 0.f;
-
- auto n = level.get(x, y - 1);
- auto e = level.get(x + 1, y);
- auto s = level.get(x, y + 1);
- auto w = level.get(x - 1, y);
-
- if (m_dir == North) {
- if (n == SouthEast) m_dir = East;
- if (n == SouthWest) m_dir = West;
- y--;
- } else if (m_dir == East) {
- if (e == NorthWest) m_dir = North;
- if (e == SouthWest) m_dir = South;
- x++;
- } else if (m_dir == South) {
- if (s == NorthEast) m_dir = East;
- if (s == NorthWest) m_dir = West;
- y++;
- } else if (m_dir == West) {
- if (w == NorthEast) m_dir = North;
- if (w == SouthEast) m_dir = South;
- x--;
- }
-
- nextTile();
+ setPosition(m_nextX, m_nextY);
}
void Train::draw(Bitmap& bitmap, int xo, int yo)
{
- float xi = ((float)x + (float)(m_nextX - x) * m_progress) * 24;
- float yi = ((float)y + (float)(m_nextY - y) * m_progress) * 24;
+ float xi = ((float)x + (float)(m_nextX - x) * m_progress) * TileSize;
+ float yi = ((float)y + (float)(m_nextY - y) * m_progress) * TileSize;
int xx = (int)((xi - yi) / 2.f - (float)xo);
int yy = (int)((xi + yi) / 4.f - (float)yo);
- bitmap.blit(m_sprite, xx, yy, 0, 0, 24, 24);
+ bitmap.blit(m_sprite, xx, yy, 0, 0, TileSize, TileSize);
}
void Train::setPosition(int tx, int ty)
{
x = tx;
y = ty;
+
m_progress = 0.f;
- nextTile();
+ findDirection();
+ findNextTile();
+}
+
+void Train::findDirection()
+{
+ auto tile = m_level.get(x, y);
+
+ if (m_dir == North) {
+ if (tile == SouthEast) m_dir = East;
+ if (tile == SouthWest) m_dir = West;
+ if (tile == EastWest) m_dir = East;
+ } else if (m_dir == East) {
+ if (tile == NorthWest) m_dir = North;
+ if (tile == SouthWest) m_dir = South;
+ if (tile == NorthSouth) m_dir = South;
+ } else if (m_dir == South) {
+ if (tile == NorthEast) m_dir = East;
+ if (tile == NorthWest) m_dir = West;
+ if (tile == EastWest) m_dir = West;
+ } else if (m_dir == West) {
+ if (tile == NorthEast) m_dir = North;
+ if (tile == SouthEast) m_dir = South;
+ if (tile == NorthSouth) m_dir = North;
+ }
}
-void Train::nextTile()
+void Train::findNextTile()
{
if (m_dir == North) {
m_nextX = x;
diff --git a/src/train.h b/src/train.h
index 6f5cd23..dc09889 100644
--- a/src/train.h
+++ b/src/train.h
@@ -7,8 +7,8 @@ class Level;
class Train {
public:
- Train()
- : m_sprite("../res/car.png") { }
+ explicit Train(Level& level)
+ : m_sprite("../res/car.png"), m_level(level) { }
void update(Level&);
void draw(Bitmap&, int, int);
@@ -16,9 +16,11 @@ public:
void setPosition(int x, int y);
private:
- void nextTile();
+ void findDirection();
+ void findNextTile();
Bitmap m_sprite;
+ Level& m_level;
int x { 0 }, y { 0 };
float m_speed { 0.05f };