11#include " Enemy.hpp"
2- #include " Enemy.hpp"
32
43#include < Graphics/ResourceManager.hpp>
54
@@ -18,8 +17,6 @@ static std::map<Enemy::State, std::string> g_stateNames =
1817 {Enemy::State::Hurt, " Hurt" },
1918};
2019
21- Enemy::Enemy () = default;
22-
2320Enemy::Enemy (const glm::vec2& pos,Type _type)
2421 :Entity{ pos }
2522 ,type{ _type }
@@ -200,6 +197,9 @@ void Enemy::update(float deltaTime)
200197 case State::Attack:
201198 doAttack (deltaTime);
202199 break ;
200+ case State::Reposition:
201+ doReposition (deltaTime);
202+ break ;
203203 case State::Hurt:
204204 doHurt (deltaTime);
205205 break ;
@@ -225,6 +225,9 @@ void Enemy::draw(Image& image, const Camera& camera)
225225 case State::Attack:
226226 image.drawSprite (attackAnim, tempTransform);
227227 break ;
228+ case State::Reposition:
229+ image.drawSprite (chaseAnim, tempTransform);
230+ break ;
228231 case State::Hurt:
229232 image.drawSprite (hurtAnim, tempTransform);
230233 break ;
@@ -330,7 +333,7 @@ void Enemy::endState(State oldState)
330333
331334void Enemy::doMovement (float deltaTime)
332335{
333- auto initialPos = transform.getPosition ();
336+ glm::vec2 initialPos = transform.getPosition ();
334337 const auto targetPos = target ? target->getPosition () : initialPos;
335338
336339 auto direction = targetPos - initialPos;
@@ -387,11 +390,21 @@ void Enemy::doChase(float deltaTime)
387390
388391void Enemy::doAttack (float deltaTime)
389392{
390- if (target && glm::distance (transform. getPosition (), target-> getPosition ()) > attackDistance )
393+ if (! target)
391394 {
392- setState (State::Chase );
395+ setState (State::Idle );
393396 }
394- else
397+ glm::vec2 targetPos = target ? target->getPosition () : transform.getPosition ();
398+ float xDifference = std::abs (transform.getPosition ().x - targetPos.x );
399+ float yDifference = std::abs (transform.getPosition ().y - targetPos.y );
400+
401+ // If the target is too close in the x direction and y direction, move away
402+ if (target && xDifference < 5 .f && yDifference < attackDistance)
403+ {
404+ setState (State::Reposition);
405+ }
406+ // If the target is at the right distance, attack
407+ else if (target && glm::distance (transform.getPosition (), targetPos) < attackDistance)
395408 {
396409 attackAnim.update (deltaTime);
397410 if (attackAnim.getCurrentFrame () >= attackFrame)
@@ -402,11 +415,42 @@ void Enemy::doAttack(float deltaTime)
402415 {
403416 attackAnim.reset ();
404417 if (!target)
405- setState (State::Idle);
418+ setState (State::Idle);
406419 }
407420 }
421+ // If the target is too far, chase
422+ else if (target && glm::distance (transform.getPosition (), targetPos) > attackDistance)
423+ {
424+ setState (State::Chase);
425+ }
408426}
409427
428+ void Enemy::doReposition (float deltaTime)
429+ {
430+ if (!target)
431+ {
432+ setState (State::Idle);
433+ }
434+ chaseAnim.update (deltaTime);
435+ glm::vec2 targetPos = target ? target->getPosition () : transform.getPosition ();
436+ float xDifference = std::abs (transform.getPosition ().x - targetPos.x );
437+ float yDifference = std::abs (transform.getPosition ().y - targetPos.y );
438+
439+ // Calculate the reposition point
440+ glm::vec2 repositionPoint = targetPos + glm::vec2 ((targetPos.x < transform.getPosition ().x ) ? attackDistance : -attackDistance, 0 );
441+
442+ // Move towards the reposition point
443+ glm::vec2 direction = glm::normalize (repositionPoint - transform.getPosition ());
444+ transform.translate (direction * speed * deltaTime);
445+
446+ // If the target is at the right distance, go back to attacking
447+ if (glm::distance (transform.getPosition (), targetPos) >= attackDistance)
448+ {
449+ setState (State::Attack);
450+ }
451+ }
452+
453+
410454void Enemy::doHurt (float deltaTime)
411455{
412456 hurtAnim.update (deltaTime);
@@ -434,11 +478,14 @@ void Enemy::doDead(float deltaTime)
434478
435479void Enemy::setFacingDirection (const glm::vec2& direction)
436480{
437- if (direction.x < 0 ) {
438- transform.setScale (glm::vec2 (1 .0f , 1 .0f ));
439- }
440- else if (direction.x > 0 ) {
441- transform.setScale (glm::vec2 (-1 .0f , 1 .0f ));
481+ if (getState () != State::Dead)
482+ {
483+ if (direction.x < 0 ) {
484+ transform.setScale (glm::vec2 (1 .0f , 1 .0f ));
485+ }
486+ else if (direction.x > 0 ) {
487+ transform.setScale (glm::vec2 (-1 .0f , 1 .0f ));
488+ }
442489 }
443490}
444491
0 commit comments