Archive for the ‘Papervision’ Category

Flashbelt 2008 + Animation to Go + HydroTween + Papervision3D

Getting ready to leave for MN and I’m very excited to be a part of Moses’ presentation at Flashbelt 2008! I will be providing a brief introduction to HydroTween. HydroTween is a multi-purpose tweening parser that runs on top of the Go framework. If you are familiar with ZigoEngine, Fuse, or Tweener, then using HydroTween should be a seamless transition. In this post, you will find the examples shown during the presentation. I’ve also put together an online version of what I will be showing. I was hoping to also include a demonstration of the Making Things controller running a tween on a servo, but my laptop isn’t being cooperative. I will provide a separate post with an update on that as well as a library I am working on for controlling modules.

Back to the subject at hand, here are the 3 examples that I will be showing. The first is an example of generic tweening with most of the basic properties, filters, and image/hsb tweening. The second is a Fuse type example using navigation with multiple tweening properties running at once. The last is a Papervision3D example that is tweening a number of properties including brightness. Thanks to Andy Zupko’s heroic efforts of merging the GreatWhite and Effects branches of Papervision together, we have alpha and the other none-positioning properties at our tweening disposal for 3D objects!

Here is the link to the presentation along with the examples. - Click into the SWF, then use the forward and back arrows to navigate.

I also urge you to check out my previous post that has useful information and source examples, along with changes and important features that have been added. HydroTween will call you renderer for automatic updating of your Papervision scene by registering with HydroTween using the init3D() method. One important new addition is the ability to pass a DisplayObject3D target into this init method for automatic use of the lookAt() method.

Here is the link to the previous post with more information about using HydroTween.

If you’d like to go directly to the examples:
Generic HydroTween
Fuse Style Tweening
Papervision3D - Clicking on an image will bring it up.

Looking forward to seeing everyone there!

And of course, the source! I have included everything in the examples, including the presentation!


Flashbelt2008 HydroTween Source and Examples

Sunday, June 8th, 2008

Papervision3D 2.0 + Go Tweening - Flipping Banner (Part 1)

Set up PapervisionTween to automatically render:

PapervisionTween.init(renderer, scene, camera, viewport);

Calling PapervisionTween to tween a plane:

var b:PapervisionTween = new PapervisionTween(_planeArray[0], {rotationY:0}, 0, 1, Quintic.easeInOut, onFlipDone);
b.start();

I’ve also included the PapervisionTween code in the post in addition to the source files below, but let’s move on the flipping code.

Here’s the Core class that calls the Flip class:

package com.hydrotik.bannerflip3d {
        /**
         * @author Donovan Adams
         * @version December 10, 2007
         * @description Papervision Page flip example
         *
         */

        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.display.Stage;
        import flash.events.MouseEvent;
        import flash.net.URLRequest;
        import flash.net.navigateToURL;

        import com.hydrotik.bannerflip3d.Flip;
        import com.hydrotik.bannerflip3d.FlipEvent;
        import com.hydrotik.utils.XMLLoader;
        import com.hydrotik.utils.XMLLoaderEvent;
       
        import flash.system.Capabilities;       

        public class Core extends Sprite {

                private var _scope:MovieClip;

                private var _stage:Stage;

                private var _xml:XML;

                private var _url:String;

                private var _hit: Sprite;
               
                private var _targ : String;

                public function Core(scope:MovieClip, stage:Stage):void {
                        _scope = scope;
                        _stage = stage;
                        var p:String;
                        if (Capabilities.playerType == “External” || Capabilities.playerType == “StandAlone”) {
                                p = “../includes/admin/flippingbanner.xml”;
                        } else {
                            p = “/wp-content/flippingbanner2/includes/admin/flippingbanner.xml”;
                        }
                        var xml:XMLLoader = new XMLLoader(p);
                        xml.addEventListener(XMLLoaderEvent.COMPLETE, onXMLComplete);
                        xml.addEventListener(XMLLoaderEvent.ERROR, onXMLError);
                }
               
                private function onXMLError(event : XMLLoaderEvent) : void {
                        trace(event);
                }

                // –== Private Methods ==–
                private function onXMLComplete(event:XMLLoaderEvent):void {
                        trace(“:: onXMLComplete:”);
                        _xml = event.xml;

                        var _oFlip:Flip = new Flip(_scope, _stage, this, event.xml.banner.children(), “”, new int(_xml.attribute(“seconds”)));
                        _oFlip.addEventListener(FlipEvent.COMPLETE, onCompleteHandler);
                        _oFlip.addEventListener(FlipEvent.ON_FLIP, onFlipHandler);

                        _hit = new Sprite();
                        _hit.graphics.beginFill(0×660000, 0);
                        _hit.graphics.drawRect(0, 0, _stage.stageWidth, _stage.stageHeight);
                        _scope.addChild(_hit);
                        _hit.addEventListener(MouseEvent.CLICK, onClickHandler);

                        _hit.buttonMode = true;
                        _hit.useHandCursor = true;
                        _hit.mouseEnabled = true;
                }

                private function onClickHandler(event:MouseEvent):void {
                        navigateToURL(new URLRequest(_url), _targ);
                }

                private function onCompleteHandler(event:FlipEvent):void {
                        _url = event.link;
                        _targ = event.targ;
                }

                private function onFlipHandler(event:FlipEvent):void {
                        _url = event.link;
                        _targ = event.targ;
                }

        }
}

