keystate.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package application
  2. import (
  3. "github.com/g3n/engine/window"
  4. )
  5. // KeyState keeps track of the state of all keys.
  6. type KeyState struct {
  7. win window.IWindow
  8. states map[window.Key]bool
  9. }
  10. // NewKeyState returns a new KeyState object.
  11. func NewKeyState(win window.IWindow) *KeyState {
  12. ks := new(KeyState)
  13. ks.win = win
  14. ks.states = map[window.Key]bool{
  15. window.KeyUnknown : false,
  16. window.KeySpace : false,
  17. window.KeyApostrophe : false,
  18. window.KeyComma : false,
  19. window.KeyMinus : false,
  20. window.KeyPeriod : false,
  21. window.KeySlash : false,
  22. window.Key0 : false,
  23. window.Key1 : false,
  24. window.Key2 : false,
  25. window.Key3 : false,
  26. window.Key4 : false,
  27. window.Key5 : false,
  28. window.Key6 : false,
  29. window.Key7 : false,
  30. window.Key8 : false,
  31. window.Key9 : false,
  32. window.KeySemicolon : false,
  33. window.KeyEqual : false,
  34. window.KeyA : false,
  35. window.KeyB : false,
  36. window.KeyC : false,
  37. window.KeyD : false,
  38. window.KeyE : false,
  39. window.KeyF : false,
  40. window.KeyG : false,
  41. window.KeyH : false,
  42. window.KeyI : false,
  43. window.KeyJ : false,
  44. window.KeyK : false,
  45. window.KeyL : false,
  46. window.KeyM : false,
  47. window.KeyN : false,
  48. window.KeyO : false,
  49. window.KeyP : false,
  50. window.KeyQ : false,
  51. window.KeyR : false,
  52. window.KeyS : false,
  53. window.KeyT : false,
  54. window.KeyU : false,
  55. window.KeyV : false,
  56. window.KeyW : false,
  57. window.KeyX : false,
  58. window.KeyY : false,
  59. window.KeyZ : false,
  60. window.KeyLeftBracket : false,
  61. window.KeyBackslash : false,
  62. window.KeyRightBracket : false,
  63. window.KeyGraveAccent : false,
  64. window.KeyWorld1 : false,
  65. window.KeyWorld2 : false,
  66. window.KeyEscape : false,
  67. window.KeyEnter : false,
  68. window.KeyTab : false,
  69. window.KeyBackspace : false,
  70. window.KeyInsert : false,
  71. window.KeyDelete : false,
  72. window.KeyRight : false,
  73. window.KeyLeft : false,
  74. window.KeyDown : false,
  75. window.KeyUp : false,
  76. window.KeyPageUp : false,
  77. window.KeyPageDown : false,
  78. window.KeyHome : false,
  79. window.KeyEnd : false,
  80. window.KeyCapsLock : false,
  81. window.KeyScrollLock : false,
  82. window.KeyNumLock : false,
  83. window.KeyPrintScreen : false,
  84. window.KeyPause : false,
  85. window.KeyF1 : false,
  86. window.KeyF2 : false,
  87. window.KeyF3 : false,
  88. window.KeyF4 : false,
  89. window.KeyF5 : false,
  90. window.KeyF6 : false,
  91. window.KeyF7 : false,
  92. window.KeyF8 : false,
  93. window.KeyF9 : false,
  94. window.KeyF10 : false,
  95. window.KeyF11 : false,
  96. window.KeyF12 : false,
  97. window.KeyF13 : false,
  98. window.KeyF14 : false,
  99. window.KeyF15 : false,
  100. window.KeyF16 : false,
  101. window.KeyF17 : false,
  102. window.KeyF18 : false,
  103. window.KeyF19 : false,
  104. window.KeyF20 : false,
  105. window.KeyF21 : false,
  106. window.KeyF22 : false,
  107. window.KeyF23 : false,
  108. window.KeyF24 : false,
  109. window.KeyF25 : false,
  110. window.KeyKP0 : false,
  111. window.KeyKP1 : false,
  112. window.KeyKP2 : false,
  113. window.KeyKP3 : false,
  114. window.KeyKP4 : false,
  115. window.KeyKP5 : false,
  116. window.KeyKP6 : false,
  117. window.KeyKP7 : false,
  118. window.KeyKP8 : false,
  119. window.KeyKP9 : false,
  120. window.KeyKPDecimal : false,
  121. window.KeyKPDivide : false,
  122. window.KeyKPMultiply : false,
  123. window.KeyKPSubtract : false,
  124. window.KeyKPAdd : false,
  125. window.KeyKPEnter : false,
  126. window.KeyKPEqual : false,
  127. window.KeyLeftShift : false,
  128. window.KeyLeftControl : false,
  129. window.KeyLeftAlt : false,
  130. window.KeyLeftSuper : false,
  131. window.KeyRightShift : false,
  132. window.KeyRightControl : false,
  133. window.KeyRightAlt : false,
  134. window.KeyRightSuper : false,
  135. window.KeyMenu : false,
  136. }
  137. // Subscribe to window key events
  138. ks.win.SubscribeID(window.OnKeyUp, &ks, ks.onKey)
  139. ks.win.SubscribeID(window.OnKeyDown, &ks, ks.onKey)
  140. return ks
  141. }
  142. // Dispose unsubscribes from the window events.
  143. func (ks *KeyState) Dispose() {
  144. ks.win.UnsubscribeID(window.OnKeyUp, &ks)
  145. ks.win.UnsubscribeID(window.OnKeyDown, &ks)
  146. }
  147. // Pressed returns whether the specified key is currently pressed.
  148. func (ks *KeyState) Pressed(k window.Key) bool {
  149. return ks.states[k]
  150. }
  151. // onKey receives key events and updates the internal map of states.
  152. func (ks *KeyState) onKey(evname string, ev interface{}) {
  153. kev := ev.(*window.KeyEvent)
  154. switch evname {
  155. case window.OnKeyUp:
  156. ks.states[kev.Keycode] = false
  157. case window.OnKeyDown:
  158. ks.states[kev.Keycode] = true
  159. }
  160. }