feat: add better mob pathing
This commit is contained in:
@@ -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) {
|
||||
for (MobPtr mob : m_Mobs) {
|
||||
TilePtr tile = getTile(mob->getCenter().getX(), mob->getCenter().getY());
|
||||
|
||||
if (tile != nullptr && tile->getType() == TileType::Walk) {
|
||||
WalkableTile* walkTile = dynamic_cast<WalkableTile*>(tile.get());
|
||||
mob->setDirection(walkTile->direction);
|
||||
WalkableTilePtr walkTile = std::static_pointer_cast<WalkableTile>(tile);
|
||||
changeMobDirection(mob, walkTile);
|
||||
}
|
||||
|
||||
if (mob->hasReachedEnemyCastle()) continue;
|
||||
|
||||
Reference in New Issue
Block a user