Here’s the updated Flip class using the Go tweening engine:

package com.hydrotik.bannerflip3d {
        /**
         * @author Donovan Adams
         * @version December 9, 2007
         * @usage Example:<div class="codesnip-container" ></div>
         * @description
         * @history
         * @sends
         * @todo
         *
         */

        import flash.display.*;
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
        import flash.utils.setTimeout;
       
        import org.papervision3d.cameras.Camera3D;
        import org.papervision3d.core.proto.SceneObject3D;
        import org.papervision3d.events.FileLoadEvent;
        import org.papervision3d.materials.BitmapFileMaterial;
        import org.papervision3d.materials.ColorMaterial;
        import org.papervision3d.objects.DisplayObject3D;
        import org.papervision3d.objects.primitives.Plane;
        import org.papervision3d.render.BasicRenderEngine;
        import org.papervision3d.scenes.Scene3D;
        import org.papervision3d.view.Viewport3D;
       
        import com.hydrotik.go.PapervisionTween;
       
        import fl.motion.easing.*;
       
        import org.papervision3d.core.proto.MaterialObject3D;
       
        [Event(name=“COMPLETE”, type=“com.hydrotik.bannerflip3d.FlipEvent”)]
       
        [Event(name=“ON_FLIP”, type=“com.hydrotik.bannerflip3d.FlipEvent”)]
       
        public class Flip extends EventDispatcher {

                public static const VERBOSE:Boolean = true;
               
                private var _scope:Sprite;

                private var _stage:Stage;

                private var _oCore:*;

                private var _assetPath:String;

                private var _materialArray:Array;

                private var _planeArray:Array;

                private var _array:XMLList;

                private var _count:int = 0;

                private var _next:int;

                private var _prev:int;

                private var _loader:Sprite;

                private var _seconds:int;
               
                //New 2.0 Privates
               
                private var renderer:BasicRenderEngine;
               
                private var camera:Camera3D;
               
                private var viewport:Viewport3D;
               
                private var debug : Function;
               
                private var scene : Scene3D;
               
                private var white : MaterialObject3D;
               
                private var bg : Plane;

                public function Flip(scope:Sprite, stage:Stage, core:*, a:XMLList, assetPath:String = “../flashassets/”, s:int = 10):void {
                        debug = trace;
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        _scope = scope;
                        _stage = stage;
                        _oCore = core;
                        _array = a;
                        _assetPath = assetPath;
                        _seconds = s;
                        _materialArray = [];
                        _planeArray = [];
                       
                        scene = new Scene3D();
                        renderer = new BasicRenderEngine();
                        camera = new Camera3D();
                        camera.z = -100;
                        viewport = new Viewport3D(500,300,true);
                        viewport.alpha = 0;
                       
                        _scope.addChild(viewport);
                       
                        white = new ColorMaterial(0xFFFFFF);
                       
                        setTimeout(addedToStage, 100);
                }
               
                private function addedToStage():void{
                        if(VERBOSE) debug(\n\n>> Flip.addedToStage(); - args: “+[]);

                        _loader = new Sprite();
                        _loader.graphics.beginFill(0×000000);
                        _loader.graphics.drawRect(0, 0, 1, 4);
                        _scope.addChild(_loader);
                        _loader.x = (_stage.stageWidth/2) - 50;
                        _loader.y = (_stage.stageHeight/2) - 2;
                       
                        for (var i:int = 0; i < _array.length(); i++) {
                                _materialArray[i] = new BitmapFileMaterial(_array[i].attribute(’src’));
                                _materialArray[i].oneSide = true;
                                _materialArray[i].smooth = true;
                                _materialArray[i].addEventListener(FileLoadEvent.LOAD_PROGRESS, onFileProgress);
                                _materialArray[i].addEventListener(FileLoadEvent.LOAD_COMPLETE, onFileComplete);
                                _planeArray[i] = new Plane( _materialArray[i], 300, 156, 6, 6);
                                scene.addChild(_planeArray[i]);
                                _planeArray[i].name = i.toString();
                                _planeArray[i].rotationY = -180;
                        }
                       
                        // PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system 
                        // The init function passes the rendering info so that PapervisionTween can take care of updating the renderer
                        PapervisionTween.init(renderer, scene, camera, viewport);
                }

                private function onFileProgress(event:FileLoadEvent):void {
                        if(VERBOSE) debug(\t percentage: “+Math.round((event.bytesLoaded/event.bytesTotal)*100) + “%”);
                        var sec:Number = 100/_array.length();
                        _loader.width = ((_count * sec) + ((event.bytesLoaded/event.bytesTotal) * sec));
                }

                private function onFileComplete(event:FileLoadEvent):void {
                        if(VERBOSE) debug(“complete!”);
                        //
                        _count++;
                        if (_count == _array.length()) {
                                onImageQueueCompleteHandler();
                        }
                }

                private function onImageQueueCompleteHandler():void {
                       
                        // PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system  
                        var l:PapervisionTween = new PapervisionTween(_loader, {alpha:0}, 0, .2, Quintic.easeInOut, loaderFade);
                        l.start();
                       
                        // PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system  
                        var b:PapervisionTween = new PapervisionTween(_planeArray[0], {rotationY:0}, 0, 1, Quintic.easeInOut, onFlipDone);
                        b.start();
                       
                        // PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system  
                        var c:PapervisionTween = new PapervisionTween(camera, {z:-100}, 0, 1, Quintic.easeInOut, onFlipDone);
                        c.start();
                       
                        _next = 0;

                        _count = -1;
                       
                        bg = new Plane(white,5120,2560,10,10);
                        bg.y = -200;
                        bg.z = 500;
                        bg.pitch(0);
                       
                        scene.addChild(bg);
                        dispatchEvent(new FlipEvent(FlipEvent.COMPLETE, _next, _array[0].attribute(‘link’), _array[0].attribute(‘target’)));
                       
                        var myTimer:Timer = new Timer(_seconds * 1000);
                        myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
                        myTimer.start();
                }

                private function flip(id:int):void {
                        // PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system    
                        var a:PapervisionTween = new PapervisionTween(_planeArray[_next], {rotationY:180}, 0, 1, Quintic.easeInOut, onOldFlipDone);
                        a.start();
                       
                        // Update Data
                        _prev = _next;
                        _next = (id == _array.length() - 1) ? 0 : id + 1;
                        var url:String = _array[_next].attribute(‘link’);
                        var targ:String = _array[_next].attribute(‘target’);
                        trace(url, targ);
                        dispatchEvent(new FlipEvent(FlipEvent.ON_FLIP, _next, url, targ));
                       
                        // PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system  
                        var b:PapervisionTween = new PapervisionTween(_planeArray[_next], {rotationY:0}, 0, 1, Quintic.easeInOut, onFlipDone);
                        b.start();
                       
                        // PapervisionTween is extending LinearGo. PapervisionTween is a custom extension using custom syntax, running on the Go system  
                        var c:PapervisionTween = new PapervisionTween(camera, {z:-350}, 0, .5, Quintic.easeIn, onCameraHalf);
                        c.start();
                }
               
                private function onCameraHalf(event:Event = null):void {
                        viewport.alpha  = 1;
                        var c:PapervisionTween = new PapervisionTween(camera, {z:-100}, 0, .5, Quintic.easeOut);
                        c.start();
                }

                public function timerHandler(event:TimerEvent):void {
                        if(VERBOSE) debug(“timerHandler: “ + event);
                        _count = (_count == _array.length() - 1) ? 0 : _count + 1;
                        flip(_count);
                }

                private function onFlipDone(event:Event = null):void {
                        if(VERBOSE) debug(“flip done!”);
                }

                private function loaderFade(event:Event = null):void {
                        viewport.alpha  = 1;
                        _scope.removeChild(_loader);
                }

                private function onOldFlipDone(event:Event = null):void {
                        if(VERBOSE) debug(“old flip done!”);
                        _planeArray[_prev].rotationY = -180;
                }
        }
}

