summaryrefslogtreecommitdiff
path: root/src/level.cpp
diff options
context:
space:
mode:
authorcflip <cflip@cflip.net>2022-03-30 21:48:07 -0600
committercflip <cflip@cflip.net>2022-03-30 21:48:07 -0600
commit7803be09b7c0a133b1009408fea2fb1f1474e786 (patch)
tree351120df9e82973dfa5cda0f9945edbdb3936949 /src/level.cpp
parent2b35b393203403704b740f7627af701968c2dfcc (diff)
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
Diffstat (limited to 'src/level.cpp')
-rw-r--r--src/level.cpp15
1 files changed, 9 insertions, 6 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 <algorithm>
+#include <cstring>
#include <fstream>
#include <iostream>
@@ -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<Train>(*this));
+ ptr->setPosition(x, y);
+ ptr->setSpeed(0.2f);
}
void Level::toggleTile(int x, int y)