マウス(Mouse)
Copyright (C) 2014 by Nobuhide Tsuda
マウス(Mouse)
- マウスイベントを処理するには、マウスのイベントリスナーを生成し、それをイベントディスパッチャーに追加するとよい。
※ イベントリスナーとは各イベントを監視するオブジェクトの様なもの。
※ イベントディスパッチャー とは、マウスクリック等のイベントが発生した時に適切なハンドラを呼び出す機構のこと。
- イベントリスナーには、マウスダウン・アップ・移動・スクロールイベントハンドラを指定できる。
何故かダブルクリックイベントは無いようだ。ゲームでは必要ないということか?
- 準備として、必要なファイルをインクルードする。
#include <base/CCEventListenerMouse.h>
#include <base/CCEvent.h>
レイヤーの宣言ファイルで、各イベントハンドラを宣言する。
void onMouseDown(cocos2d::Event* event);
void onMouseUp(cocos2d::Event* event);
void onMouseMove(cocos2d::Event* event);
void onMouseScroll(cocos2d::Event* event);
EventListenerMouse::create(); でマウスのイベントリスナーを生成し、各イベントハンドラを設定する。
イベントハンドラの指定には CC_CALLBACK_1() マクロを使用する。
this->getEventDispatcher() でレイヤのイベントディスパッチャーを取得し、
addEventListenerWithSceneGraphPriority() をコールして、リスナーをディスパッチャに追加する。
auto mouseListener = EventListenerMouse::create();
mouseListener->onMouseMove = CC_CALLBACK_1(HelloWorld::onMouseMove, this);
mouseListener->onMouseUp = CC_CALLBACK_1(HelloWorld::onMouseUp, this);
mouseListener->onMouseDown = CC_CALLBACK_1(HelloWorld::onMouseDown, this);
mouseListener->onMouseScroll = CC_CALLBACK_1(HelloWorld::onMouseScroll, this);
this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(mouseListener, this);
イベントハンドへは Event* event が引数で渡ってくるので、EventMouse* にキャストしてマウス座標などを参照する。
マウスの座標は e->getCursorX(), e->getCursorY() で取得できる。
これらの型は int ではなく float なので注意。
どのボタンが押されたかは e->getMouseButton() で取得できる。左ボタン:0,右ボタン:1、中ボタン:2 の様だ。
マウスホイールがどの方向に回されたかは e->getScrollX(), e->getScrollY() で取得できる。
void HelloWorld::onMouseDown(Event* event)
{
EventMouse* e = (EventMouse*)event;
log("mouse down. key = %d (%g, %g)", e->getMouseButton(), e->getCursorX(), e->getCursorY());
}
void HelloWorld::onMouseUp(Event* event)
{
EventMouse* e = (EventMouse*)event;
log("mouse up. key = %d (%g, %g)", e->getMouseButton(), e->getCursorX(), e->getCursorY());
}
void HelloWorld::onMouseMove(Event* event)
{
EventMouse* e = (EventMouse*)event;
log("mouse move. (%g, %g)", e->getCursorX(), e->getCursorY());
}
void HelloWorld::onMouseScroll(Event* event)
{
EventMouse* e = (EventMouse*)event;
log("mouse scroll. (%g, %g)", e->getScrollX(), e->getScrollY());
}
上記プログラムを実行してみるとわかるが、画面の座標原点は左上で、y軸は上方向を向いている(画面内の y 座標はマイナスの値)ようだ。