And if you are curious here is the PapervisionTween extension of Go:

/**
 * Copyright (c) 2007 Moses Gunesch, MosesSupposes.com - Donovan Adams, blog.hydrotik.com
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

 
package com.hydrotik.go {
        import flash.display.DisplayObject;

        import org.fuseproject.go.items.LinearGo;
        import org.papervision3d.objects.DisplayObject3D;
       
        //import flash.geom.ColorTransform;
        //import flash.filters.BlurFilter;
        //import flash.geom.Point;     

        /**
         * A basic example of how you could build a tween on LinearGo.
         */

        public class PapervisionTween extends LinearGo {

                // -== Public Properties ==-
                public function get width() : Number {
                        return _rotationY;
                }

                public function set width(value : Number) : void {
                        if (_state == STOPPED)
                                _rotationY = value;
                }            

                public function get startWidth() : Number {
                        return _startRotationY;
                }

                public function set startWidth(value : Number) : void {
                        if (_state == STOPPED)
                                _startRotationY = value;
                }            

                public function get target() : DisplayObject {
                        return _target;
                }

                public function set target(obj : DisplayObject) : void {
                        if (_state == STOPPED)
                                _target = obj;
                }

                // -== Protected Properties ==-
                protected var _target : *;

                protected var _rotationY : Number;
               
                private static var _viewport:*;
               
                private static var _camera:*;
               
                private static var _scene:*;
               
                private static var _renderer : *;
               
                private var _closure : Function;

                private var debug : Function;

                protected var _startRotationY : Number;

                protected var _changeRotationY : Number;

                protected var _startProps : Object = {};

                protected var _changeProps : Object = {};

                protected var _propsTo : Object = {};
               
               
                public static function init(renderer:*, scene:*, camera:*, viewport:*):void{
                        _renderer = renderer;
                        _scene = scene;
                        _camera = camera;
                        _viewport = viewport;
                }

                // -== Public Methods ==-
                public function PapervisionTween(
                                        target:* = null,
                                        propsTo:Object = null,
                                        delay:Number = NaN,
                                        duration:Number = NaN,
                                        easing:Function = null,
                                        closure:Function = null)
                {                     
                        super(delay, duration, easing);
                        debug = trace;
                        _target = target;
                        if(closure != null) addCallback(closure);
                        for (var prop in propsTo) {
                                switch (prop) {
                                        case “alpha”:
                                                if(_target is DisplayObject){
                                                        _propsTo[prop] = (propsTo[prop] != undefined) ? propsTo[prop] : _target[prop]
                                                }
                                                if(_target is DisplayObject3D){
                                                        if(propsTo[prop] != undefined){
                                                                _propsTo[prop] = propsTo[prop];
                                                        }else{
                                                                _target.extra[prop] = new Number(1);
                                                                _propsTo[prop] = _target.extra[prop] = _target.extra[prop];
                                                        }
                                                }
                                                break;
                                        default:
                                                _propsTo[prop] = (propsTo[prop] != undefined) ? propsTo[prop] : _target[prop];
                                }
                        }
                }

                override public function start( ) :Boolean {
                        if (!_target) return false;
                        var prop:String;
                        for (prop in _propsTo) {
                                switch (prop) {
                                        case “alpha”:
                                                if(_target is DisplayObject){
                                                        _startProps[prop] = _target[prop];
                                                }
                                                if(_target is DisplayObject3D){
                                                        trace(“start: “+_target.extra[prop]);
                                                        _startProps[prop] = _target.extra[prop];       
                                                }
                                                break;
                                        default:
                                                _startProps[prop] = _target[prop];
                                }
                        }
                       
                        if (useRelative) {
                                for (prop in _propsTo) {
                                    _changeProps[prop] = _propsTo[prop];
                                }
                        }
                        else {
                                for (prop in _propsTo) {
                                    _changeProps[prop] = (_propsTo[prop] - _startProps[prop]); //_propsTo[prop];
                                }
                        }
                       
                        return (super.start());
                }
               
                //TODO add alpha tweening syntax when released in 2.0 update
                override protected function onUpdate(type:String) : void {
                        for (var prop in _propsTo) {
                                switch (prop) {
                                        case “alpha”:
                                                if(_target is DisplayObject3D){
                                                        //var val:Number = super.correctValue(_startProps[prop] + _changeProps[prop] * _position);
                                                        //_target.material.bitmap.colorTransform(_target.material.bitmap.rect, new ColorTransform(1, 1, 1, val, 0, 0, 0, 0));
                                                        //_target.extra[prop] = val;
                                                        debug(“Current version of Pv3D does not support alpha tweening”);
                                                }
                                                if(_target is DisplayObject) _target[prop] = super.correctValue(_startProps[prop] + _changeProps[prop] * _position);
                                                break;
                                        default:
                                                _target[prop] = super.correctValue(_startProps[prop] + _changeProps[prop] * _position);
                                }
                        }
                        if(_target is DisplayObject3D) _renderer.renderScene(_scene,_camera,_viewport);
                }
               
        }
}

