日記
cocos2d-x v3.0betaでマウスイベントを取得する
今回はマウスイベントについてです。
v3.0ではエンジン側をいじることなく、普通に取得できます。(2.xでは試してないけど、無理だよね?)
とりあえず、ソースコードどーん。
//画面の拡大率 #define EGL_SCALE cocos2d::Director::getInstance()->getOpenGLView()->getScaleX() bool HelloWorldScene::init(){ if ( !Layer::init() ) return false; //カーソルのスプライト auto cursor = Sprite::create("cursor.png"); this->addChild(cursor); //マウスイベント設定 auto mouseListener = EventListenerMouse::create(); mouseListener->onMouseMove = [=](Event* event){ auto mouse = (EventMouse*)event; cursor->setPosition(Point(mouse->getCursorX(), mouse->getCursorY()) / EGL_SCALE); }; _eventDispatcher->addEventListenerWithSceneGraphPriority(mouseListener, this); return true; }
これで、マウスの位置に画像が表示されます。
auto cursor = Sprite::create("cursor.png"); this->addChild(cursor);
カーソルの画像からスプライトを生成して、レイヤーにaddします。ここはとくに説明する必要はないですよね?
auto mouseListener = EventListenerMouse::create();
EventListenerMouseを生成します。cocos2d-x v3.0からはC++11なので、auto型が使えます。
auto型っていうのは、コンパイル時に型を推測して変換されるものです。
C++0xのautoキーワードによる型推論 – ぬいぐるみライフ(仮)
↑に色々と詳しいことが書いてます。
mouseListener->onMouseMove = [=](Event* event){ auto mouse = (EventMouse*)event; cursor->setPosition(Point(mouse->getCursorX(), mouse->getCursorY()) / EGL_SCALE); };
「onMouseMove」に関数を代入します。C++11なので、ラムダ式使えます。
C++0x ラムダ式 – Faith and Brave – C++で遊ぼう
ラムダ式については↑とか参考にしました。
「onMouseMove」はマウスが動いた時に呼ばれます。文字通りですね。
マウスの座標などの情報はEvent*型で渡されるのですが、マウス関連の情報はEventMouse*型にあるので、キャストします。
そしたら、getCursorX()、getCursorY()で座標を取り出せます。ただし、これは画面上での座標であって、OpenGLで描画される空間での座標ではありません。
描画サイズを全く弄ってないなら、このままでも問題ないのですが、全画面とか対応するときに困ります。
描画サイズを画面に合わせて変更するには、EGLViewのsetDesignResolutionSize()を使います。
bool AppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance(); auto eglView = EGLView::getInstance(); director->setOpenGLView(eglView); //描画サイズの調整 eglView->setDesignResolutionSize(600, 800, ResolutionPolicy::FIXED_HEIGHT); // create a scene. it's an autorelease object auto scene = HelloWorldScene::createScene(); // run director->runWithScene(scene); return true; }
こんな感じです。(解説に関係ない部分ごっそり削ってます)
これに関しては、↓とか参考になると思います。(v2.xですが、使い方は大体一緒です)
がおまる開発ブログ 解像度の設定:setDesignResolutionSizeを使用する
#define EGL_SCALE cocos2d::Director::getInstance()->getOpenGLView()->getScaleX()
話を戻しまして、描画するサイズを変えたので、それを取得します。
getScaleX()で、X軸でのスケールを取ってます。アスペクト比は変えていないので、Xだけ見れば大丈夫(のはず)
cursor->setPosition(Point(mouse->getCursorX(), mouse->getCursorY()) / EGL_SCALE);
そして、そのスケールで座標を割ってあげると、OpenGL上での座標になります。
v2.xでは、演算子のオーバーロードがありませんでしたが、v3.0では使えます。便利!
とまぁ、こんな感じです。
ただこれ、マウスが動いた時の座標はわかるけれども、最初に動かす前の座標がわからないんですよね。
今のところ特に困ってないので、いいのですが、何か方法あるのかなぁ。
ちなみに、onMouseMove以外にも、
onMouseDown
onMouseUp
onMouseScroll
があります。説明せずとも名前で分かりますよね。
Down/Up時のクリックされたボタンの判定はEventMouseのgetMouseButton()で行います。
int型で、それぞれのボタンはCCEventMouse.hに
#define MOUSE_BUTTON_LEFT 0 #define MOUSE_BUTTON_RIGHT 1 #define MOUSE_BUTTON_MIDDLE 2 #define MOUSE_BUTTON_4 3 #define MOUSE_BUTTON_5 4 #define MOUSE_BUTTON_6 5 #define MOUSE_BUTTON_7 6 #define MOUSE_BUTTON_8 7
こんな感じで定義されてます。
以上。次回は何にしよう……。
2014/02/24