日記
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