I plan on adding effects as well as the alpha property when 2.0 is able to support that. Shadows, layer effects, and more still to come!


Papervision 2.0 Flipping Banner Source Part 1

Monday, December 10th, 2007

Papervision 2.0

Had a great time at the Papervision 2.0 seminar with John Grden and Andy Zupko here in NYC. Lot of eager people braving the cold snowy weather. It was slow at times trying to get everyone going on Flex. This gave me time to get the demos working in AS3 only FDT projects. Hopefully with John’s and Andy’s blessing I can put those demos here on the blog :)

Tuesday, December 4th, 2007

AS3 Papervision + Sound Visualizer + Line3D + Tweener - Part 2 FF07

So here’s my Flash Forward inspired piece!

Once again used Andy’s great Line3D class and gave it a Flash Forward 07 twist.

package com.hydrotik {

        import flash.events.Event;
        import flash.display.*;
        import flash.net.URLRequest;
        import flash.media.Sound;
        import flash.media.SoundChannel;
        import flash.media.SoundMixer;
        import flash.utils.ByteArray;
        import caurina.transitions.Tweener;
        import org.papervision3d.core.proto.*;
        import org.papervision3d.core.geom.*;
        import org.papervision3d.scenes.*;
        import org.papervision3d.cameras.*;
        import org.papervision3d.objects.*;
        import org.papervision3d.materials.*;

        public class Hydro3D extends Sprite {
               
                private static const LOOP:String = “../flashassets/mp3/jens_buchert.mp3″;
               
                private const STAGE_WIDTH              :Number = 600;
                private const STAGE_HEIGHT            :Number = 300;
                private const ANIMATION_TIME    :Number = 1;
                private const ANIMATION_TYPE    :String = “easeoutquad”;
                private const MULT                        :int = 10;
                private var controlPoints              :Array;
                private var itemArray         :Array;
                private var trailArray      :Array;
                private var currTrailArray            :Array;
                private var lineArray         :Array;
                private var count                            :int = 0;
                private var container       :Sprite;
                private var scene           :MovieScene3D;
                private var camera          :Camera3D;
                private var sc          :SoundChannel;
                private var s               :Sound;
                private var lines                        :Line3D;

                public function Hydro3D():void {

                        controlPoints = [];
                        itemArray = [];
                        trailArray = [];
                        currTrailArray = [];
                        lineArray = [];
                       
                        s = new Sound();
                        s.load(new URLRequest(LOOP));
                        sc = s.play(0, 1000);
                       
                        //container
                        container = new Sprite();
                        container.cacheAsBitmap = true;
                        addChild( container );
                        container.x = STAGE_WIDTH/2;
                        container.y = STAGE_HEIGHT/2;
                       
                        //scene
                        scene = new MovieScene3D( container );
                       
                        //camera
                        camera = new Camera3D();
                        camera.z = -200;
                       
                        addEventListener( Event.ENTER_FRAME, onEnterFrame );
                }
               
               
                private function onEnterFrame( event: Event ):void {
                        camera.x +=((container.mouseX*10) - camera.x) * 0.005;
                        camera.y +=((container.mouseY*10) - camera.y) * 0.005;

                        var bytes:ByteArray = new ByteArray();
                        SoundMixer.computeSpectrum(bytes, false, 0);
                       
                        var amp:Number = ((sc.leftPeak + sc.rightPeak)/2);
                       
                        lineArray[count] = new Line3D([new Vertex3D(-128, 0, -(count * MULT))], rgbToHex(count/4, count/6, count), 1, 1);
                        scene.addChild(lineArray[count]);
                       
                        for(var i:int = 0; i < 256; i++){
                                var v:Vertex3D = new Vertex3D((i*2) - 128, bytes.readFloat() * 300, -(count * MULT));
                                lineArray[count].addVertex(v);
                        }
                       
                        Tweener.addTween(lineArray[count], {
                                                alpha:0,
                                                time:ANIMATION_TIME,
                                                transition:ANIMATION_TYPE,
                                                onComplete:removeLine,
                                                onCompleteParams:[lineArray[count]]
                                        });
                       
                        scene.renderCamera( camera );
                        count = (count < 50) ? count + 1 : 0;
                };
               
                private function removeLine(l:Line3D = null):void{
                        scene.removeChild(l);
                }
               
                public function rgbToHex(uR:uint, uG:uint, uB:uint):int{
            var uColor:uint;
            uColor =  (uR & 255) << 16;
            uColor += (uG & 255) << 8;
            uColor += (uB & 255);
            return uColor;
        }

        }
}

