◆PROCESSING 逆引きリファレンス
カテゴリー:キーボード・マウス処理
マウスポインタの座標を知るには
【解説】
PROCESSINGではマウスが押された場合や動かされた場合、マウスポインタが画面上のどこにあるのかを知る事が可能です。
mouseClicked():マウスボタンクリック
mouseDragged():マウスドラッグ
mouseMoved():マウス移動
mousePressed():マウスボタン押下
mouseReleased():マウスボタンを離す
mouseWheel():ホイールボタンを回す
の各イベント関数に渡される MouseEvent オブジェクトのインスタンス変数を利用する事で、そのイベントが発生した時のマウスポインタ座標が取得できます。
またPROCESSINGが提供してくれる mouseX、mouseY、pmouseX、pmouseY 変数でも知ることができます。
【構文】
void mouseClicked( MouseEvent event );
void mouseDragged( MouseEvent event );
void mouseMoved( MouseEvent event );
void mousePressed( MouseEvent event );
void mouseReleased( MouseEvent event );
void mouseWheel( MouseEvent event );
【パラメータ】
MouseEvent : event : マウスイベントオブジェクト
event は MouseEvent オブジェクトのインスタンス変数です。event には、操作されたボタンの種類や、その時のマウスカーソルの座標などが保持されています。
詳しくは「マウスボタンが押された事を判定するには」記事か、github上のprocessing.github.ioを参照してください。
【戻り値】
void (なし)
【注意】
各イベント関数に渡される MouseEvent オブジェクトのインスタンス変数を用いると、そのイベントが発生した時のポインタ座標が取得できます。なにか操作された時のタイムリーな座標を知りたい場合は便利です。
座標の取得には MouseEvent オブジェクトが持つ getX()、getY() メソッドを利用します。
- 横座標の取得 int x = event.getX();
- 縦座標の取得 int y = event.getY();
戻り値の座標(x と y)は int型になります。
PROCESSINGが提供してくれる mouseX、mouseY、pmouseX、pmouseY 変数は draw() 関数などで利用します。
draw() 関数で用いた場合、mouseX、mouseY は、そのフレームループ時点でのマウスポインタ座標を、pmouseX、pmouseYは 1 つ前のフレームループ時点でのマウスポインタ座標を保持しています。
mouseX、mouseY、pmouseX、pmouseY 変数は、いずれも初期値は0です。
以下の様な感じで変化します。
●最初
mouseX = 0; mouseY = 0; pmouseX = 0; pmouseY = 0;
●次の draw ループまでの間に、マウスポインタが(10, 20) に移動
mouseX = 10; mouseY = 20; pmouseX = 0; pmouseY = 0;
●次の draw ループまでの間に、マウスポインタが(30, 40) に移動
mouseX = 30; mouseY = 40; pmouseX = 10; pmouseY = 20;
注意点はmouseX、mouseY、pmouseX、pmouseY が draw()関数のフレームループ毎と、イベント関数が呼び出された時点で更新される事です。
また戻される座標は、すべて実行結果ウィンドウの左上隅座標を(0, 0)とした相対座標です。ディスプレイ画面上での絶対座標ではありません。
なお、実行結果ウィンドウの内枠(描画領域)からマウスポインタが外れた(外に出た)場合、次に実行結果ウィンドウの内枠(描画領域)にマウスポインタが移動してくるまで、これらの変数は更新されません。
マウスポインタのスクリーン座標を知りたい場合は、「マウスポインタのスクリーン座標を知るには」記事を参照して下さい。
【関連記事】
- マウスのダブルクリックを判定するには
- マウスボタンが押された事を判定するには
- マウスボタンが離された事を判定するには
- マウスが動かされた事を判定するには
- マウスのどのボタンが押されたか調べるには
- マウスホイールを判定するには
- マウスポインタのスクリーン座標を知るには
サンプルプログラム
ボタンが押された際のマウスカーソル位置を取得する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void setup(){ size(300, 300); background(0); //点の色と大きさを指定 stroke(100,100,255); strokeWeight(8); } void draw(){ } void mouseClicked(MouseEvent e ){ //クリックされた位置に点を打つ point( e.getX(), e.getY() ); } |
マウスボタンが押された際に、該当位置に青い点を打ちます。
フレーム毎にマウスカーソル位置を取得する例:
1 2 3 4 5 6 7 8 9 10 11 |
void setup(){ size(300, 300); background(0); stroke(100,100,255); strokeWeight(8); frameRate(30); } void draw(){ point( mouseX, mouseY ); } |
マウスを実行結果ウィンドウの上で動かすと、マウスポインタの位置に連続して青い点が描かれます。
応用例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
//点の座標を管理するクラス class clsMCLocation{ private int x1; //1つ目のX private int y1; //1つ目のY private int x2; //2つ目のX private int y2; //2つ目のY //座標を前詰めする処理 private void shift(){ this.x1 = this.x2; this.y1 = this.y2; } //座標を覚える処理 public void setLocation(int px, int py ){ //常に前詰めして、2つ目に覚える shift(); this.x2 = px; this.y2 = py; } //座標を取り出す処理 public int[] getLocation(){ int locate[] = new int[4]; locate[0] = this.x1; locate[1] = this.y1; locate[2] = this.x2; locate[3] = this.y2; return( locate ); } } clsMCLocation MZahyou; int iClickCount; //クリック数管理 void setup(){ size(300,300); MZahyou = new clsMCLocation(); iClickCount = 0; //線(点)の幅と色を指定 strokeWeight(8); stroke(100,100,255); background(0); } void draw(){ //2回め以降のクリック時に座標を取り出して //線をつなぐ if( iClickCount == 2 ){ int[] p; p = MZahyou.getLocation(); line( p[0], p[1], p[2], p[3] ); //2回目以降線を連続で繋ぎたいので //クリック数は常に1にする iClickCount = 1; } } void mouseClicked(MouseEvent e){ //クリックされた座標を記憶する MZahyou.setLocation(e.getX(),e.getY()); //点を打つ point( e.getX(),e.getY() ); iClickCount++; } |
マウスでクリックした箇所から、連続して線を描きます。
最初にマウスがクリックされた時は、clsMCLocationのローカル変数 x2 と y2 にクリックされた座標を記録します。
次にマウスがクリックされると、最初の座標を x1 と y1 に移し替えて(shiftメソッド)、今クリックされた座標をx2 と y2 に記録します。その後、( x1, y1 ) – ( x2, y2 ) にかけて線を引きます。
3回めにクリックされた場合も2回目同様です。結果として、どんどん線が伸びていきます。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。