openFrameworksでマウスボタンのdoubleClickを拾う方法
OFは標準では、mouseのダブルクリックを拾ってくれません。ofEasyCamなどに実装があるので、真似すれば簡単なのですが、すぐ忘れてしまうのでまとめておきます。
(ちなみに、マウスホイールのスクロールはOF0.9から標準搭載されました。めでたい。)
- doubleClickEventなど適当な名前のofEventを作る
- mouseReleased関数の中に、前回マウスリリースしてからの時間を計測するルーチンを足して、イベントをnotifyする.ほぼofEasyCamのコードそのままです。
- mouseDoubleClickedとか適当な名前の関数を作る。
- setupでdoubleClickEventとmouseDoubleClickedを繋ぐイベントリスナーを登録しておく。
main.cpp
#include "ofMain.h" #include "ofApp.h" //======================================================================== int main( ){ ofSetupOpenGL(1024,768,OF_WINDOW); // <-------- setup the GL context // this kicks off the running of my app // can be OF_WINDOW or OF_FULLSCREEN // pass in width and height too: ofRunApp(new ofApp()); }
ofApp.cpp
#include "ofApp.h" //-------------------------------------------------------------- void ofApp::setup(){ lastTap = 1000; ofAddListener(doubleClickEvent, this, &ofApp::mouseDoubleClicked); } //-------------------------------------------------------------- void ofApp::update(){ } //-------------------------------------------------------------- void ofApp::draw(){ } //-------------------------------------------------------------- void ofApp::mouseReleased(ofMouseEventArgs& mouse){ static const unsigned long doubleclickTime = 400; unsigned long curTap = ofGetElapsedTimeMillis(); if (lastTap != 0 && curTap - lastTap < doubleclickTime) { ofNotifyEvent(doubleClickEvent, mouse); return; } lastTap = curTap; } //-------------------------------------------------------------- void ofApp::mouseDoubleClicked(ofMouseEventArgs& mouse) { cout << "double clicked." << endl; }
ofApp.h
#pragma once #include "ofMain.h" class ofApp : public ofBaseApp{ public: void setup(); void update(); void draw(); void mouseReleased(ofMouseEventArgs& mouse); void mouseDoubleClicked(ofMouseEventArgs& mouse); ofEvent<ofMouseEventArgs&> doubleClickEvent; unsigned long lastTap; };
簡単だけどコピペが面倒くさいので、これぐらい標準で組み込んでおいてほしいな・・・。
今日の漫画
阿部潤先生の今のところの最高傑作。嫌なことはご飯を食べて忘れてしまおう。期間限定1巻無料お試し中。お勧めです。
忘却のサチコ(1)【期間限定 無料お試し版】 (ビッグコミックス)
|
|
|
|