/* OKASUKE 2010/07/29 * forked from: Human Clock * DNACLOCK Ver1(ヒトゲノムクロック) * 胃腸じゃないよ! * * TODO:秒音、時報を追加予定でも音素材がない。。。(´;ω;`)ソザイクレ * TODO:リファクタリング */ package { import flash.display.Stage; import flash.display.StageScaleMode; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.Shape; import flash.display.Graphics; import flash.events.Event; import flash.events.TimerEvent; import flash.media.SoundLoaderContext; import flash.utils.Timer; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFormatAlign; import flash.net.URLRequest; import flash.system.LoaderContext; import jp.progression.commands.lists.SerialList; import jp.progression.commands.lists.ParallelList; import jp.progression.commands.net.LoadBitmapData; import jp.progression.commands.net.LoadSound; import jp.progression.data.getResourceById; import org.papervision3d.view.BasicView; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.primitives.Sphere import org.papervision3d.objects.primitives.Plane; import org.papervision3d.core.math.Number3D; import org.papervision3d.materials.BitmapMaterial; import org.papervision3d.core.proto.MaterialObject3D; import org.papervision3d.core.geom.renderables.Line3D; import org.papervision3d.materials.special.LineMaterial; import org.papervision3d.core.geom.Lines3D; import org.libspark.betweenas3.BetweenAS3; import org.libspark.betweenas3.tweens.ITween; import org.libspark.betweenas3.easing.*; import org.libspark.betweenas3.events.TweenEvent; import net.hires.debug.Stats; [SWF(width="465", height="465", frameRate="30", backgroundColor="0xFFFFFF")] public class Jam01 extends BasicView { private var _t:ITween; private var _t2:ITween; private var _t3:ITween; private static const IMG_URL1:Array = ["http://assets.wonderfl.net/images/related_images/2/2e/2ed4/2ed4f104dbc2f7420656e6dd4841a3703a514482", "http://assets.wonderfl.net/images/related_images/2/21/21e6/21e6d3e2b28771de360c66f0d88702064bdbf421"]; private static const SOUND_URL1:Array = ["http://", "http://"]; private var _HourScene3D:DisplayObject3D; private var _MinScene3D:DisplayObject3D; private var _SecScene3D:DisplayObject3D; private var _HourNumber3d:Vector.<Plane> = new Vector.<Plane>(23); private var _MinNumber3d:Vector.<Plane> = new Vector.<Plane>(); private var _SecNumber3d:Vector.<Plane> = new Vector.<Plane>(); private var _secArray:Vector.<BitmapData> = new Vector.<BitmapData>(); private var _minArray:Vector.<BitmapData> = new Vector.<BitmapData>(); private var _hourArray:Vector.<BitmapData> = new Vector.<BitmapData>(); private var _soundArray:Array = []; private var xx:Number = 0; private var yy:Number = 0; private var zz:Number = 0; private var _maxId:Number = 0; private static const P_WIDTH:uint = 50; private static const P_HEIGHT:uint = 80; private var _lineMat:LineMaterial = new LineMaterial(0xD3D3D3, 1); private var _line1:Lines3D = new Lines3D(_lineMat); private var _shpSec:Shape; private var _shpMin:Shape; private var _shpHour:Shape; private var _pathCommands:Vector.<int> = Vector.<int>([1,2,2,2,2]); private var _sec:uint; private var _state:Stats; //コンストラクタ public function Jam01() { stage.quality = StageQuality.LOW; stage.scaleMode = StageScaleMode.NO_SCALE _HourScene3D = new DisplayObject3D(); scene.addChild(_HourScene3D); _MinScene3D = new DisplayObject3D(); scene.addChild(_MinScene3D); _SecScene3D = new DisplayObject3D(); scene.addChild(_SecScene3D); //_state = new Stats(); //addChildAt(_state, 1); var list:SerialList = new SerialList(); for (var i:int = 0; i < IMG_URL1.length; i++) { list.addCommand(new LoadBitmapData(new URLRequest(IMG_URL1[i]), { context: new LoaderContext(true)})); } //for (var j:int = 0; j < SOUND_URL1; i++) { // list.addCommand(new LoadSound(new URLRequest(SOUND_URL1[i]), { context: new SoundLoaderContext(true) } )); //} list.onComplete = function():void { init(); } list.execute(); } private function init():void { //CreateSound(); CreateSecText(); CreateMinText(); CreateHourText(); CreateDNA(); startRendering(); var timer:Timer = new Timer(100); timer.addEventListener(TimerEvent.TIMER, onTimer); timer.start(); } private function CreateSound():void { for (var i:int = 0; i < 2; i++) _soundArray[i] = getResourceById(SOUND_URL1[i]).toSound() } private function CreateHourText():void { for(var i:uint = 0;i <= 23; i++){ var tf:TextField = new TextField(); var tff:TextFormat = new TextFormat(); tff.align = TextFormatAlign.CENTER; tff.size = 24; tff.color = 0xFFFFFF; tf.defaultTextFormat = tff; tf.text = i.toString(); tf.x = -8; tf.y = 4; var sp:Sprite = new Sprite(); sp.graphics.beginFill(0x000000, 0.5); sp.graphics.drawRect(0,0,80,40); sp.graphics.endFill(); sp.addChild(tf); var bitmapdata:BitmapData = new BitmapData(80,40,true,0x00000000); bitmapdata.draw(sp); _hourArray[i] = bitmapdata; } //大体の位置に配置しておく for (var j:int = 23; j >= 0; j--) { var mt:BitmapMaterial = new BitmapMaterial(_hourArray[j]); var pl:Plane = new Plane(mt, 80, 40); pl.material.bitmap = _hourArray[j]; pl.y = -(j * 50); pl.id = j; _HourNumber3d[j] = pl; _HourScene3D.addChild(_HourNumber3d[j]); } _HourScene3D.x = -400; _HourScene3D.y = 600; //HourScene3D.moveBackward(camera.focus * camera.zoom - camera.focus + camera.focus); //HourScene3D.z = 10; } //秒テキスト生成 private function CreateSecText():void { var bmd:BitmapData = getResourceById(IMG_URL1[0]).toBitmapData(); for(var i:uint = 0;i < 60; i++){ var tf:TextField = new TextField(); var tff:TextFormat = new TextFormat(); tff.align = TextFormatAlign.CENTER; tff.size = 35; tff.color = 0xFFFFFF; tf.defaultTextFormat = tff; tf.text = i.toString(); tf.y += 25; var sp:Sprite = new Sprite(); sp.addChild(new Bitmap(bmd)); sp.addChild(tf); var bitmapdata:BitmapData = new BitmapData(100, 100, true, 0x00000000); bitmapdata.draw(sp); _secArray[i] = bitmapdata; } } //分テキスト生成 private function CreateMinText():void { var bmd:BitmapData = getResourceById(IMG_URL1[1]).toBitmapData(); for(var i:uint = 0;i < 60; i++){ var tf:TextField = new TextField(); var tff:TextFormat = new TextFormat(); tff.align = TextFormatAlign.CENTER; tff.size = 35; tff.color = 0xFFFFFF; tf.defaultTextFormat = tff; tf.text = i.toString(); tf.y += 25 //仮 センターよりちょい上側が見やすい var sp:Sprite = new Sprite(); sp.addChild(new Bitmap(bmd)); sp.addChild(tf); var bitmapdata:BitmapData = new BitmapData(100, 100, true, 0x00000000); bitmapdata.draw(sp); _minArray[i] = bitmapdata; } } //DNAみたいなのを描画 private function CreateDNA():void { var i:uint = 0; var s:uint = 0; var ang:uint = 0; for (ang = 0; ang < 1800; ang += 1440 /180) { if (i >= 60) i = 0; //座標値をとりあえず保持 xx = Math.sin(ang * Math.PI / 180) * 250; zz = Math.cos(ang * Math.PI / 180) * 30; yy = ang - 900; var point3D:Number3D = new Number3D(xx, yy, zz); //SecNumber3d[i] = point3D; //DNA構造を生成 var mt:MaterialObject3D = new BitmapMaterial(_secArray[i]); var pl:Plane = new Plane(mt, 100, 100); pl.material.bitmap = _secArray[i]; pl.x = xx; pl.y = yy; pl.z = zz; pl.id = s; pl.name = s.toString(); pl.alpha = 1; pl.visible = true; _SecNumber3d[s] = pl; _SecScene3D.addChild(_SecNumber3d[s]); xx = Math.cos(ang * Math.PI / 180) * 250; zz = Math.sin(ang * Math.PI / 180) * 30; yy = ang - 900; point3D = new Number3D(xx, yy, zz); mt = new BitmapMaterial(_minArray[i]); pl = new Plane(mt, 100, 100); pl.material.bitmap = _minArray[i]; pl.x = xx; pl.y = yy; pl.z = zz; pl.id = s pl.name = s.toString(); _maxId = s; _MinNumber3d[s] = pl; _MinScene3D.addChild(_MinNumber3d[s]); if(s%3 == 0) _line1.addNewLine(2, _SecNumber3d[s].x, _SecNumber3d[s].y, _SecNumber3d[s].z, xx, yy, zz); s += 1; i += 1; } scene.addChild(_line1);//とりあえずsceneに //trace("maxId" + _maxId); } private var _onceflag:Boolean = true; private var _honceflag:Boolean = true; private var _secflg:Boolean = true; private function onTimer(e:TimerEvent):void { var time:Date = new Date; var sec:int = time.getSeconds(); if (_sec == sec) return; _sec = sec; if(_secflg) SupdateView(time.getHours(), time.getMinutes(), sec); if (sec == 0 || _onceflag) MupdateView2(time.getHours(), time.getMinutes(), sec); if ((sec == 0 && time.getMinutes() == 0 )|| _honceflag) HupdateView(time.getHours()); } private function HupdateView($hour:int):void { _honceflag = false; var stw:uint = _HourNumber3d.length; var hourtweens:Array = new Array(stw-1); var j:uint = 0; for (var i:int = stw-1; i >= 0; --i) { if (_HourNumber3d[i].id == $hour) { hourtweens[j] = BetweenAS3.tween(_HourNumber3d[i], { scale:2}, null, 1, Cubic.easeOut); } else { hourtweens[j] = BetweenAS3.tween(_HourNumber3d[i], { scale:1}, null, 1, Cubic.easeOut); } j += 1; } var htween:ITween = BetweenAS3.parallelTweens(hourtweens); _t3 = BetweenAS3.serial(htween); _t3.stopOnComplete = true; _t3.play(); } private function MupdateView2($hour:int, $min:int, $sec:int):void { _onceflag = false; var stw:uint = _MinNumber3d.length; var mintweens:Array = new Array(stw); for (var i:int = stw-1; i >= 0; --i) { if (i != 0) { if (0 == _MinNumber3d[i].id) { _MinNumber3d[i].visible = false; _MinNumber3d[i].id = _maxId mintweens[i] = BetweenAS3.tween(_MinNumber3d[i], { x:_MinNumber3d[i-1].x, y:_MinNumber3d[i-1].y, z:_MinNumber3d[i-1].z}, { x:_MinNumber3d[i].x, y:_MinNumber3d[i].y, z:_MinNumber3d[i].z}, 1, Cubic.easeOut); } else { _MinNumber3d[i].visible = true; _MinNumber3d[i].id = _MinNumber3d[i].id - 1; mintweens[i] = BetweenAS3.tween(_MinNumber3d[i], { x:_MinNumber3d[i-1].x, y:_MinNumber3d[i-1].y, z:_MinNumber3d[i-1].z, scale:1}, { x:_MinNumber3d[i].x, y:_MinNumber3d[i].y, z:_MinNumber3d[i].z}, 1, Cubic.easeOut); } if (int(_MinNumber3d[i].name) % 60 == $min) { mintweens[i] = BetweenAS3.tween(_MinNumber3d[i], { x:_MinNumber3d[i - 1].x, y:_MinNumber3d[i - 1].y, z:_MinNumber3d[i - 1].z, scale:3}, { x:_MinNumber3d[i].x, y:_MinNumber3d[i].y, z:_MinNumber3d[i].z, scale:1}, 1, Cubic.easeOut); } } else { if (0 == _MinNumber3d[i].id) { _MinNumber3d[i].visible = false; _MinNumber3d[i].id = _maxId; } else { _MinNumber3d[i].visible = true; _MinNumber3d[i].id = _MinNumber3d[i].id - 1; } //MinNumber3d[i].visible = false; mintweens[i] = BetweenAS3.tween(_MinNumber3d[0], { x:_MinNumber3d[stw-1].x, y:_MinNumber3d[stw-1].y, z:_MinNumber3d[stw-1].z, alpha:_MinNumber3d[stw - 1].alpha = 0 }, { x:_MinNumber3d[0].x, y:_MinNumber3d[0].y, z:_MinNumber3d[0].z, alpha:_MinNumber3d[0].alpha = 0 }, 1, Cubic.easeOut); } } var ctween:ITween = BetweenAS3.parallelTweens(mintweens); _t2 = BetweenAS3.serial(ctween); _t2.stopOnComplete = true; _t2.play(); } //き、気がついたらすごい冗長なコードに・・・ private function SupdateView($hour:int, $min:int, $sec:int):void { //_secflg = false; $sec = _sec; var stw:uint = _SecNumber3d.length; var sectweens:Array = new Array(stw); for (var i:uint = 0; i < stw; i++) { if (i != stw - 1) { if (_maxId == _SecNumber3d[i].id ) { //_SecNumber3d[i].visible = false; _SecNumber3d[i].id = 0 sectweens[i] = BetweenAS3.tween(_SecNumber3d[i], { x:_SecNumber3d[i + 1].x, y:_SecNumber3d[i + 1].y, z:_SecNumber3d[i + 1].z}, { x:0, y: -800, z:0 }, 1, Cubic.easeInOut); if (int(_SecNumber3d[i].name) % 60 == $sec) { sectweens[i] = BetweenAS3.tween(_SecNumber3d[i], { x:_SecNumber3d[i + 1].x, y:_SecNumber3d[i + 1].y, z:_SecNumber3d[i + 1].z, scale:3}, { x:0, y:-800, z:0, scale:1}, 1, Cubic.easeInOut); } } else { //_SecNumber3d[i].visible = true; _SecNumber3d[i].id = _SecNumber3d[i].id + 1; sectweens[i] = BetweenAS3.tween(_SecNumber3d[i], { x:_SecNumber3d[i + 1].x, y:_SecNumber3d[i + 1].y, z:_SecNumber3d[i + 1].z, scale:1}, { x:_SecNumber3d[i].x, y:_SecNumber3d[i].y, z:_SecNumber3d[i].z }, 1, Cubic.easeInOut); if (int(_SecNumber3d[i].name) % 60 == $sec) { sectweens[i] = BetweenAS3.tween(_SecNumber3d[i], { x:_SecNumber3d[i + 1].x, y:_SecNumber3d[i + 1].y, z:_SecNumber3d[i + 1].z, scale:3}, { x:_SecNumber3d[i].x, y:_SecNumber3d[i].y, z:_SecNumber3d[i].z, scale:1}, 1, Cubic.easeInOut); } } } else { if (_maxId == _SecNumber3d[i].id) { //_SecNumber3d[i].visible =false; _SecNumber3d[i].id = 0; sectweens[i] = BetweenAS3.tween(_SecNumber3d[stw - 1], { x:_SecNumber3d[0].x, y:_SecNumber3d[0].y, z:_SecNumber3d[0].z}, { x:0, y:-800, z:0}, 1, Cubic.easeInOut); } else { //_SecNumber3d[i].visible = true; _SecNumber3d[i].id = _SecNumber3d[i].id + 1; sectweens[i] = BetweenAS3.tween(_SecNumber3d[stw - 1], { x:_SecNumber3d[0].x, y:_SecNumber3d[0].y, z:_SecNumber3d[0].z, scale:1 }, { x:_SecNumber3d[stw - 1].x, y:_SecNumber3d[stw - 1].y, z:_SecNumber3d[stw - 1].z }, 1, Cubic.easeInOut); if (int(_SecNumber3d[i].name) % 60 == $sec) { sectweens[i] = BetweenAS3.tween(_SecNumber3d[stw - 1], { x:_SecNumber3d[0].x, y:_SecNumber3d[0].y, z:_SecNumber3d[0].z, scale:3}, { x:_SecNumber3d[stw-1].x, y:_SecNumber3d[stw-1].y, z:_SecNumber3d[stw-1].z, scale:1}, 1, Cubic.easeInOut); } } } } var ctween:ITween = BetweenAS3.parallelTweens(sectweens); _t = BetweenAS3.serial(ctween); //_t.addEventListener(Event.COMPLETE, completeHandler); _t.stopOnComplete = true; _t.play(); } private function completeHandler(e:TweenEvent):void { //TODO:こちらで時間をカウントすべきか //var time:Date = new Date; //var sec:int = time.getSeconds(); //if (_sec == sec) return; //_sec += 1; //_sec = sec; //SupdateView(time.getHours(), time.getMinutes(), sec); } //enterframeでなくonRenderTickで override protected function onRenderTick(event:Event=null):void { //TODO:カメラ移動とかするか super.onRenderTick(event); } } } DNACLOCK Ver1(ヒトゲノムロック)