Here is how I handle keyboard onkeyHold in cocos2dx, if someone has a better method please share it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#ifndef GLOBALS_H_ #define GLOBALS_H_ #include "cocos2d.h" using namespace cocos2d; // KEYBOARD const EventKeyboard::KeyCode ENTER = EventKeyboard::KeyCode::KEY_KP_ENTER; const EventKeyboard::KeyCode UP_ARROW = EventKeyboard::KeyCode::KEY_UP_ARROW; const EventKeyboard::KeyCode DOWN_ARROW = EventKeyboard::KeyCode::KEY_DOWN_ARROW; const EventKeyboard::KeyCode LEFT_ARROW = EventKeyboard::KeyCode::KEY_LEFT_ARROW; const EventKeyboard::KeyCode RIGHT_ARROW = EventKeyboard::KeyCode::KEY_RIGHT_ARROW; #endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#ifndef GAMESCENE_H_ #define GAMESCENE_H_ #include "cocos2d.h" #include "globals.h" #include <algorithm> #include <vector> #include <string> using namespace std; using namespace cocos2d; class GameScene : public Layer{ public: vector<EventKeyboard::KeyCode> heldKeys; void onKeyHold(float interval); virtual void onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event); virtual void onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event); bool init(); static Scene * createScene(); CREATE_FUNC(GameScene); GameScene(); virtual ~GameScene(); }; #endif /* GAMESCENE_H_ */ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#include "GameScene.h" Scene * GameScene::createScene(){ Scene * scene = Scene::create(); auto layer = GameScene::create(); scene->addChild(layer); return scene; } bool GameScene::init(){ if(!Layer::init()){ return false; } this->schedule(schedule_selector(GameScene::onKeyHold)); return true; } void GameScene::onKeyHold(float interval){ if(std::find(heldKeys.begin(), heldKeys.end(), UP_ARROW) != heldKeys.end()){ // up pressed } if(std::find(heldKeys.begin(), heldKeys.end(), DOWN_ARROW) != heldKeys.end()){ // down pressed } if(std::find(heldKeys.begin(), heldKeys.end(), RIGHT_ARROW) != heldKeys.end()){ // right pressed } if(std::find(heldKeys.begin(), heldKeys.end(), LEFT_ARROW) != heldKeys.end()){ // left pressed } } void GameScene::onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event) { if(std::find(heldKeys.begin(), heldKeys.end(), keyCode) == heldKeys.end()){ heldKeys.push_back(keyCode); } } void GameScene::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event) { heldKeys.erase(std::remove(heldKeys.begin(), heldKeys.end(), keyCode), heldKeys.end()); } GameScene::GameScene() { setKeyboardEnabled(true); } GameScene::~GameScene() { } |