FPSSystem.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "InputManager.h"
  2. #include "MovableCamera.h"
  3. #include "FPSSystem.h"
  4. #include "Vec2.h"
  5. #include "Vec3.h"
  6. #include "Mat3.h"
  7. #include "OS.h"
  8. namespace crown
  9. {
  10. //-----------------------------------------------------------------------
  11. FPSSystem::FPSSystem(MovableCamera* camera) :
  12. m_angle_x(0),
  13. m_angle_y(0),
  14. m_camera(camera),
  15. m_up_pressed(false),
  16. m_right_pressed(false),
  17. m_down_pressed(false),
  18. m_left_pressed(false)
  19. {
  20. get_input_manager()->register_keyboard_listener(this);
  21. get_input_manager()->register_accelerometer_listener(this);
  22. //get_input_manager()->register_mouse_listener(this);
  23. get_input_manager()->set_cursor_relative_xy(Vec2(0.5f, 0.5f));
  24. }
  25. //-----------------------------------------------------------------------
  26. void FPSSystem::key_pressed(const KeyboardEvent& event)
  27. {
  28. switch (event.key)
  29. {
  30. case 'w':
  31. case 'W':
  32. {
  33. m_up_pressed = true;
  34. break;
  35. }
  36. case 'a':
  37. case 'A':
  38. {
  39. m_left_pressed = true;
  40. break;
  41. }
  42. case 's':
  43. case 'S':
  44. {
  45. m_down_pressed = true;
  46. break;
  47. }
  48. case 'd':
  49. case 'D':
  50. {
  51. m_right_pressed = true;
  52. break;
  53. }
  54. default:
  55. {
  56. break;
  57. }
  58. }
  59. }
  60. //-----------------------------------------------------------------------
  61. void FPSSystem::key_released(const KeyboardEvent& event)
  62. {
  63. switch (event.key)
  64. {
  65. case 'w':
  66. {
  67. m_up_pressed = false;
  68. break;
  69. }
  70. case 'a':
  71. {
  72. m_left_pressed = false;
  73. break;
  74. }
  75. case 's':
  76. {
  77. m_down_pressed = false;
  78. break;
  79. }
  80. case 'd':
  81. {
  82. m_right_pressed = false;
  83. break;
  84. }
  85. default:
  86. {
  87. break;
  88. }
  89. }
  90. }
  91. //-----------------------------------------------------------------------
  92. void FPSSystem::accelerometer_changed(const AccelerometerEvent& event)
  93. {
  94. set_view_by_cursor();
  95. }
  96. //-----------------------------------------------------------------------
  97. void FPSSystem::set_camera(MovableCamera* camera)
  98. {
  99. m_camera = camera;
  100. }
  101. //-----------------------------------------------------------------------
  102. MovableCamera* FPSSystem::get_camera()
  103. {
  104. return m_camera;
  105. }
  106. //-----------------------------------------------------------------------
  107. void FPSSystem::camera_render()
  108. {
  109. if (m_up_pressed)
  110. {
  111. m_camera->MoveForward();
  112. }
  113. if (m_left_pressed)
  114. {
  115. m_camera->StrafeLeft();
  116. }
  117. if (m_down_pressed)
  118. {
  119. m_camera->MoveBackward();
  120. }
  121. if (m_right_pressed)
  122. {
  123. m_camera->StrafeRight();
  124. }
  125. m_camera->Render();
  126. }
  127. //-----------------------------------------------------------------------
  128. void FPSSystem::set_view_by_cursor()
  129. {
  130. static Vec2 lastPos = get_input_manager()->get_cursor_relative_xy();
  131. Vec2 currentPos = get_input_manager()->get_cursor_relative_xy();
  132. get_input_manager()->set_cursor_relative_xy(Vec2(0.5f, 0.5f));
  133. if (lastPos == currentPos)
  134. {
  135. return;
  136. }
  137. Vec2 delta = lastPos - currentPos;
  138. get_input_manager()->set_cursor_relative_xy(Vec2(0.5f, 0.5f));
  139. lastPos = get_input_manager()->get_cursor_relative_xy();
  140. m_angle_x += delta.y * m_camera->GetSensibility();
  141. m_angle_y += delta.x * m_camera->GetSensibility();
  142. m_angle_x = math::clamp_to_range(-89.999f * math::DEG_TO_RAD, 89.999f * math::DEG_TO_RAD, m_angle_x);
  143. m_angle_y = math::fmod(m_angle_y, math::TWO_PI);
  144. m_camera->SetRotation(m_angle_x, m_angle_y);
  145. }
  146. } // namespace crown