FpsCharacter.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/AnKi.h>
  6. using namespace anki;
  7. class FpsCharacter : public SceneNode
  8. {
  9. public:
  10. F32 m_mouseLookPower = toRad(7.0f);
  11. F32 m_walkingSpeed = 8.5f;
  12. F32 m_jumpSpeed = 8.0f;
  13. Bool m_crouching = false;
  14. FpsCharacter()
  15. : SceneNode("FpsCharacter")
  16. {
  17. PlayerControllerComponent* playerc = newComponent<PlayerControllerComponent>();
  18. SceneNode* cam = SceneGraph::getSingleton().newSceneNode<SceneNode>("FpsCharacterCam");
  19. cam->setLocalTransform(Transform(Vec3(0.0f, 2.0f, 0.0f), Mat3::getIdentity(), Vec3(1.0f)));
  20. addChild(cam);
  21. SceneNode* shotgun = SceneGraph::getSingleton().newSceneNode<SceneNode>("Shotgun");
  22. shotgun->setLocalTransform(Transform(Vec3(0.065f, -0.13f, -0.4f), Mat3(Euler(0.0f, kPi, 0.0f)), Vec3(1.0f)));
  23. ModelComponent* modelc = shotgun->newComponent<ModelComponent>();
  24. modelc->loadModelResource("sleevegloveLOW.001_arms_boomstick_76e1c49d9efa9619.ankimdl");
  25. cam->addChild(shotgun);
  26. }
  27. void frameUpdate([[maybe_unused]] Second prevUpdateTime, [[maybe_unused]] Second crntTime) override
  28. {
  29. PlayerControllerComponent& playerc = getFirstComponentOfType<PlayerControllerComponent>();
  30. // Rotate
  31. F32 y = Input::getSingleton().getMousePosition().y();
  32. F32 x = Input::getSingleton().getMousePosition().x();
  33. if(y != 0.0 || x != 0.0)
  34. {
  35. // Set rotation
  36. Mat3 rot(Euler(m_mouseLookPower * y, m_mouseLookPower * x, 0.0f));
  37. rot = getLocalRotation() * rot;
  38. const Vec3 newz = rot.getColumn(2).normalize();
  39. const Vec3 newx = Vec3(0.0, 1.0, 0.0).cross(newz);
  40. const Vec3 newy = newz.cross(newx);
  41. rot.setColumns(newx, newy, newz);
  42. rot = rot.reorthogonalize();
  43. // Update move
  44. setLocalRotation(rot);
  45. }
  46. Vec3 moveVec(0.0);
  47. if(Input::getSingleton().getKey(KeyCode::kW))
  48. {
  49. moveVec.z() += 1.0f;
  50. }
  51. if(Input::getSingleton().getKey(KeyCode::kA))
  52. {
  53. moveVec.x() += 1.0f;
  54. }
  55. if(Input::getSingleton().getKey(KeyCode::kS))
  56. {
  57. moveVec.z() -= 1.0f;
  58. }
  59. if(Input::getSingleton().getKey(KeyCode::kD))
  60. {
  61. moveVec.x() -= 1.0f;
  62. }
  63. F32 jumpSpeed = 0.0f;
  64. if(Input::getSingleton().getKey(KeyCode::kSpace))
  65. {
  66. jumpSpeed += m_jumpSpeed;
  67. }
  68. Bool crouchChanged = false;
  69. if(Input::getSingleton().getKey(KeyCode::kC))
  70. {
  71. m_crouching = !m_crouching;
  72. crouchChanged = true;
  73. }
  74. if(moveVec != 0.0f || jumpSpeed != 0.0f || crouchChanged)
  75. {
  76. Vec3 dir;
  77. if(moveVec != 0.0f)
  78. {
  79. dir = -(getLocalRotation() * moveVec);
  80. dir.y() = 0.0f;
  81. dir = dir.normalize();
  82. }
  83. F32 speed = m_walkingSpeed;
  84. if(Input::getSingleton().getKey(KeyCode::kLeftShift))
  85. {
  86. speed *= 2.0f;
  87. }
  88. playerc.setVelocity(speed, jumpSpeed, dir, m_crouching);
  89. }
  90. }
  91. };