Prototyping Lab: Recipe 14.4

by kotobuki
♥0 | Line 48 | Modified 2010-04-14 23:08:43 | MIT License
play

ActionScript3 source code

/**
 * Copyright kotobuki ( http://wonderfl.net/user/kotobuki )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/vxof
 */

package {
  import flash.display.Sprite;
  import flash.events.Event;
  import funnel.*;

  public class UseTouchPanel extends Sprite {
    private var arduino:Arduino;

    // タッチパネルのXとYに接続したピン、タッチされているか否かを示すピン
    private var xPin:Pin;
    private var yPin:Pin;
    private var touchPin:Pin;

    // 現在タッチされているか否か
    private var isTouched:Boolean = false;

    // 前回のXとY の値
    private var lastX:Number = 0;
    private var lastY:Number = 0;

    public function UseTouchPanel() {
      // Arduinoの初期化
      arduino = new Arduino(Arduino.FIRMATA);

      // タッチパネルのXとYに接続したピンにスケーラをセット
      xPin = arduino.analogPin(0);
      xPin.addFilter(new Scaler(0, 1, 0, 399));
      yPin = arduino.analogPin(1);
      yPin.addFilter(new Scaler(0, 1, 0, 299));

      // タッチされているか否かを示すピンにフィルタリスナをセット
      touchPin = arduino.analogPin(2);
      touchPin.addFilter(new SetPoint([0.5, 0.1]));
      touchPin.addEventListener(PinEvent.RISING_EDGE, 
                                onMake);
      touchPin.addEventListener(PinEvent.FALLING_EDGE, 
                                onBreak);

      // 毎フレームごとに発生するイベントに対するリスナをセット
      addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    // パネルに触れたら
    private function onMake(e:PinEvent):void {
      // フラグをtrueにセットし、それまでの描画をクリアして新しくスタート
      isTouched = true;
      graphics.clear();
      graphics.lineStyle(1, 0x000000);
      graphics.moveTo(xPin.value, yPin.value);
    }

    // パネルから離れたら
    private function onBreak(e:PinEvent):void {
      // フラグをfalseにセット
      isTouched = false;
    }

    // 毎フレームごとに以下を実行
    private function onEnterFrame(e:Event):void {
      // もしパネルに触れていたらxとy の値を読み取る
      if (isTouched) {
        var x:Number = xPin.value;
        var y:Number = yPin.value;

        // xまたはy の値が前回と異なっていたら新しい点まで直線を描画する
        if (lastX != x || lastY != y) {
          graphics.lineTo(x, y);
        }

        // 前回のxとy の値として今回の値をセット
        lastX = x;
        lastY = y;
      }
    }
  }
}