スマホのバーチャルキーボードが出るやつじゃなくて、ゲームとかでよく使う、特定のキーが押されたかを検知する方です!
以下の環境で試しました。
Mac OS X 10.8.5
cocos2d-x v3.1.1
まず、Layerのサブクラスを作ります。そのinit()メソッドの中で、キーボードイベントの設定を行います。
bool ALayer::init() { // その他の設定 : // キー入力設定 auto listener = EventListenerKeyboard::create(); listener->onKeyPressed = CC_CALLBACK_2(ALayer::onKeyPressed, this); listener->onKeyReleased = CC_CALLBACK_2(ALayer::onKeyReleased, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); return true; } void ALayer::onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event) { CCLOG("Key with keycode %d pressed", keyCode); } void ALayer::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event) { CCLOG("Key with keycode %d released", keyCode); }EventListenerKeyboardをインスタンス化して、キーボードのキーが押された時と、離された時のメソッドを指定します。
そして、インスタンス化したリスナーを、LayerのeventDispatcherに登録します。
CC_CALLBACK_2マクロは、以下のように定義されていました。ふむふむ、std::bindが使われてるわけですな。(えらそう)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)余談ですが、std::bindについては、以下の解説が分かりやすかったです。
コールバックメソッドのonKeyPressed、onKeyReleasedは、ベースクラスのLayerにvirtual宣言されていました。
CC_CALLBACK_2でメソッドを指定するので、特にonKeyPressed、onKeyReleasedを使用する必要はないと思いますが、とりあえずこちらを使いました。
あとは通常通り、このレイヤーを生成・表示してやればOKです。
さて、ゲームのキー入力といえばWASDキーです!
が、実際に試してみると、個別にW・A・S・Dキーを押す時には良いのですが、全て同時に押すと、押されたと判定できないキーがありました。ん〜、残念〜。
多分、ハード(もしくはドライバー)による制限なのだろうと思います。
キーの組み合わせによっては、押したままなのに「離された」と判定されたりします。この辺りは注意したいところですね。
0 件のコメント:
コメントを投稿