add basic entity movement
This commit is contained in:
@@ -1,7 +1,10 @@
|
|||||||
|
#include <cassert>
|
||||||
|
#include <td/Maths.h>
|
||||||
#include <td/game/World.h>
|
#include <td/game/World.h>
|
||||||
|
#include <td/game/WorldTypes.h>
|
||||||
|
|
||||||
#include <td/simulation/WorldTicker.h>
|
|
||||||
#include <td/protocol/packet/PacketSerialize.h>
|
#include <td/protocol/packet/PacketSerialize.h>
|
||||||
|
#include <td/simulation/WorldTicker.h>
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
namespace game {
|
namespace game {
|
||||||
@@ -89,5 +92,14 @@ void World::ResetSnapshots(std::shared_ptr<sim::WorldSnapshot>& a_Current, std::
|
|||||||
m_NextState = a_Next;
|
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 game
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include <td/Types.h>
|
||||||
#include <td/simulation/CommandApply.h>
|
#include <td/simulation/CommandApply.h>
|
||||||
|
|
||||||
namespace td {
|
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) {}
|
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 CommandApply::Handle(const protocol::commands::EndCommand& a_End) {
|
||||||
(void) m_World;
|
(void)m_World;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommandApply::Handle(const protocol::commands::PlaceTowerCommand& a_PlaceTower) {
|
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) {
|
void CommandApply::Handle(const protocol::commands::SpawnTroopCommand& a_SpawnTroop) {
|
||||||
auto zombie = std::make_shared<game::Zombie>();
|
auto zombie = std::make_shared<game::Zombie>();
|
||||||
zombie->m_Position = a_SpawnTroop->m_Position;
|
zombie->m_Position = a_SpawnTroop->m_Position;
|
||||||
|
|
||||||
|
// TODO: make it spawn dependant
|
||||||
|
zombie->m_Direction = Direction::PositiveY;
|
||||||
|
|
||||||
m_Snapshot.m_Mobs.push_back(zombie);
|
m_Snapshot.m_Mobs.push_back(zombie);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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/simulation/system/EntityMove.h>
|
||||||
|
|
||||||
|
#include <td/game/World.h>
|
||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
namespace sim {
|
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) {
|
void EntityMove::Tick(const game::World& a_World, WorldSnapshot& a_State, FpFloat a_Delta) {
|
||||||
for (auto& mob : a_State.m_Mobs) {
|
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