4-2マウスやキーボードの利用

マウスやキーボードによる操作をプログラムに反映させることもプロセッシングでは簡単にできます。このページでは、マウスを押すと動いているものが止まったり、動き出したり、あるいは色を変えたりといったインタラクティブな処理を実現する方法を説明します。

このページのサンプルでは、画面を押すと動作が止まる機能と、長押しするとリロードする機能は止めてあります


このページの内容

  1. mousePressed(){ }の例1
  2. mousePressed(){ }の例2
  3. mousePressed(){ }の例3
  4. mouseReleased() { }
  5. mousePressedの例1
  6. mousePressedの例2
  7. keyPressed
  8. keyPressed() { }
  9. keyReleased() { }
  10. key 押されたキーの文字や記号を納める変数
  11. mouseX,mouseYを使った例1
  12. mouseX,mouseYを使った例2
  13. mouseX,mouseYを使った例3
  14. pmouseX, pmouseYを使った例1

mousePressed(){ }の例1

マウスを押したときに何かを行いたいときには、void mousePressed(){ }を使います。この処理が行われるのは、マウスを押した瞬間だけです。マウスを押している間中、処理を行いたい場合には後述する別の方法を用います。
void mousePressed(){ }の使い方は、関数と同じです。波括弧の中に、マウスを押したときに行いたい処理を書きます。具体的には、下記のプログラム例を見てみましょう。
このプログラムは、マウスを押した瞬間に「click」と画面に表示させるものです。

String s;
void setup(){
  s = "click!";
}

void draw(){
  
}

void mousePressed(){
  textSize(20);
  text(s,width/2,height/2);
}

実行結果は下記のようになります。(このページのサンプルでは、画面を押すと動作が止まる機能と、長押しするとリロードする機能は止めてあります)


mousePressed(){ }の例2

下記プログラムは、ハートが画面左から右に向かって移動するものです。上記例とは違い、マウスをクリックするとハートの位置が始めの位置に戻ります。

PImage haikei, heart1, heart2, heart3, heart4;
int x1,x2,x3,x4;

void setup() {
  haikei = loadImage("hot-chocolate-1058197__340.jpg");
  heart1 = loadImage("heart1.png");
  heart2 = loadImage("heart2.png");
  heart3 = loadImage("heart3.png");
  heart4 = loadImage("heart4.png");
  
  size(600, 400);
  x1=0;
  x2=0;
  x3=0;
  x4=0;
}

void draw() {
  image(haikei, 0, 0, width, height);
  image(heart1, x1, 0);
  image(heart2, x2, 100);
  image(heart3, x3, 200);
  image(heart4, x4, 300);

  x1++;
  x2+=2;
  x3+=3;
  x4+=4;
}

void mousePressed(){
 x1=0;
 x2=0;
 x3=0;
 x4=0;
 
}

上記コードは下記のように動作します。


mousePressed(){ }の例3

今度は、マウスをクリックすると画面の外に出てしまったハートだけ、始めの位置に戻るようにしています。

PImage haikei, heart1, heart2, heart3, heart4;
int x1, x2, x3, x4;

void setup() {
  haikei = loadImage("hot-chocolate-1058197__340.jpg");
  heart1 = loadImage("heart1.png");
  heart2 = loadImage("heart2.png");
  heart3 = loadImage("heart3.png");
  heart4 = loadImage("heart4.png");

  size(600, 400);
  x1=0;
  x2=0;
  x3=0;
  x4=0;
}

void draw() {
  image(haikei, 0, 0, width, height);
  image(heart1, x1, 0);
  image(heart2, x2, 100);
  image(heart3, x3, 200);
  image(heart4, x4, 300);

  x1++;
  x2+=2;
  x3+=3;
  x4+=4;
}

void mousePressed() {
  if (x1>width) {
    x1=0;
  }

  if (x2>width) {
    x2=0;
  }
  if (x3>width) {
    x3=0;
  }
  if (x4>width) {
    x4=0;
  }
}

上記コードは下記のように動作します。


mouseReleased() { }

マウスを押して、その指が離れたときに1回だけ処理を行いたい場合は、void mouseReleased() { }を使います。mousePressed(){ }と使い方は同じです。マウスを押した瞬間か、離した瞬間かという違いがあるだけです。そのため例は省略します。


mousePressedの例1

マウスを押している間中ずっと何らかの処理を行いたい場合は、mousePressedという変数を使います。これは特別な変数で、マウスが押されている間はtrueになり、押されていないときはfalseになります。また宣言も不要です。
簡単な例です。マウスを押している時のみ、円を表示します。

void setup(){
  size(800,600);
}
void draw(){
  background(200,200,200);
 if(mousePressed == true){
   ellipse(width/2,height/2,400,400);
 }
}

上記コードは下記のように動作します。

理解を深めるために、マウスを押している間、円が大きくなったり、色が変わったりするようにアレンジしてみるとよいでしょう。


mousePressedの例2

下記は、マウスを押している間のみハートが上下に振動します。

