2014年6月12日木曜日

cocos2d-x v3.1、Macでキー入力を試す

cocos2d-xのMac用プロジェクトで、キー入力を試してみました。
スマホのバーチャルキーボードが出るやつじゃなくて、ゲームとかでよく使う、特定のキーが押されたかを検知する方です!

以下の環境で試しました。
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 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...