スマホのバーチャルキーボードが出るやつじゃなくて、ゲームとかでよく使う、特定のキーが押されたかを検知する方です!
以下の環境で試しました。
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 件のコメント:
コメントを投稿