add basic entity movement
This commit is contained in:
@@ -1,11 +1,61 @@
|
||||
#include <td/Maths.h>
|
||||
#include <td/Types.h>
|
||||
#include <td/game/WorldTypes.h>
|
||||
#include <td/simulation/system/EntityMove.h>
|
||||
|
||||
#include <td/game/World.h>
|
||||
|
||||
namespace td {
|
||||
namespace sim {
|
||||
|
||||
static Vec2i GetUnitDirection(Direction a_Direction) {
|
||||
switch (a_Direction) {
|
||||
case Direction::PositiveX:
|
||||
return {1, 0};
|
||||
case Direction::NegativeX:
|
||||
return {-1, 0};
|
||||
case Direction::PositiveY:
|
||||
return {0, 1};
|
||||
case Direction::NegativeY:
|
||||
return {0, -1};
|
||||
}
|
||||
return {0, 0};
|
||||
}
|
||||
|
||||
class DirectionTileVisitor : public game::TileHandler {
|
||||
private:
|
||||
Direction m_Direction;
|
||||
|
||||
public:
|
||||
DirectionTileVisitor() {}
|
||||
|
||||
virtual void Handle(const game::EmptyTile& a_Tile) override {}
|
||||
|
||||
virtual void Handle(const game::TowerTile& a_Tile) override {}
|
||||
|
||||
virtual void Handle(const game::DecorationTile& a_Tile) override {}
|
||||
|
||||
virtual void Handle(const game::WalkableTile& a_Tile) override {
|
||||
m_Direction = a_Tile->m_Direction;
|
||||
}
|
||||
|
||||
const Direction GetDirection() {
|
||||
return m_Direction;
|
||||
}
|
||||
};
|
||||
|
||||
void EntityMove::Tick(const game::World& a_World, WorldSnapshot& a_State, FpFloat a_Delta) {
|
||||
for (auto& mob : a_State.m_Mobs) {
|
||||
mob->m_Position.x += a_Delta;
|
||||
auto tile = a_World.GetTile(static_cast<std::int32_t>(mob->m_Position.x), static_cast<std::int32_t>(mob->m_Position.y));
|
||||
Direction direction = mob->m_Direction;
|
||||
if (tile) {
|
||||
DirectionTileVisitor visitor;
|
||||
tile->Dispatch(visitor);
|
||||
direction = visitor.GetDirection();
|
||||
}
|
||||
auto directVector = GetUnitDirection(direction);
|
||||
mob->m_Position.x += directVector.x * a_Delta;
|
||||
mob->m_Position.y += directVector.y * a_Delta;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user