[Processing]マウス座標の取得とArrayListを使った応用

Written by uechoco 2月 18
このエントリをはてなブックマークに追加[Processing]マウス座標の取得とArrayListを使った応用のはてなブックマーク被リンク数このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをBuzzurl(バザール)に追加

Processingの勉強も続けてます。今日はマウス座標やマウス状態の取得を学びました。mouseXmouseYというシステム変数で現在のマウス座標を取得します。またpmouseXpmouseYというシステム変数で前フレームのマウス座標を取得します。「p」というのはpreviousとかの「pre(前の)」という接頭語の略ですかね。

mousePressedシステム変数は、マウスが押されているかをあらわしています。trueかfalseであらわしているので、if文の条件分岐で使用できます。そしてmouseButtonシステム変数は、押されているマウスボタンの種類をあらわします。LEFTCENTERRIGHTの3つの定数が対応しています。

mousePressed()mouseClickedmouseReleased()mouseMoved()mouseDragged()といったイベントハンドラ関数は、マウスの状態に応じて勝手に呼ばれる関数です。setup()がプログラムの最初に勝手に呼ばれるように、mousePressed()はマウスが押されたときに勝手に呼ばれます。

マウスを使った例として、マウスでクリックした地点から破片(火花?)が飛び散るというサンプルを作ってみました。マウスの左右ボタンの押下状態に反応して、破片が飛び散ります。マウスボタンを押したままドラッグすると、たくさん破片が飛び散ります。このサンプルは破片の管理にArrayListクラスを使うことで、破片の数の制限もなく、簡単に作ることができます。ただ、ArrayListのGenericsは使えないようなので、旧式の(1.4系の)実装方法で使わないといけないみたいです。

Processing:
  1. import java.util.ArrayList;
  2.  
  3. int FRAGMENTS_FOR_EACH_CLICK = 15; // 1回のクリックで飛び散る破片の平均値
  4. float GRAVITY = 0.98; // 重力
  5. ArrayList fragments; // 破片
  6.  
  7.   size(400, 400);
  8.   colorMode(HSB, 100);
  9.   background(100);
  10.   frameRate(20);
  11.  
  12.   // 変数の初期化
  13.   fragments = new ArrayList();
  14. }
  15.  
  16.   // 画面を白く塗る
  17.   rectMode(CORNER);
  18.   noStroke();
  19.   fill(100);
  20.   rect(0, 0, width, height);
  21.  
  22.   // マウスが押下の間はずっと破片を生成する
  23.     mouseDown();
  24.   }
  25.  
  26.   // 破片の移動と描画
  27.   int size = fragments.size();
  28.   for (int i = 0; i <size; i++) {
  29.     Fragment f = (Fragment)fragments.get(i);
  30.     if (!f.isAvailable) {
  31.       // 不要になった破片を消去
  32.       fragments.remove(i);
  33.       size--; // 最大数も減るので要注意
  34.       continue;
  35.     }
  36.     f.draw();
  37.     f.move();
  38.   }
  39. }
  40.  
  41. void mouseDown() {
  42.   // ベースの色を押されたマウスボタン決める
  43.   float hColor;
  44.   if (mouseButton == LEFT) {
  45.     hColor = 0;
  46.   } else if (mouseButton == RIGHT) {
  47.     hColor = 60;
  48.   } else {
  49.     return;
  50.   }
  51.   // 破片の作成
  52.   int max = FRAGMENTS_FOR_EACH_CLICK + (int)random(-5, 5);
  53.   for (int i = 0; i <max; i++) {
  54.     float x = mouseX + random(-5, 5);
  55.     float y = mouseY + random(-5, 5);
  56.     float sx = random(-3, 3);
  57.     float sy = random(-5, 5);
  58.     fragments.add(
  59.       new Fragment(x, y, sx, sy, hColor)
  60.     );
  61.   }
  62. }
  63.  
  64. // 個々の破片のオブジェクト
  65. class Fragment {
  66.   float x, y, px, py;
  67.   float sx, sy;
  68.   float hColor;
  69.   float bColor;
  70.   boolean isAvailable;
  71.  
  72.   // コンストラクタ
  73.   Fragment(float x, float y, float sx, float sy, float hColor) {
  74.     this.x = x;
  75.     this.y = y;
  76.     this.px = x;
  77.     this.py = y;
  78.     this.sx = sx;
  79.     this.sy = sy;
  80.     this.hColor = hColor;
  81.     this.bColor = 100;
  82.     this.isAvailable = true;
  83.   }
  84.  
  85.   void move() {
  86.     px = x;
  87.     py = y;
  88.     x = x + sx;
  89.     y = y + sy;
  90.     sy += GRAVITY; // 画面下方向に加速
  91.     bColor *= GRAVITY; // 明度を下げていく
  92.  
  93.     if (py> height) { // 画面下部より下に行ったら消去候補にする
  94.       isAvailable = false;
  95.     }
  96.   }
  97.  
  98.   // 描画
  99.   void draw() {
  100.     noFill();
  101.     stroke(hColor, 100, bColor);
  102.     line(px, py, x, y);
  103.   }
  104. }

実行結果

processing_fragmentBrust.jpg

このエントリをはてなブックマークに追加[Processing]マウス座標の取得とArrayListを使った応用のはてなブックマーク被リンク数このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをBuzzurl(バザール)に追加

No Responses to “[Processing]マウス座標の取得とArrayListを使った応用”

コメントはまだありません。

Comments RSS rss うえちょこ@ぼろぐ TrackBack Identifier URI rss うえちょこ@ぼろぐ

コメントする