Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

171 wiersze
3.6 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://sam.zoy.org/projects/COPYING.WTFPL for more details.
  9. //
  10. #if defined HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #include <SDL.h>
  14. #include <cstdio>
  15. #include <cstdlib>
  16. #include <cmath>
  17. #include "core.h"
  18. /*
  19. * Input implementation class
  20. */
  21. static class InputData
  22. {
  23. friend class Input;
  24. public:
  25. InputData()
  26. : mouse(-1),
  27. buttons(0),
  28. nentities(0),
  29. lastfocus(0)
  30. { }
  31. private:
  32. vec2i mouse;
  33. vec3i buttons;
  34. static int const MAX_ENTITIES = 100;
  35. WorldEntity *entities[MAX_ENTITIES];
  36. int nentities;
  37. WorldEntity *lastfocus;
  38. }
  39. inputdata;
  40. static InputData * const data = &inputdata;
  41. /*
  42. * Public Input class
  43. */
  44. vec2 Input::GetAxis(int axis)
  45. {
  46. float invsqrt2 = sqrtf(0.5f);
  47. vec2 f;
  48. /* Simulate a joystick using the keyboard. This SDL call is free. */
  49. Uint8 *keystate = SDL_GetKeyState(NULL);
  50. int left = keystate[SDLK_d] - (keystate[SDLK_a] | keystate[SDLK_q]);
  51. int up = (keystate[SDLK_w] | keystate[SDLK_z]) - keystate[SDLK_s] ;
  52. f.x += left;
  53. f.y += up;
  54. if (left && up)
  55. f = f * invsqrt2;
  56. return f;
  57. }
  58. vec2i Input::GetMousePos()
  59. {
  60. return data->mouse;
  61. }
  62. vec3i Input::GetMouseButtons()
  63. {
  64. return data->buttons;
  65. }
  66. void Input::TrackMouse(WorldEntity *e)
  67. {
  68. if (data->nentities >= InputData::MAX_ENTITIES)
  69. return;
  70. data->entities[data->nentities] = e;
  71. data->nentities++;
  72. }
  73. void Input::UntrackMouse(WorldEntity *e)
  74. {
  75. for (int n = 0; n < data->nentities; n++)
  76. {
  77. if (data->entities[n] != e)
  78. continue;
  79. data->entities[n] = data->entities[data->nentities - 1];
  80. data->nentities--;
  81. n--;
  82. }
  83. }
  84. void Input::SetMousePos(vec2i coord)
  85. {
  86. data->mouse = coord;
  87. WorldEntity *best = NULL;
  88. for (int n = 0; n < data->nentities; n++)
  89. {
  90. if (coord.x < data->entities[n]->bbox[0].x
  91. || coord.x >= data->entities[n]->bbox[1].x
  92. || coord.y < data->entities[n]->bbox[0].y
  93. || coord.y >= data->entities[n]->bbox[1].y)
  94. continue;
  95. if (!best || best->bbox[1].z < data->entities[n]->bbox[1].z)
  96. best = data->entities[n];
  97. }
  98. for (int n = 0; n < data->nentities; n++)
  99. {
  100. if (data->entities[n] == best)
  101. {
  102. data->entities[n]->mousepos = (vec2i)((vec3i)coord - best->bbox[0]);
  103. if (best != data->lastfocus)
  104. data->entities[n]->pressed = data->buttons;
  105. else
  106. data->entities[n]->clicked = 0;
  107. }
  108. else
  109. {
  110. data->entities[n]->mousepos = vec2i(-1);
  111. /* FIXME */
  112. data->entities[n]->released = 0;
  113. data->entities[n]->pressed = 0;
  114. data->entities[n]->clicked = 0;
  115. }
  116. }
  117. data->lastfocus = best;
  118. }
  119. void Input::SetMouseButton(int index)
  120. {
  121. data->buttons[index] = 1;
  122. if (data->lastfocus)
  123. {
  124. if (!data->lastfocus->pressed[index])
  125. data->lastfocus->clicked[index] = 1;
  126. data->lastfocus->pressed[index] = 1;
  127. data->lastfocus->released[index] = 0;
  128. }
  129. }
  130. void Input::UnsetMouseButton(int index)
  131. {
  132. data->buttons[index] = 0;
  133. if (data->lastfocus)
  134. {
  135. if (data->lastfocus->pressed[index])
  136. data->lastfocus->released[index] = 1;
  137. data->lastfocus->pressed[index] = 0;
  138. data->lastfocus->clicked[index] = 0;
  139. }
  140. }