feat: add better mob pathing
This commit is contained in:
@@ -195,6 +195,7 @@ private:
|
|||||||
void moveMobs(std::uint64_t delta);
|
void moveMobs(std::uint64_t delta);
|
||||||
void moveMob(MobPtr mob, std::uint64_t delta);
|
void moveMob(MobPtr mob, std::uint64_t delta);
|
||||||
void moveBackMob(MobPtr mob, const TeamCastle& castle);
|
void moveBackMob(MobPtr mob, const TeamCastle& castle);
|
||||||
|
void changeMobDirection(MobPtr mob, WalkableTilePtr tile);
|
||||||
bool isMobTouchingCastle(MobPtr mob, const TeamCastle& castle) const;
|
bool isMobTouchingCastle(MobPtr mob, const TeamCastle& castle) const;
|
||||||
void tickMobs(std::uint64_t delta);
|
void tickMobs(std::uint64_t delta);
|
||||||
void cleanDeadMobs();
|
void cleanDeadMobs();
|
||||||
|
|||||||
@@ -128,13 +128,84 @@ void World::tickMobs(std::uint64_t delta) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void World::changeMobDirection(MobPtr mob, WalkableTilePtr tile) {
|
||||||
|
if (mob->getDirection() == tile->direction) return;
|
||||||
|
|
||||||
|
float tileX = static_cast<float>(static_cast<std::int32_t>(mob->getCenterX()));
|
||||||
|
float tileY = static_cast<float>(static_cast<std::int32_t>(mob->getCenterY()));
|
||||||
|
|
||||||
|
switch (mob->getDirection()) {
|
||||||
|
|
||||||
|
case Direction::PositiveY: {
|
||||||
|
if (tile->direction == Direction::NegativeX) {
|
||||||
|
if (mob->getTileY() > mob->getTileX()) {
|
||||||
|
mob->setCenterY(tileY + mob->getTileX());
|
||||||
|
mob->setDirection(tile->direction);
|
||||||
|
}
|
||||||
|
} else { // tile->direction = Direction::PositiveX
|
||||||
|
if (mob->getTileY() > 1 - mob->getTileX()) {
|
||||||
|
mob->setCenterY(tileY + (1 - mob->getTileX()));
|
||||||
|
mob->setDirection(tile->direction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case Direction::NegativeY: {
|
||||||
|
if (tile->direction == Direction::PositiveX) {
|
||||||
|
if (mob->getTileY() < mob->getTileX()) {
|
||||||
|
mob->setCenterY(tileY + mob->getTileX());
|
||||||
|
mob->setDirection(tile->direction);
|
||||||
|
}
|
||||||
|
} else { // tile->direction = Direction::NegativeX
|
||||||
|
if (mob->getTileY() < 1 - mob->getTileX()) {
|
||||||
|
mob->setCenterY(tileY + (1 - mob->getTileX()));
|
||||||
|
mob->setDirection(tile->direction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case Direction::PositiveX: {
|
||||||
|
if (tile->direction == Direction::NegativeY) {
|
||||||
|
if (mob->getTileX() > mob->getTileY()) {
|
||||||
|
mob->setCenterX(tileX + mob->getTileY());
|
||||||
|
mob->setDirection(tile->direction);
|
||||||
|
}
|
||||||
|
} else { // tile->direction = Direction::PositiveY
|
||||||
|
if (mob->getTileX() > 1 - mob->getTileY()) {
|
||||||
|
mob->setCenterX(tileX + (1 - mob->getTileY()));
|
||||||
|
mob->setDirection(tile->direction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case Direction::NegativeX: {
|
||||||
|
if (tile->direction == Direction::PositiveY) {
|
||||||
|
if (mob->getTileX() < mob->getTileY()) {
|
||||||
|
mob->setCenterX(tileX + mob->getTileY());
|
||||||
|
mob->setDirection(tile->direction);
|
||||||
|
}
|
||||||
|
} else { // tile->direction = Direction::NegativeY
|
||||||
|
if (mob->getTileX() < 1 - mob->getTileY()) {
|
||||||
|
mob->setCenterX(tileX + (1 - mob->getTileY()));
|
||||||
|
mob->setDirection(tile->direction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void World::moveMobs(std::uint64_t delta) {
|
void World::moveMobs(std::uint64_t delta) {
|
||||||
for (MobPtr mob : m_Mobs) {
|
for (MobPtr mob : m_Mobs) {
|
||||||
TilePtr tile = getTile(mob->getCenter().getX(), mob->getCenter().getY());
|
TilePtr tile = getTile(mob->getCenter().getX(), mob->getCenter().getY());
|
||||||
|
|
||||||
if (tile != nullptr && tile->getType() == TileType::Walk) {
|
if (tile != nullptr && tile->getType() == TileType::Walk) {
|
||||||
WalkableTile* walkTile = dynamic_cast<WalkableTile*>(tile.get());
|
WalkableTilePtr walkTile = std::static_pointer_cast<WalkableTile>(tile);
|
||||||
mob->setDirection(walkTile->direction);
|
changeMobDirection(mob, walkTile);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mob->hasReachedEnemyCastle()) continue;
|
if (mob->hasReachedEnemyCastle()) continue;
|
||||||
|
|||||||
Reference in New Issue
Block a user