In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

VideoとCamera(とりあえず)

とりあえずの覚え書き。
////////////////////////////////////////////////////
ToDo:
**    ・イベント周り整理
**    ・明度、彩度の調節
**    ・プレビュー中の他写真への切り替え

////////////////////////////////////////////////////
Get Adobe Flash player
by otias 13 Mar 2010
/**
 * Copyright otias ( http://wonderfl.net/user/otias )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/q4Yl
 */

//とりあえずの覚え書き。

//////////////////////////////////////////////////////
/*  ToDo:
**    ・イベント周り整理
**    ・明度、彩度の調節
**    ・プレビュー中の他写真への切り替え
*/
//////////////////////////////////////////////////////

package {
	import flash.display.*;
	import flash.media.Camera;
	import flash.media.Video;
	import flash.geom.Matrix;
	import flash.events.*;
	import flash.utils.*;
	import caurina.transitions.Tweener;
	
	public class Shoot extends Sprite {
		private var camera:Camera;
		private var cameraHeight:Number = 349;
		private var video:Video;
		private var previewArea:Shape;
		private var curtain:Shape;
		private var images:Vector.<DisplayObject>;
		private var numFilms:int = -1;
		private var minScale:Number = 0.2;
		private var defaultWidth:Number = stage.stageWidth * minScale;
		private var defaultHeight:Number = cameraHeight * minScale;
		private var focusArea:Shape;
		private var shutter:QuickButton;
		private var closeBtn:QuickButton;
		private var timeoutId:uint;
		private var imagePos:Number;
		private var currentSelection:uint = 0;
		private var isFocus:Boolean = false;
		private var timer:Timer;
		
		public function Shoot() {
			init();
		}
		
		private function init():void {
			stage.quality = StageQuality.BEST;
			
			camera = Camera.getCamera();
			camera.addEventListener(ActivityEvent.ACTIVITY, cameraActivated, false, 0, true);
			if(camera) {
				video = new Video(stage.stageWidth, cameraHeight);
				video.attachCamera(camera);
				video.smoothing = true;
				images = new Vector.<DisplayObject>();
				
				previewArea = new Shape();
				with(previewArea.graphics) {
					beginFill(0x000000, 0.7);
					drawRect(0, 0, stage.stageWidth, stage.stageHeight * 0.25);
				}
				previewArea.y = stage.stageWidth - stage.stageHeight * 0.25;
				
				focusArea = new Shape();
				with(focusArea.graphics) {
					lineStyle(2, 0xFFFFFF);
					drawRect(0, 0, defaultWidth - 2, defaultHeight - 2);
				}
				focusArea.alpha = 0;
				
				curtain = new Shape();
				with(curtain.graphics) {
					beginFill(0x000000);
					drawRect(0, 0, stage.stageWidth, stage.stageHeight);
					endFill();
				}
				
				shutter = new QuickButton(60, 25, 0x18D9D9, "shoot!", 10);
				shutter.addEventListener(MouseEvent.CLICK, shooting, false, 0, true);
				shutter.x = 10;
				shutter.y = 10;
				
				closeBtn = new QuickButton(65, 25, 0xFF4141, "close", 10);
				closeBtn.addEventListener(MouseEvent.CLICK, reduce, false, 0, true);
				closeBtn.x = stage.stageWidth - 75;
				closeBtn.y = -100;
				
				addChild(video);
				addChild(previewArea);
				addChild(focusArea);
				addChild(shutter);
				addChild(curtain);
				addChild(closeBtn);
			} else {
				return;
			}
		}
		
		private function cameraActivated(e:ActivityEvent):void {
			Tweener.addTween(curtain, {alpha: 0, time: 2, delay: 0.2});
			timer = new Timer(33);
			timer.addEventListener(TimerEvent.TIMER, showPreviews, false, 0, true);
			timer.start();
			camera.removeEventListener(ActivityEvent.ACTIVITY, cameraActivated);
		}
		
		private function shooting(e:MouseEvent):void {
			shutter.removeEventListener(MouseEvent.CLICK, shooting);
			timer.stop();
			var matrix:Matrix =  new Matrix();
			matrix.scale(1, 1);
			var snapBmd:BitmapData = new BitmapData(video.width, video.height, true, 0xFFFFFFFF);
			snapBmd.draw(video, matrix);
			var image:Bitmap = new Bitmap(snapBmd);
			var imageContainer:Sprite = new Sprite();
			imageContainer.addChild(image);
			
			numFilms++;
			images.push(imageContainer);
			images[numFilms].addEventListener(MouseEvent.MOUSE_DOWN, enlarge, false, 0, true);
			images[numFilms].addEventListener(MouseEvent.MOUSE_OVER, focusIn, false, 0, true);
			addChild(images[numFilms]);
			setChildIndex(shutter, numChildren - 1);
			timeoutId = setTimeout(scaling, 1000);
		}
		
		private function scaling():void {
			Tweener.addTween(previewArea, {y: stage.stageHeight - stage.stageHeight * 0.25, time: 1});
			
			if(images.length >= 1) {
				for(var i:uint = 0; i < images.length; i++) {
					Tweener.addTween(images[i], {y: imagePos, time: 1});
				}
			}
			
			Tweener.addTween(images[numFilms],
							{ scaleX: minScale,
							  scaleY: minScale,
							  x: defaultWidth * numFilms,
							  y: cameraHeight + previewArea.height / 2 - defaultHeight / 2,
							  time: 1
							});
			
			timeoutId = setTimeout(f, 1000);
			function f():void {
				Tweener.removeAllTweens();
				shutter.addEventListener(MouseEvent.CLICK, shooting, false, 0, true);
				timer.start();
			}
		}
		
		private function showPreviews(e:TimerEvent):void {
			var ratioY:Number = stage.stageHeight - stage.stageHeight * 0.25;
			if(mouseY >= ratioY) {
				previewArea.y += simpleEaseOut(previewArea.y, ratioY, 0.2);
			} else {
				previewArea.y += simpleEaseOut(previewArea.y, stage.stageHeight, 0.2);
			}
			
			if(images.length >= 1) {
				imagePos = ratioY + previewArea.height / 2 - images[0].height / 2;
				for(var i:uint = 0; i < images.length; i++) {
					images[i].y = previewArea.y + previewArea.height / 2 - images[i].height / 2;
					focusArea.y = images[i].y + 1;
					if(isFocus) {
						focusArea.alpha = 1;
					} else {
						focusArea.alpha = 0;
					}
				}
			}
		}
		
		private function focusIn(e:MouseEvent):void {
			isFocus = true;
			setChildIndex(focusArea, numChildren - 1);
			focusArea.x = e.target.x + 1;
			e.target.addEventListener(MouseEvent.MOUSE_OUT, focusOut, false, 0, true);
		}
		
		private function focusOut(e:MouseEvent):void {
			isFocus = false;
			e.target.removeEventListener(MouseEvent.MOUSE_OUT, focusOut);
		}
		
		private function enlarge(e:MouseEvent):void {
			focusArea.alpha = 0;
			timer.stop();
			setChildIndex(closeBtn, numChildren - 1);
			Tweener.addTween(closeBtn, {y: 10, delay: 0.5, time: 1});
			
			for(var i:uint = 0; i < images.length; i++) {
				if(e.target == images[i]) {
					currentSelection = i;
					setChildIndex(images[i], getChildIndex(closeBtn) - 1);
					Tweener.addTween(images[i], {scaleX: 1, scaleY: 1, x: 0, y: 0, delay: 0.5, time: 1});
				}
			}
		}
		
		private function reduce(e:MouseEvent):void {
			Tweener.addTween(images[currentSelection],
							 {
							  scaleX: minScale,
							  scaleY: minScale,
							  x: defaultWidth * currentSelection,
							  y: cameraHeight + previewArea.height / 2 - defaultHeight / 2,
							  delay: 0.2,
							  time: 1
							});
			
			Tweener.addTween(closeBtn, {y: -100, delay: 0.2, time: 1});
			
			timeoutId = setTimeout(f, 1000);
			function f():void {
				Tweener.removeAllTweens();
				timer.start();
			}
		}
		
		private function simpleEaseOut(currentPos:Number, targetPos:Number, easing:Number):Number {
			return (targetPos - currentPos) * easing;
		}
	}
}

