/* * Copyright(c) 2007 ll_koba_ll * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package net.un_q.camera.ui { import flash.display.*; import flash.events.*; import flash.geom.*; import flash.media.Camera; import flash.media.Video; import net.un_q.camera.ui.PowerBalanceEvent; /** * PowerBalance * * カメラの左右を分割して、それぞれの動体検知にて左右の力をイベントで配信 */ public class PowerBalance extends Sprite { private var camera:Camera; private var video:Video; private var l_camera:BitmapData; private var r_camera:BitmapData; private var l_now:BitmapData; private var l_before:BitmapData; private var r_now:BitmapData; private var r_before:BitmapData; private var halfRect:Rectangle; private var l_motion:BitmapData; private var r_motion:BitmapData; private var srcBmp:BitmapData; private var pt:Point; private var _rightObject:Sprite; private var _leftObject:Sprite; /** * 右側のカメラと動体検知画像 */ public function get rightObjct():Sprite { return _rightObject; } /** * 左側のカメラと動体検知画像 */ public function get leftObject():Sprite { return _leftObject; } /** * コンストラクタ */ public function PowerBalance() { init(); } /** * 初期処理 */ private function init():void { camera = Camera.getCamera(); if (camera != null) { setupCamera(); } else { // error return; } setupUI(); } /** * カメラ */ private function setupCamera():void { video = new Video(camera.width, camera.height); video.attachCamera(camera); } /** * カメラを分割したりゴニョゴニョ */ private function setupUI():void { addEventListener(Event.ENTER_FRAME, loop); pt = new Point(0, 0); srcBmp = new BitmapData(camera.width, camera.height); l_camera = new BitmapData(camera.width/2, camera.height); r_camera = new BitmapData(camera.width/2, camera.height); var l:DisplayObject = addChild(new Bitmap(l_camera)); var r:DisplayObject = addChild(new Bitmap(r_camera)); r.x = camera.width/2 + 10 + camera.width/2 + 20; r_now = new BitmapData(camera.width/2, camera.height); r_before = new BitmapData(camera.width/2, camera.height); l_now = new BitmapData(camera.width/2, camera.height); l_before = new BitmapData(camera.width/2, camera.height); halfRect = new Rectangle(0, 0, camera.width/2, camera.height); l_motion = new BitmapData(camera.width/2, camera.height); r_motion = new BitmapData(camera.width/2, camera.height); var lm:DisplayObject = addChild(new Bitmap(l_motion)); var rm:DisplayObject = addChild(new Bitmap(r_motion)); lm.x = camera.width/2; rm.x = camera.width + camera.width/2 + 30; } /** * 動体検知とか */ private function loop(e:Event):void { // srcBmpにvideoを反転(鏡じゃない)でdraw var mt:Matrix = new Matrix(); mt.scale(-1, 1); mt.translate(camera.width,0); srcBmp.draw(video,mt); // 左右の動体検知 l_camera.copyPixels(srcBmp, new Rectangle(0,0,camera.width/2, camera.height), new Point(0,0)); r_camera.copyPixels(srcBmp, new Rectangle(camera.width/2, 0, camera.width/2, camera.height), new Point(0,0)); l_now.draw(l_camera); l_now.draw(l_before, new Matrix(), new ColorTransform(), BlendMode.DIFFERENCE); var l:uint = l_now.threshold(l_now, halfRect, pt, ">", 0xff111111, 0xffffffff); l_before.draw(l_camera); l_motion.draw(l_now); r_now.draw(r_camera); r_now.draw(r_before, new Matrix(), new ColorTransform(), BlendMode.DIFFERENCE); var r:uint = r_now.threshold(r_now, halfRect, pt, ">", 0xff111111, 0xffffffff); r_before.draw(r_camera); r_motion.draw(r_now); dispatchEvent(new PowerBalanceEvent(PowerBalanceEvent.POWER_CHANGE,l,r)); } } }