From 7803be09b7c0a133b1009408fea2fb1f1474e786 Mon Sep 17 00:00:00 2001 From: cflip Date: Wed, 30 Mar 2022 21:48:07 -0600 Subject: Store train objects in a unique_ptr The trains were being destructed after leaving the scope of the addVehicle function. This change makes sure the trains stay allocated for the entire lifetime of the level. Fixes #2 --- src/level.cpp | 15 +++++++++------ src/level.h | 10 ++++++---- src/main.cpp | 4 +--- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/level.cpp b/src/level.cpp index e09f74a..22f861b 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -1,6 +1,7 @@ #include "level.h" #include +#include #include #include @@ -33,8 +34,8 @@ void Level::set(int x, int y, uint8_t tile) void Level::update() { - for (auto& vehicle : m_vehicles) { - vehicle.update(); + for (const auto& vehicle : m_vehicles) { + vehicle->update(); } } @@ -77,12 +78,12 @@ void Level::draw(Bitmap& bitmap, int xo, int yo) for (int y = 0; y < m_height; ++y) { for (int x = 0; x < m_width; ++x) { auto isInTile = [x, y](const auto& vehicle) { - return vehicle.getSpritePosition().x == x && vehicle.getSpritePosition().y == y; + return vehicle->getSpritePosition().x == x && vehicle->getSpritePosition().y == y; }; auto vehiclesInTile = std::find_if(m_vehicles.begin(), m_vehicles.end(), isInTile); while (vehiclesInTile != m_vehicles.end()) { - vehiclesInTile->draw(bitmap, xo, yo); + vehiclesInTile->get()->draw(bitmap, xo, yo); vehiclesInTile = std::find_if(++vehiclesInTile, m_vehicles.end(), isInTile); } @@ -97,9 +98,11 @@ void Level::draw(Bitmap& bitmap, int xo, int yo) } } -Train& Level::addVehicle() +void Level::addVehicle(int x, int y) { - return m_vehicles.emplace_back(*this); + auto& ptr = m_vehicles.emplace_back(std::make_unique(*this)); + ptr->setPosition(x, y); + ptr->setSpeed(0.2f); } void Level::toggleTile(int x, int y) diff --git a/src/level.h b/src/level.h index 7bd52e2..fa6376d 100644 --- a/src/level.h +++ b/src/level.h @@ -1,10 +1,11 @@ #pragma once -#include "bitmap.h" #include -#include +#include #include +#include "bitmap.h" + #define TILE_TYPE(x) ((x)&0xf) #define TILE_DATA(x) (x >> 4 & 0xf) #define MAKE_TILE(t, d) ((((d)&0xf) << 4) + ((t)&0xf)) @@ -38,17 +39,18 @@ public: void update(); void draw(Bitmap& bitmap, int xo, int yo); - Train& addVehicle(); + void addVehicle(int x, int y); void toggleTile(int x, int y); void save() const; void load(); + private: Bitmap& m_tileSprites; int m_width, m_height; uint8_t* m_tiles; - std::vector m_vehicles; + std::vector> m_vehicles; }; TrackDirection ChooseDirection(Level& level, int x, int y); diff --git a/src/main.cpp b/src/main.cpp index dcd5975..25e6fea 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -46,9 +46,7 @@ int main(int argc, char** argv) int my = y / Scale + yOffs; auto pos = ScreenToTile({ mx, my }); - Train& train = level.addVehicle(); - train.setPosition(pos.x, pos.y); - train.setSpeed(0.2f); + level.addVehicle(pos.x, pos.y); } }); -- cgit v1.2.3