PImage haikei, heart1, heart2, heart3, heart4;
int x1, x2, x3, x4;
int y1, y2, y3, y4;

void setup() {
  haikei = loadImage("hot-chocolate-1058197__340.jpg");
  heart1 = loadImage("heart1.png");
  heart2 = loadImage("heart2.png");
  heart3 = loadImage("heart3.png");
  heart4 = loadImage("heart4.png");

  size(600, 400);
  x1=0;
  x2=0;
  x3=0;
  x4=0;

  y1 = (int)random(height);
  y2 = (int)random(height);
  y3 = (int)random(height);
  y4 = (int)random(height);
}

void draw() {
  image(haikei, 0, 0, width, height);
  image(heart1, x1, y1);
  image(heart2, x2, y2);
  image(heart3, x3, y3);
  image(heart4, x4, y4);

  x1++;
  x2+=2;
  x3+=3;
  x4+=4;

  if (mousePressed == true) {
    y1+=(int)random(-10, 10);   //ハートを上下に振動させる処理
    y2+=(int)random(-10, 10);   //ハートを上下に振動させる処理
    y3+=(int)random(-10, 10);   //ハートを上下に振動させる処理
    y4+=(int)random(-10, 10);   //ハートを上下に振動させる処理
  }
}

上記コードは下記のように動作します。


keyPressed

何かのキーが押されているに、何らかの処理を行いたいときは、keyPressedという変数を使います。mousePressedと使い方は同じです。


keyPressed() { }

キーが押されたときに1回だけ {...} の中を実行する
キーを押したときに何かを行いたいときには、void keyPressed(){ }を使います。波括弧の中にマウスを押したときに行いたい処理を書きます。mousePressed()と同じように使うことができます。


keyReleased() { }

キーが離されたときに1回だけ処理を行いたい場合は、void keyReleased() { }を使います。キーを押した瞬間か、離した瞬間かということが違うだけで、keyPressed(){ }と使い方は同じです。これも例を省略します。


key 押されたキーの文字や記号を納める変数

keyというのは特別な変数で、押された変数が格納されます。
下記の例でその動作を確かめてみましょう。下記は、a、b、cのいずれかのキーが押されると、そのことが出力されます。

void setup(){
  size(800,600); 
  textSize(50);
  
}

void draw(){
  background(200,200,200);
 
  if(key=='a'){
    text("key is 'a'",width/4,height/2); 
  }else if(key=='b'){
    text("key is 'b'",width/4,height/2); 
    
  }else if(key=='c'){
    text("key is 'c'",width/4,height/2); 
    
  }else{
  
    text("key is not 'a' or 'b' or 'c'",width/4,height/2); 
  
  }
  
}

上記コードは下記のように動作します。

理解を深めるために、押したキーによって動作が変わる('a'押すとハートが振動するが、bを押した場合はハートの移動速度が変化するなるといった)プログラムを作成してみるとよいでしょう。


mouseX,mouseYを使った例1

mouseXやmouseYは特別な変数で、これらの変数にはマウスの位置が自動的に格納されます。下記の例でその動作を確かめてみましょう。
 マウスのある位置に円が描かれます。

void setup(){
  size(800,600); 
  
}

void draw(){
  background(200,200,200);
 
  ellipse(mouseX,mouseY,50,50);
  
}

上記コードは下記のように動作します。


mouseX,mouseYを使った例2

上記プログラムをアレンジして円の軌跡を残してみましょう。そのためには、下記のようにdraw()の中からbackground()という処理を消して、画面の背景を更新しないようにします。

void setup() {
  size(800, 600); 
  mouseX = -100;
  mouseY = -100;
  background(200, 200, 200);
}

void draw() {

  ellipse(mouseX, mouseY, 50, 50);
}

上記コードは下記のように動作します。


mouseX,mouseYを使った例3

マウスをクリックすると色がランダムで変化するようにします。

void setup() {
  size(800, 600); 
  mouseX = -100;
  mouseY = -100;
  background(200, 200, 200); //消す
}

void draw() {

  ellipse(mouseX, mouseY, 50, 50);
}

void mousePressed(){
  fill(random(255),random(255),random(255));
  
}

上記コードは下記のように動作します。


pmouseX, pmouseYを使った例1

pmouseXやpmouseYは特別な変数で、前フレームのマウスポインタの位置を取得します。
フレームとは、動画の元になる静止画像の一コマ一コマを指します。これはプロセッシングでは、draw()の中の処理、一回に対応します。

下記の例で、使用方法の感覚をつかみましょう。
前フレームの位置から、現在のフレームの位置に線を引きます。この処理は何度も何度も素早く繰り返されるため(draw()の中の処理はデフォルトでは一分間に60回繰り返される)、結果として、マウスを動かした位置に線が引かれるように見えます。

この例は下記URLから拝借したものです。下記URLにはほかにも多くのおすすめの例があります。
Processing 学習ノート

void setup() {
  size(400, 400);
}

void draw() {
  line(mouseX, mouseY, pmouseX, pmouseY);
}

上記コードは下記のように動作します。