NavComponent.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // ----------------------------------------------------------------
  2. // From Game Programming in C++ by Sanjay Madhav
  3. // Copyright (C) 2017 Sanjay Madhav. All rights reserved.
  4. //
  5. // Released under the BSD License
  6. // See LICENSE in root directory for full details.
  7. // ----------------------------------------------------------------
  8. #include "NavComponent.h"
  9. #include "Tile.h"
  10. NavComponent::NavComponent(class Actor* owner, int updateOrder)
  11. :MoveComponent(owner, updateOrder)
  12. ,mNextNode(nullptr)
  13. {
  14. }
  15. void NavComponent::Update(float deltaTime)
  16. {
  17. if (mNextNode)
  18. {
  19. // If we're at the next node, advance along path
  20. Vector2 diff = mOwner->GetPosition() - mNextNode->GetPosition();
  21. if (Math::NearZero(diff.Length(), 2.0f))
  22. {
  23. mNextNode = mNextNode->GetParent();
  24. TurnTo(mNextNode->GetPosition());
  25. }
  26. }
  27. MoveComponent::Update(deltaTime);
  28. }
  29. void NavComponent::StartPath(const Tile* start)
  30. {
  31. mNextNode = start->GetParent();
  32. TurnTo(mNextNode->GetPosition());
  33. }
  34. void NavComponent::TurnTo(const Vector2& pos)
  35. {
  36. // Vector from me to pos
  37. Vector2 dir = pos - mOwner->GetPosition();
  38. // New angle is just atan2 of this dir vector
  39. // (Negate y because +y is down on screen)
  40. float angle = Math::Atan2(-dir.y, dir.x);
  41. mOwner->SetRotation(angle);
  42. }