// 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 ); } } }