game_dispatch.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. //
  2. // game_dispatch.cpp
  3. // gameutils
  4. //
  5. // Created by Sam Jaffe on 9/2/16.
  6. //
  7. #include <thread>
  8. #include "game/engine/game_dispatch.hpp"
  9. #include "game/engine/events.hpp"
  10. #include "game/engine/scene.hpp"
  11. namespace engine {
  12. namespace {
  13. event::event_type mask(event::event_type t, bool pressed) {
  14. return static_cast<event::event_type>(
  15. t | (pressed ? event::PRESSED_MASK : event::RELEASED_MASK));
  16. }
  17. }
  18. game_dispatch::game_dispatch()
  19. : screen_size({1920.f, 1080.f}), minimum_frame_duration(engine::fps::v60),
  20. scenes(), current_timestamp(clock::now()), curr_scene() {}
  21. game_dispatch::current_scene_info::current_scene_info() {}
  22. game_dispatch::current_scene_info::current_scene_info(scene * curr)
  23. : ptr(curr), current_scene_id(ptr->id), local_size(ptr->size()) {}
  24. void game_dispatch::process_key_event(raw_key_t key, bool press) {
  25. if (!curr_scene.is_keyboard_event) return;
  26. auto const & binding = curr_scene.ptr->keys();
  27. auto it = binding.find(key);
  28. if (it == binding.end()) return;
  29. curr_scene.ptr->handle_key_event(
  30. {it->second, mask(event::KEY_MASK, press)});
  31. }
  32. void game_dispatch::process_mouse_event(math::vec2 mouse_pos, bool press) {
  33. if (!curr_scene.is_mouse_event) return;
  34. math::vec2 local_scene_position =
  35. mouse_pos * curr_scene.local_size / screen_size;
  36. curr_scene.ptr->handle_mouse_event(
  37. {local_scene_position, mask(event::MOUSE_MASK, press)});
  38. }
  39. tick game_dispatch::get_tick() {
  40. timestamp now = clock::now();
  41. return {now, now - current_timestamp};
  42. }
  43. double game_dispatch::next_frame() {
  44. tick t = get_tick();
  45. while (t.since < minimum_frame_duration) {
  46. std::this_thread::sleep_for(minimum_frame_duration - t.since);
  47. t = get_tick();
  48. }
  49. current_timestamp = t.now;
  50. return std::chrono::duration<double>(t.since).count();
  51. }
  52. void game_dispatch::gameloop() try {
  53. while (running) {
  54. single_frame(next_frame());
  55. }
  56. cleanup_resources();
  57. exit(EXIT_SUCCESS);
  58. } catch (std::exception const & ex) {
  59. // todo: logging
  60. exit(EXIT_FAILURE);
  61. }
  62. void game_dispatch::quit() { running = false; }
  63. }