日記

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



CAPTCHA