Cornell Cocos
Cornell Extensions to Cocos2d
All Classes Functions Variables Enumerations Enumerator Friends
CUKeyboardPoller.h
1 //
2 // CUKeyboardPoller.h
3 // Cornell Extensions to Cocos2D
4 //
5 // This module provides a polling interface for the Keyboard. Cocos2d decided to
6 // make all of its input event-driven. This is a major problem, because it is hard
7 // to associate the events with the current animation frame, potentially causing
8 // lag. A poller is an alternative input interface that allows us to query the
9 // current state of the keyboard when we need it.
10 //
11 // Author: Walker White
12 // Version: 12/5/15
13 //
14 #ifndef __CU_KEYBOARD_POLLER_H__
15 #define __CU_KEYBOARD_POLLER_H__
16 
17 #include <vector>
18 #include <unordered_set>
19 #include <unordered_map>
20 #include <cocos2d.h>
21 
22 NS_CC_BEGIN
23 
28  std::size_t operator()(const EventKeyboard::KeyCode& k) const {
29  return (std::hash<int>()(static_cast<int>(k)));
30  }
31 };
32 
33 
34 #pragma mark -
35 #pragma mark Keyboard Poller
36 
48 class CC_DLL KeyboardPoller {
49 private:
51  CC_DISALLOW_COPY_AND_ASSIGN(KeyboardPoller);
52 
53 protected:
57  EventListenerKeyboard* _keybdListener;
59  bool _active;
60 
62  std::unordered_set<EventKeyboard::KeyCode,KeyCodeHasher> _previous;
64  std::unordered_set<EventKeyboard::KeyCode,KeyCodeHasher> _current;
66  std::unordered_map<EventKeyboard::KeyCode,bool,KeyCodeHasher> _changed;
67 
68 
69 public:
70 #pragma mark Static Methods
71 
79  static void start(int priority);
80 
89  static void start(Node* node);
90 
96  static void stop();
97 
106  static KeyboardPoller* getInstance();
107 
108 
109 #pragma mark Keyboard State
110 
115  bool isActive() const { return _active; }
116 
124  void update();
125 
133  bool keyDown(EventKeyboard::KeyCode code) const {
134  return _current.find(code) != _current.end();
135  }
136 
147  bool keyPressed(EventKeyboard::KeyCode code) const {
148  return _current.find(code) != _current.end() && _previous.find(code) == _previous.end();
149  }
150 
161  bool keyReleased(EventKeyboard::KeyCode code) {
162  return _current.find(code) == _current.end() && _previous.find(code) != _previous.end();
163  }
164 
170  int keyCount() const { return (int)_current.size(); }
171 
180  const std::vector<EventKeyboard::KeyCode> keySet() const;
181 
182 
183 #pragma mark Initializers
184 CC_CONSTRUCTOR_ACCESS:
188  KeyboardPoller();
189 
193  ~KeyboardPoller();
194 
202  void init(int priority);
203 
211  void init(Node* node);
212 
216  void dispose();
217 
218 };
219 
220 NS_CC_END
221 #endif /* defined(__CU_KEYBOARD_POLLER_H__) */
std::unordered_set< EventKeyboard::KeyCode, KeyCodeHasher > _current
Definition: CUKeyboardPoller.h:64
std::unordered_set< EventKeyboard::KeyCode, KeyCodeHasher > _previous
Definition: CUKeyboardPoller.h:62
int keyCount() const
Definition: CUKeyboardPoller.h:170
bool keyDown(EventKeyboard::KeyCode code) const
Definition: CUKeyboardPoller.h:133
EventListenerKeyboard * _keybdListener
Definition: CUKeyboardPoller.h:57
Definition: CUKeyboardPoller.h:48
std::unordered_map< EventKeyboard::KeyCode, bool, KeyCodeHasher > _changed
Definition: CUKeyboardPoller.h:66
bool keyPressed(EventKeyboard::KeyCode code) const
Definition: CUKeyboardPoller.h:147
bool isActive() const
Definition: CUKeyboardPoller.h:115
static KeyboardPoller * _gKeyboard
Definition: CUKeyboardPoller.h:55
bool keyReleased(EventKeyboard::KeyCode code)
Definition: CUKeyboardPoller.h:161
Definition: CUKeyboardPoller.h:27
bool _active
Definition: CUKeyboardPoller.h:59