diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-03-06 18:53:22 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-03-06 18:53:22 +0000 |
commit | acd16970bc93712e7c8c3996816242a04999818b (patch) | |
tree | 24dbc35c1fde12a3d429539bf24605b738f4bef9 /game/vehicles/railloco.h | |
parent | Give collection a virtual desctructor (diff) | |
download | ilt-acd16970bc93712e7c8c3996816242a04999818b.tar.bz2 ilt-acd16970bc93712e7c8c3996816242a04999818b.tar.xz ilt-acd16970bc93712e7c8c3996816242a04999818b.zip |
Introduce the Train concept as a literal collection of rail vehicles
Diffstat (limited to 'game/vehicles/railloco.h')
-rw-r--r-- | game/vehicles/railloco.h | 51 |
1 files changed, 21 insertions, 30 deletions
diff --git a/game/vehicles/railloco.h b/game/vehicles/railloco.h index 1bc0a51..0f240e2 100644 --- a/game/vehicles/railloco.h +++ b/game/vehicles/railloco.h @@ -2,7 +2,9 @@ #include "game/vehicles/vehicle.h" #include "game/worldobject.h" #include "gfx/models/mesh.h" +#include "gfx/renderable.h" #include <array> +#include <collection.hpp> #include <location.hpp> #include <memory> #include <string> @@ -32,47 +34,36 @@ private: }; using RailVehicleClassPtr = std::shared_ptr<RailVehicleClass>; -class RailVehicle : public Vehicle { +class Train; +class RailVehicle : public Renderable { public: - explicit RailVehicle(RailVehicleClassPtr rvc, const LinkPtr & link, float linkDist = 0) : - Vehicle {link, linkDist}, rvClass {std::move(rvc)} - { - } + explicit RailVehicle(RailVehicleClassPtr rvc) : rvClass {std::move(rvc)} { } + + void move(const Train *, float & trailBy); + void render(const Shader & shader) const override; + Location location; + RailVehicleClassPtr rvClass; std::array<Location, 2> bogies; - - friend class RailLoco; }; +using RailVehiclePtr = std::unique_ptr<RailVehicle>; -class RailWagon : public RailVehicle { +class Train : public Vehicle, public Collection<RailVehicle, false> { public: - using RailVehicle::RailVehicle; - void tick(TickDuration elapsed) override; -}; -using RailWagonPtr = std::weak_ptr<RailWagon>; + explicit Train(const LinkPtr & link, float linkDist = 0) : Vehicle {link, linkDist} { } -class RailLoco : public RailVehicle { -public: - using RailVehicle::RailVehicle; - void tick(TickDuration elapsed) override; + [[nodiscard]] const Location & + getLocation() const override + { + return objects.front()->location; + } - std::vector<RailWagonPtr> wagons; + void render(const Shader & shader) const override; + + void tick(TickDuration elapsed) override; -private: void move(TickDuration dur); [[nodiscard]] Location getBogiePosition(float linkDist, float dist) const; - void updateRailVehiclePosition(RailVehicle *, float trailBy) const; - void updateWagons() const; -}; - -class Brush47 : public RailLoco { -public: - explicit Brush47(const LinkPtr & p); -}; - -class Brush47Wagon : public RailWagon { -public: - explicit Brush47Wagon(const LinkPtr & p); }; |