add basic entity movement

This commit is contained in:
2026-01-01 22:19:55 +01:00
parent 2225151f72
commit 701dd6b120
3 changed files with 70 additions and 3 deletions

View File

@@ -1,7 +1,10 @@
#include <cassert>
#include <td/Maths.h>
#include <td/game/World.h>
#include <td/game/WorldTypes.h>
#include <td/simulation/WorldTicker.h>
#include <td/protocol/packet/PacketSerialize.h>
#include <td/simulation/WorldTicker.h>
namespace td {
namespace game {
@@ -89,5 +92,14 @@ void World::ResetSnapshots(std::shared_ptr<sim::WorldSnapshot>& a_Current, std::
m_NextState = a_Next;
}
TilePtr World::GetTile(std::int32_t x, std::int32_t y) const {
ChunkCoord coords{static_cast<std::int16_t>(x / Chunk::ChunkWidth), static_cast<std::int16_t>(y / Chunk::ChunkHeight)};
auto it = m_Chunks.find(coords);
assert(it != m_Chunks.end());
auto chunk = it->second;
Vec2i inchunkCoords{x % Chunk::ChunkWidth, y % Chunk::ChunkHeight};
return GetTilePtr(chunk->GetTileIndex(inchunkCoords.y * Chunk::ChunkWidth + inchunkCoords.x));
}
} // namespace game
} // namespace td

View File

@@ -1,3 +1,4 @@
#include <td/Types.h>
#include <td/simulation/CommandApply.h>
namespace td {
@@ -6,7 +7,7 @@ namespace sim {
CommandApply::CommandApply(const game::World& a_World, WorldSnapshot& a_Snapshot) : m_World(a_World), m_Snapshot(a_Snapshot) {}
void CommandApply::Handle(const protocol::commands::EndCommand& a_End) {
(void) m_World;
(void)m_World;
}
void CommandApply::Handle(const protocol::commands::PlaceTowerCommand& a_PlaceTower) {
@@ -24,6 +25,10 @@ void CommandApply::Handle(const protocol::commands::PlayerJoinCommand& a_PlayerJ
void CommandApply::Handle(const protocol::commands::SpawnTroopCommand& a_SpawnTroop) {
auto zombie = std::make_shared<game::Zombie>();
zombie->m_Position = a_SpawnTroop->m_Position;
// TODO: make it spawn dependant
zombie->m_Direction = Direction::PositiveY;
m_Snapshot.m_Mobs.push_back(zombie);
}

View File

@@ -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;
}
}