イベント処理
マウスに応答のセクションでは、p5.jsがあらかじめ用意している、マウスの位置(mouseXとmouseY)やボタンの状態(mouseIsPressed)を保存した変数をdraw()関数の中で使って、マウスに応答する方法を説明しました。p5.jsは、それとは別に、マウス操作やキー入力といったイベントを処理する仕組みを備えています。マウスが動いたりキーが押されると、イベントと呼ばれる情報が発生します。p5.jsはそれに応じたイベント関数を呼出すことで、応答します。実行したいイベント関数を定義しておけば、イベントが起きた時に自動的に呼び出してくれます。関数を定義することは関数を作るセクションで説明しました。
細かく言うと、draw()関数の実行が1回終わるのを待って、イベント関数が呼出されます。draw()関数は繰返し実行されて描画を行ってますが、その途中でイベントが起きたことで(例えばマウスが動いたことで)、描画をじゃましないように、draw()が終わるまで待ってから、イベント処理を実行します。
マウスイベント
マウス操作に応じて呼出される関数には次のものがあります。マウス操作に応じたイベント処理をさせたい場合は、そのマウス操作で実行される関数をプログラム内で定義し、ブロックの中(中括弧{と}の間)に書いておきます。 いずれの関数も、戻り値はありません。mousePressed() マウスボタンが押された時、ブロックの中のコードが1回実行される。 mouseReleased() マウスボタンが離された時、ブロックの中のコードが1回実行される。 mouseMoved() マウスが動いた時、ブロックの中のコードが1回実行される。 mouseDragged() マウスがドラッグした時、ブロックの中のコードが1回実行される。リスト3-1と同じ動きをするプログラムをmouseMoved()を使って書くと次のようになります。 draw()関数の中でする処理はありませんが、プログラムを動かし続けるために、ブロック内が空のdraw()関数は必須です。
マウス移動で描画
【リスト5-1】 function setup() { createCanvas(250, 125); background(200); } function draw() { } function mouseMoved(){ ellipse(mouseX, mouseY, 10, 10); }
この例はリスト3-1のように書くのが普通で、イベント処理関数を使う必要はありません。 次に必要のある例を見てみましょう。 マウスをドラッグすると、それに応じて四角形が描かれます。
マウスドラッグで描画
【リスト5-2】 var x = 0; var y = 0; function setup() { createCanvas(250, 250); background(200); fill(255,0,0); //赤で塗る noStroke(); //枠線なし rectMode(CORNERS); //rect()関数の引数の意味の指定 } function draw() { } function mousePressed(){ x = mouseX; y = mouseY; } function mouseDragged(){ background(200); rect(x, y, mouseX, mouseY); //引数は対角線上で向い合う角の座標 }
マウスボタンを押したときの位置をx、yに覚えておき、マウスがドラッグされたら
最初の位置と、新しいマウスの位置とを、四角形の対角線上で向き合う2点として、四角形を描いています。 rectMode()関数にCORNERSを指定することで、rect()関数の引数の意味を、デフォルト(左上角の座標と幅と高さ)から、対角線上で向かい合う2つ角の座標に変更しています。
どちら方向にドラッグしても、正しく四角形が描けることを確認してください。
キーイベント
キーボードが操作されると、次の関数が呼び出されます。keyPressed() いずれかのキーが押された時、ブロックの中のコードが1回実行される。 keyReleased() いずれかのキーが離された時、ブロックの中のコードが1回実行される。操作された(押した、または離した)キーを、変数keyに覚えています。
変数keyには、英数字や記号など文字として表示できるキーの場合はその文字が値として格納されます。それ以外のキー(shiftキーやファンクションキー)の場合は、変数keyCodeにそのキーを識別する整数が保管されます。 keyCodeに保管される値については、p5.jsのリファレンスkeyCodeを参照してください。
リスト3-4を少し変え、rキーを押すと赤で、yキーを押すと黄色で、gキーを押すと緑で円が描かれるようにしたのが、次のリスト5-3です。keyPressed()関数を定義し、その中で、if-else文を使って、条件を分け、塗る色を変えています。
キー入力する前に灰色画面上で一回クリック
r: 赤
y: 黄
g: 緑
【リスト5-3】 var x = 0; var y = 0; var easing = 0.05; //マウスにゆっくり近づく度合 function setup() { createCanvas(250, 125); background(200); fill(0); //最初は黒 noStroke(); //枠線なし } function draw() { var targetX = mouseX; var targetY = mouseY; x = x + (targetX - x) * easing; y = y + (targetY - y) * easing; ellipse(x, y, 10, 10); } function keyPressed(){ if(key == 'r'){ //キー入力がrなら fill(255,0,0); }else if(key == 'y'){ //キー入力がyなら fill(255,255,0); }else if(key == 'g'){ //キー入力がgなら fill(0,255,0); } }
演習問題
ドラッグで描画
・図形を描く前に、キーボードからr、e、lのいずれかを入力すると、それに応じて描かれる図形の種類が変わる。
キー入力の意味
r: 四角
e: 円
l: 線
ドラッグで描画
キー入力の意味
r: 四角
e: 円
l: 線
c: クリア