// ENHANCEDMEDIA - 3D XML Business Card
package {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.filters.BlurFilter;
import flash.text.*;
//papervision imports
import org.papervision3d.scenes.MovieScene3D;
import org.papervision3d.cameras.*;
import org.papervision3d.objects.*;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.materials.MovieMaterial;
import caurina.transitions.Tweener;
public class main extends Sprite {
// ______________________________________ 3D vars
private var container :Sprite;
private var scene :MovieScene3D;
private var camera :Camera3D;
private var frontShowing:Boolean = true;
private var xmlLoader:URLLoader = new URLLoader();
private var xmlData:XML = new XML();
private var picLoader:URLLoader = new URLLoader();
private var cssLoader:URLLoader = new URLLoader();
public var frontImage:String;
public var backImage:String;
public var blurAmount:Number;
public var flipSpeed:Number;
public var cardWidth:Number;
public var cardHeight:Number;
public var theText:String;
public var mc:MovieClip;
private var bitmap:Bitmap = new Bitmap();
// _______________________________________ Main
public function main() {
stage.quality = StageQuality.HIGH;
stage.scaleMode = StageScaleMode.NO_SCALE;
//loader for the xml file
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
xmlLoader.load(new URLRequest("cardflip.xml"));
//loader for the css file
cssLoader.load(new URLRequest("cardflip.css"));
}
private function LoadXML(e:Event):void {
//function called once xml file has loaded
xmlData = new XML(e.target.data);
parseData(xmlData);
}
private function parseData(cardData:XML):void {
//function called to parse the XML data loaded from function above
var url:URLRequest = new URLRequest(cardData.attribute("front"));
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, init3D);
loader.load(url);
//settings variables using the values within the xml main settings line
backImage = cardData.attribute("back");
cardWidth = cardData.attribute("width");
cardHeight = cardData.attribute("height");
flipSpeed = cardData.attribute("speed");
blurAmount = cardData.attribute("blur");
//adding the persons information to a text string that will be used later
theText = cardData.Name + "
";
theText += cardData.Title + "
";
theText += cardData.Email + "
";
theText += cardData.Phone;
}
// ___________________________________ Init3D
public function init3D(event:Event):void {
this.addEventListener( Event.ENTER_FRAME, loop );
//initial papervision settings
container = new Sprite();
addChild( container );
container.x = stage.stageWidth/2;
container.y = stage.stageHeight/2;
scene = new MovieScene3D( container );
camera = new Camera3D();
camera.zoom = 11;
camera.focus = 100;
//this loads the bitmap image for the front image loaded at the beginning
bitmap.bitmapData = Bitmap(event.target.content).bitmapData;
//create a new movieclip anf fill with the front image
var mc = new MovieClip();
mc.graphics.beginBitmapFill(bitmap.bitmapData);
mc.graphics.drawRect(0, 0, cardWidth, cardHeight);
mc.graphics.endFill();
//create new instance of embedded font
var font:theSerif = new theSerif();
var textFormat:TextFormat = new TextFormat();
textFormat.font= font.fontName;
//create new textfield that will hold persons data
var field = new TextField();
field.defaultTextFormat = textFormat;
field.multiline = true;
field.width = cardWidth;
field.autoSize = TextFieldAutoSize.LEFT;
//import css stylesheet to get class properties
var sheet:StyleSheet = new StyleSheet();
sheet.parseCSS(cssLoader.data);
field.styleSheet = sheet;
//set the text to theText, the string we populated beforehand
field.htmlText = theText;
field.embedFonts = true;
field.y = (cardHeight - field.height) - 15;
field.x = 15;
//then add the textfield to the movieclip we made
mc.addChild(field);
//now for the clever papervision bit
//make a new movie material for the front plane
var front:MovieMaterial = new MovieMaterial(mc, true);
var plane :Plane = new Plane(front, cardWidth, cardHeight, 4, 4);
front.smooth = true;
//the back plane just uses a bitmapfilematerial because its just an image
var back:BitmapFileMaterial = new BitmapFileMaterial(backImage);
var plane2 :Plane = new Plane(back, cardWidth, cardHeight, 4, 4);
back.smooth = true;
plane2.z = 1;//very slightly make second plane further away otherwise theylly direcetly
//overlap and clash badly
//add both planes to the 3d scene
scene.addChild( plane, "front");
scene.addChild( plane2, "back");
frontShowing = true;
//flip the back plane an initial 180 degrees
var cardB :DisplayObject3D = new DisplayObject3D();
cardB = scene.getChildByName("back");
cardB.rotationY = 180;
//create containers to add event listeners too so we can click on them to start a flip
var container:Sprite = plane.container;
container.buttonMode = true;
container.addEventListener( MouseEvent.MOUSE_DOWN, cardPress );
var container2:Sprite = plane2.container;
container2.buttonMode = true;
container2.addEventListener( MouseEvent.MOUSE_DOWN, cardPress );
}
public function cardPress(event:Event):void {
//create displayobject for plane so can rotate within 3d axis
var cardF :DisplayObject3D = new DisplayObject3D();
cardF = scene.getChildByName("front");
var cardB :DisplayObject3D = new DisplayObject3D();
cardB = scene.getChildByName("back");
//get planes so that can apply blurring
var plane = scene.getChildByName("front");
plane.container.filters = [new BlurFilter(0,0,1)];
var plane2 = scene.getChildByName("back");
plane2.container.filters = [new BlurFilter(0,0,1)];
if (frontShowing){
//start tweens for the rotation, and the blur
Tweener.addTween(cardF, {rotationY:180, time:flipSpeed});
Tweener.addTween(cardB, {rotationY:360, time:flipSpeed});
Tweener.addTween(plane.container, {_blur_blurX:blurAmount, time:0.3, delay:0.1});
Tweener.addTween(plane2.container, {_blur_blurX:blurAmount, time:0.3, delay:0.1});
Tweener.addTween(plane.container, {_blur_blurX:0, time:0.3, delay:0.4});
Tweener.addTween(plane2.container, {_blur_blurX:0, time:0.3, delay:0.4});
frontShowing = false;
}else{
//start another set of tweens if the card is facing the other way
Tweener.addTween(cardB, {rotationY:180, time:flipSpeed});
Tweener.addTween(cardF, {rotationY:0, time:flipSpeed});
Tweener.addTween(plane.container, {_blur_blurX:blurAmount, time:0.3, delay:0.1});
Tweener.addTween(plane2.container, {_blur_blurX:blurAmount, time:0.3, delay:0.1});
Tweener.addTween(plane.container, {_blur_blurX:0, time:0.3, delay:0.4});
Tweener.addTween(plane2.container, {_blur_blurX:0, time:0.3, delay:0.4});
frontShowing = true;
}
}
private function loop(event:Event):void {
//keep rendering papervision scene
scene.renderCamera( this.camera );
}
}
}