I didn’t do anything with the amplitude but I left it in there if you decide you want to play with it. It’s somewhat processor intensive. I wish external mp3’s would loop. You’d think Adobe would have addressed that by now. Because of that, you’d want to attach it from your library, but I think it’s ok for testing. Helps you find a good loop that gives you good results when playing with a visualizer. Just overwrite the mp3 file or switch the path.

Once again the loop I’m using:

Jens Buchert
The music is the song “Mélange Eléctrique” from Jens Buchert’s album Spa Lounge. Great downtempo album.


Lines3D Part 2 Source

Thursday, September 20th, 2007

Papervision + Tweener + AS3 - Flipping Banner

UPDATE: Since I’m having problems with the SWF embedding, download the files to preview. Also be sure to check out the newer version with PV3D 2.0

Here’s a little simple and practical application I had to put together for work using papervision. Nothing to write home about. Just a real world example that proves how easy it is to add papervision to your daily workflow. All this does is load a set of images from an XML file and papervision transitions from one to the other by flipping the plane using Tweener.

Core class:

package com.hydrotik.pageflip{

        /**
         * @author Donovan Adams
         * @version Sept 16, 2007
         * @description Papervision Page flip example
         *
         */

        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        import flash.net.navigateToURL;
        import flash.display.Sprite;
        import flash.display.MovieClip;
        import flash.display.Stage;
        import flash.display.DisplayObject;
        import flash.display.Shape;
        import flash.text.StyleSheet;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import flash.text.TextFieldAutoSize;
        import flash.filters.BlurFilter;

        import caurina.transitions.Tweener;

        import com.hydrotik.utils.XMLManager;
        import com.hydrotik.pageflip.Flip;
        import com.hydrotik.pageflip.FlipEvent;

        public class Core extends Sprite {

                private var _scope:MovieClip;

                private var _stage:Stage;

                private var _url:String;

                private var _xml:XML;

                private var url:String;

                private var _hit:Sprite;

                public function Core(scope:MovieClip, stage:Stage):void {
                        _scope = scope;
                        _stage = stage;
                        _url = _scope.loaderInfo.url;
                        var xml:XMLManager = new XMLManager(“../includes/admin/flippingbanner.xml”);
                        xml.addEventListener(“evtXMLLoaded”, onXMLComplete);
                }

                // –== Private Methods ==–
                private function onXMLComplete(event:Event):void {
                        trace(“:: onXMLComplete:”);
                        _xml = event.target.xml;

                        var _oFlip:Flip = new Flip(_scope, _stage, this, _xml.banner.children(), _xml.attribute(“seconds”));
                        _oFlip.addEventListener(FlipEvent.COMPLETE, onCompleteHandler);
                        _oFlip.addEventListener(FlipEvent.ON_FLIP, onFlipHandler);

                        _hit = new Sprite();
                        _hit.graphics.beginFill(0×660000, 0);
                        _hit.graphics.drawRect(0, 0, 300