BallMove.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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 "BallMove.h"
  9. #include "Actor.h"
  10. #include "Game.h"
  11. #include "PhysWorld.h"
  12. #include "TargetActor.h"
  13. #include "BallActor.h"
  14. BallMove::BallMove(Actor* owner)
  15. :MoveComponent(owner)
  16. {
  17. }
  18. void BallMove::Update(float deltaTime)
  19. {
  20. // Construct segment in direction of travel
  21. const float segmentLength = 30.0f;
  22. Vector3 start = mOwner->GetPosition();
  23. Vector3 dir = mOwner->GetForward();
  24. Vector3 end = start + dir * segmentLength;
  25. // Create line segment
  26. LineSegment l(start, end);
  27. // Test segment vs world
  28. PhysWorld* phys = mOwner->GetGame()->GetPhysWorld();
  29. PhysWorld::CollisionInfo info;
  30. // (Don't collide vs player)
  31. if (phys->SegmentCast(l, info) && info.mActor != mPlayer)
  32. {
  33. // If we collided, reflect the ball about the normal
  34. dir = Vector3::Reflect(dir, info.mNormal);
  35. mOwner->RotateToNewForward(dir);
  36. // Did we hit a target?
  37. TargetActor* target = dynamic_cast<TargetActor*>(info.mActor);
  38. if (target)
  39. {
  40. static_cast<BallActor*>(mOwner)->HitTarget();
  41. }
  42. }
  43. // Base class update moves based on forward speed
  44. MoveComponent::Update(deltaTime);
  45. }