Papervisionの勉強(Text3D、時計)
/**
* Copyright matsu4512 ( http://wonderfl.net/user/matsu4512 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/jOZP
*/
package
{
import caurina.transitions.Tweener;
import flash.events.Event;
import org.papervision3d.materials.special.Letter3DMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.typography.Text3D;
import org.papervision3d.typography.fonts.HelveticaBold;
import org.papervision3d.view.BasicView;
[SWF(width="500", height="500", backgroundColor="0x000000", frameRate="40")]
public class Papervision11 extends BasicView
{
private var rootNode:DisplayObject3D;
//ひとつ前の時間を保持しておくための変数
private var prev_second1:uint;
private var prev_second2:uint;
private var prev_minute1:uint;
private var prev_minute2:uint;
private var prev_hour1:uint;
private var prev_hour2:uint;
private var prev_second_text1:DisplayObject3D;
private var prev_second_text2:DisplayObject3D;
private var prev_minute_text1:DisplayObject3D;
private var prev_minute_text2:DisplayObject3D;
private var prev_hour_text1:DisplayObject3D;
private var prev_hour_text2:DisplayObject3D;
private var second1:Text3D;
private var second2:Text3D;
private var minute1:Text3D;
private var minute2:Text3D;
private var hour1:Text3D;
private var hour2:Text3D;
private var date:Date;
private const zoom:Number=20;
private const focus:Number=30;
private const distance:Number=600;
public function Papervision11()
{
if(stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init():void{
removeEventListener(Event.ADDED_TO_STAGE, init);
startRendering();
rootNode=this.scene.addChild(new DisplayObject3D("rootNode"));
camera.target=DisplayObject3D.ZERO;
camera.zoom=zoom;
camera.focus=focus;
//文字列マテリアルの設定
var mat:Letter3DMaterial=new Letter3DMaterial();
mat.fillColor=0xFFFFFF;
mat.doubleSided=true;
mat.doubleSided=mat.interactive=true;
//文字列の生成
second1=new Text3D("0123456789", new HelveticaBold(), mat);
second2=new Text3D("012345", new HelveticaBold(), mat);
minute1=new Text3D("0123456789", new HelveticaBold(), mat);
minute2=new Text3D("012345", new HelveticaBold(), mat);
hour1=new Text3D("01234567890", new HelveticaBold(), mat);
hour2=new Text3D("012", new HelveticaBold(), mat);
rootNode.addChild(second1);
rootNode.addChild(second2);
rootNode.addChild(minute1);
rootNode.addChild(minute2);
rootNode.addChild(hour1);
rootNode.addChild(hour2);
second1.scale=second2.scale=minute1.scale=minute2.scale=hour1.scale=hour2.scale=0.4;
date = new Date();
prev_second1 = date.seconds%10;
prev_second2 = date.seconds/10;
prev_minute1 = date.minutes%10;
prev_minute2 = date.minutes/10;
prev_hour1 = date.hours%10;
prev_hour2 = date.hours/10;
//文字列を分解し、飛び散らせる。
prev_second_text1 = dispersionWords(second1, prev_second1, 350);
prev_second_text2 = dispersionWords(second2, prev_second2, 250);
prev_minute_text1 = dispersionWords(minute1, prev_minute1, 50);
prev_minute_text2 = dispersionWords(minute2, prev_minute2, -50);
prev_hour_text1 = dispersionWords(hour1, prev_hour1, -250);
prev_hour_text2 = dispersionWords(hour2, prev_hour2, -350);
addEventListener(Event.ENTER_FRAME, onFrame);
}
private function dispersionWords(words:Text3D, tt:uint, tx:Number):DisplayObject3D
{
var xx:Number;
var yy:Number;
var zz:Number;
var ary:Array = words.letters;
var target:DisplayObject3D;
var prev_text:DisplayObject3D;
for(var i:uint = 0; i < ary.length; i++)
{
target = ary[i];
xx = Math.random()*2000-1000;
yy = Math.random()*2000-1000;
zz = Math.random()*2000-1000;
target.x=target.y=target.z=target.scale=0;
if(i == tt){
Tweener.addTween(target, {scale:1.5, x:tx, y:0, z:0, rotationX:0, rotationY:0, rotationZ:0, time:0.5});
prev_text = target;
}else{
Tweener.addTween(target, {scale:1, x:xx, y:yy, z:zz, rotationX:Math.random() * 360, rotationY:Math.random() * 360, rotationZ:Math.random() * 360, time:3, delay:2 * Math.random() + 1});
}
}
return prev_text;
}
//対象の文字を指定した場所へ移動
private function moveWords(word:DisplayObject3D, x:Number, y:Number, z:Number, scale:Number, rX:Number, rY:Number, rZ:Number):void
{
Tweener.addTween(word, {x:x, y:y, z:z, rotationX:rX, rotationY:rY, rotationZ:rZ, scale:scale, time: 0.5, transition:"easeOutBounce"});
}
private function onFrame(e:Event):void
{
var obj:DisplayObject3D;
date = new Date();
//時間が経過していたら
if(prev_second1 != date.seconds%10){
//時刻更新
prev_second1 = date.seconds%10;
obj = prev_second_text1;
prev_second_text1 = second1.letters[date.seconds%10];
Tweener.removeTweens(obj);
//中心からどこかへ飛ばす
moveWords(obj, Math.random()*2000-1000, Math.random()*2000-1000, Math.random()*2000-1000, 1, Math.random() * 360, Math.random() * 360, Math.random() * 360);
Tweener.removeTweens(prev_second_text1);
//中心へ持ってくる
moveWords(prev_second_text1, 350, 0, 0, 1.5, -rootNode.rotationX, 0, 0);
}
if(prev_second2 != Math.floor(date.seconds/10)){
prev_second2 = date.seconds/10;
obj = prev_second_text2;
prev_second_text2 = second2.letters[Math.floor(date.seconds/10)];
Tweener.removeTweens(obj);
moveWords(obj, Math.random()*2000-1000, Math.random()*2000-1000, Math.random()*2000-1000, 1, Math.random() * 360, Math.random() * 360, Math.random() * 360);
Tweener.removeTweens(prev_second_text2);
moveWords(prev_second_text2, 250, 0, 0, 1.5, -rootNode.rotationX, 0, 0);
}
if(prev_minute1 != date.minutes%10){
prev_minute1 = date.minutes%10;
obj = prev_minute_text1;
prev_minute_text1 = minute1.letters[date.minutes%10];
Tweener.removeTweens(obj);
moveWords(obj, Math.random()*2000-1000, Math.random()*2000-1000, Math.random()*2000-1000, 1, Math.random() * 360, Math.random() * 360, Math.random() * 360);
Tweener.removeTweens(prev_minute_text1);
moveWords(prev_minute_text1, 50, 0, 0, 1.5, -rootNode.rotationX, 0, 0);
}
if(prev_minute2 != Math.floor(date.minutes/10)){
prev_minute2 = date.minutes/10;
obj = prev_minute_text2;
prev_minute_text2 = minute2.letters[Math.floor(date.minutes/10)];
Tweener.removeTweens(obj);
moveWords(obj, Math.random()*2000-1000, Math.random()*2000-1000, Math.random()*2000-1000, 1, Math.random() * 360, Math.random() * 360, Math.random() * 360);
Tweener.removeTweens(prev_minute_text2);
moveWords(prev_minute_text2, -50, 0, 0, 1.5, -rootNode.rotationX, 0, 0);
}
if(prev_hour1 != date.hours%10){
prev_hour1 = date.hours%10;
obj = prev_hour_text1;
prev_hour_text1 = hour1.letters[date.hours%10];
Tweener.removeTweens(obj);
moveWords(obj, Math.random()*2000-1000, Math.random()*2000-1000, Math.random()*2000-1000, 1, Math.random() * 360, Math.random() * 360, Math.random() * 360);
Tweener.removeTweens(prev_hour_text1);
moveWords(prev_hour_text1, -250, 0, 0, 1.5, -rootNode.rotationX, 0, 0);
}
if(prev_hour2 != Math.floor(date.hours/10)){
prev_hour2 = date.hours/10;
obj = prev_hour_text2;
prev_hour_text2 = hour2.letters[Math.floor(date.hours/10)];
Tweener.removeTweens(obj);
moveWords(obj, Math.random()*2000-1000, Math.random()*2000-1000, Math.random()*2000-1000, 1, Math.random() * 360, Math.random() * 360, Math.random() * 360);
Tweener.removeTweens(prev_hour_text2);
moveWords(prev_hour_text2, -350, 0, 0, 1.5, -rootNode.rotationX, 0, 0);
}
rootNode.rotationX++;
prev_second_text1.rotationX = prev_second_text2.rotationX = prev_minute_text1.rotationX = prev_minute_text2.rotationX
= prev_hour_text1.rotationX = prev_hour_text2.rotationX = -rootNode.rotationX;
}
}
}