FollowActor.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 "FollowActor.h"
  9. #include "SkeletalMeshComponent.h"
  10. #include "Game.h"
  11. #include "Renderer.h"
  12. #include "FollowCamera.h"
  13. #include "MoveComponent.h"
  14. #include "MirrorCamera.h"
  15. #include "LevelLoader.h"
  16. FollowActor::FollowActor(Game* game)
  17. :Actor(game)
  18. ,mMoving(false)
  19. {
  20. mMeshComp = new SkeletalMeshComponent(this);
  21. mMeshComp->SetMesh(game->GetRenderer()->GetMesh("Assets/CatWarrior.gpmesh"));
  22. mMeshComp->SetSkeleton(game->GetSkeleton("Assets/CatWarrior.gpskel"));
  23. mMeshComp->PlayAnimation(game->GetAnimation("Assets/CatActionIdle.gpanim"));
  24. SetPosition(Vector3(0.0f, 0.0f, -100.0f));
  25. mMoveComp = new MoveComponent(this);
  26. mCameraComp = new FollowCamera(this);
  27. mCameraComp->SnapToIdeal();
  28. // Add a component for the mirror camera
  29. MirrorCamera* mirror = new MirrorCamera(this);
  30. mirror->SnapToIdeal();
  31. game->SetFollowActor(this);
  32. }
  33. void FollowActor::ActorInput(const uint8_t* keys)
  34. {
  35. float forwardSpeed = 0.0f;
  36. float angularSpeed = 0.0f;
  37. // wasd movement
  38. if (keys[SDL_SCANCODE_W])
  39. {
  40. forwardSpeed += 400.0f;
  41. }
  42. if (keys[SDL_SCANCODE_S])
  43. {
  44. forwardSpeed -= 400.0f;
  45. }
  46. if (keys[SDL_SCANCODE_A])
  47. {
  48. angularSpeed -= Math::Pi;
  49. }
  50. if (keys[SDL_SCANCODE_D])
  51. {
  52. angularSpeed += Math::Pi;
  53. }
  54. // Did we just start moving?
  55. if (!mMoving && !Math::NearZero(forwardSpeed))
  56. {
  57. mMoving = true;
  58. mMeshComp->PlayAnimation(GetGame()->GetAnimation("Assets/CatRunSprint.gpanim"), 1.25f);
  59. }
  60. // Or did we just stop moving?
  61. else if (mMoving && Math::NearZero(forwardSpeed))
  62. {
  63. mMoving = false;
  64. mMeshComp->PlayAnimation(GetGame()->GetAnimation("Assets/CatActionIdle.gpanim"));
  65. }
  66. mMoveComp->SetForwardSpeed(forwardSpeed);
  67. mMoveComp->SetAngularSpeed(angularSpeed);
  68. }
  69. void FollowActor::SetVisible(bool visible)
  70. {
  71. mMeshComp->SetVisible(visible);
  72. }
  73. void FollowActor::LoadProperties(const rapidjson::Value& inObj)
  74. {
  75. Actor::LoadProperties(inObj);
  76. JsonHelper::GetBool(inObj, "moving", mMoving);
  77. }
  78. void FollowActor::SaveProperties(rapidjson::Document::AllocatorType& alloc, rapidjson::Value& inObj) const
  79. {
  80. Actor::SaveProperties(alloc, inObj);
  81. JsonHelper::AddBool(alloc, inObj, "moving", mMoving);
  82. }