PlayerMove.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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.txt for full details.
  7. // ----------------------------------------------------------------
  8. #include "PlayerMove.h"
  9. #include "Actor.h"
  10. #include "Game.h"
  11. #include "PhysWorld.h"
  12. PlayerMove::PlayerMove(Actor* owner)
  13. :MoveComponent(owner)
  14. {
  15. }
  16. void PlayerMove::Update(float deltaTime)
  17. {
  18. const float zOffset = 50.0f;
  19. const float segmentLength = 100.0f;
  20. PhysWorld* phys = mOwner->GetGame()->GetPhysWorld();
  21. // Test whether forward/strafe movement are valid
  22. // Start point is player position +z offset
  23. Vector3 start = mOwner->GetPosition();
  24. start.z += zOffset;
  25. // For forward/back
  26. if (!Math::NearZero(mForwardSpeed))
  27. {
  28. // End point is in direction of forward/backward vector
  29. Vector3 dir = mOwner->GetForward();
  30. if (mForwardSpeed < 0.0f)
  31. {
  32. dir *= -1.0f;
  33. }
  34. Vector3 end = start + dir * segmentLength;
  35. // Create line segment
  36. LineSegment l(start, end);
  37. // Test segment vs world
  38. PhysWorld::CollisionInfo info;
  39. if (phys->SegmentCast(l, info))
  40. {
  41. // If we collided, don't allow movement
  42. mForwardSpeed = 0.0f;
  43. }
  44. }
  45. // For strafing
  46. if (!Math::NearZero(mStrafeSpeed))
  47. {
  48. // End point is in direction of right/left vector
  49. Vector3 dir = mOwner->GetRight();
  50. if (mStrafeSpeed < 0.0f)
  51. {
  52. dir *= -1.0f;
  53. }
  54. Vector3 end = start + dir * segmentLength;
  55. // Create line segment
  56. LineSegment l(start, end);
  57. // Test segment vs world
  58. PhysWorld::CollisionInfo info;
  59. if (phys->SegmentCast(l, info))
  60. {
  61. // If we collided, don't allow movement
  62. mStrafeSpeed = 0.0f;
  63. }
  64. }
  65. // Now update move component based on modified speeds
  66. MoveComponent::Update(deltaTime);
  67. }