import flash.display.Sprite;
import flash.display.Shape;
import flash.display.SimpleButton;
import flash.filters.DropShadowFilter;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
import flash.text.TextFieldAutoSize;
	
class QuickButton extends Sprite {
	private var button:SimpleButton;
	private var _w:Number;
	private var _h:Number;
	private var _color:Number;
	private var _text:String;
	private var _textColor:uint;
	private var _roundness:Number;
	private var _upShadow:DropShadowFilter = new DropShadowFilter(3, 45, 0x000000, 0.7, 3, 3);
	private var _downShadow:DropShadowFilter = new DropShadowFilter(1, 45, 0x000000, 0.7, 3, 3);
		
	public function QuickButton(w:Number = 150, h:Number = 30, color:uint = 0xFF0000, txt:String = "Button", txtColor:uint = 0x000000, roundness:Number = 6) {
		_w = w;
		_h = h;
		_color = color;
		_text = txt;
		_textColor = txtColor;
		_roundness = roundness;
		init();
	}

	private function init():void {
		button = createButton();
		addChild(button);
		
		var txt:TextField = createText();
		txt.x = _w / 2 - txt.width / 2;
		txt.y = _h / 2 - txt.height / 2;
		txt.mouseEnabled = false;
		addChild(txt);
	}
	
	private function createButton():SimpleButton {
		var btn:SimpleButton = new SimpleButton();
		var overColor:uint = 0xCECECE;
		var downColor:uint = 0xEEE;
		btn.upState = createBody(_color, "up");
		btn.overState = createBody(overColor, "over");
		btn.downState = createBody(downColor, "down");
		btn.hitTestState = btn.downState;
		btn.useHandCursor = true;
		return btn;
	}
		
	private function createBody(color:uint, mode:String):Shape {
		var body:Shape = new Shape();
		with(body.graphics) {
			beginFill(color, 1);
			drawRoundRect(0, 0, _w, _h, _roundness, _roundness);
			endFill();
		}
		
		if(mode == "over" || mode == "up") {
			body.filters = [_upShadow];
		} else if(mode == "down" || mode == "hit") {
			body.filters = [_downShadow];
		}
		
		return body;
	}
	
	private function createText():TextField {
		var fmt:TextFormat =  new TextFormat();
		with(fmt) {
			color = _textColor;
			size = Math.round(_h * 0.6);
			font = "Arial"
			align = TextFormatAlign.LEFT;
		}
		
		var fld:TextField = new TextField();
		with(fld) {
			defaultTextFormat = fmt;
			selectable = false;
			autoSize = TextFieldAutoSize.LEFT;
			text = _text;
		}
		
		return fld;
	}
}