topical media & game development

talk show tell print

lib-flex-cover-com-dougmccune-containers-VCoverFlowContainer.ax

lib-flex-cover-com-dougmccune-containers-VCoverFlowContainer.ax (swf ) [ flash ] flex


  package com.dougmccune.containers
  {
          import caurina.transitions.Tweener;
          
          import flash.display.DisplayObject;
          import flash.geom.ColorTransform;
          
          import mx.core.EdgeMetrics;
          
          import org.papervision3d.objects.DisplayObject3D;
          
          public class @ax-lib-flex-cover-com-dougmccune-containers-VCoverFlowContainer extends CoverFlowContainer
          {
                  
                  
@private For the vertical coverflow container we don't want to ever show reflections. Where would we put them?

  
                  override public function set reflectionEnabled(value:Boolean):void {
                          super.reflectionEnabled = false;
                  }
                  
                  override protected function layoutCoverflow(unscaledWidth:Number, unscaledHeight:Number):void {
                          
                          var n:int = numChildren;
                          
                          for(var i:int=0; i<n; i++) {
                                  var child:DisplayObject = getChildAt(i);
                                  var plane:DisplayObject3D = lookupPlane(child);
                                  plane.container.visible = true;
                                  
                                  var abs:Number = Math.abs(selectedIndex - i);
                                  
                                  var horizontalGap:Number = getStyle("horizontalSpacing");
                                  if(isNaN(horizontalGap)) {
                                          horizontalGap = 10;
                                  }
                                  
                                  var verticalGap:Number = getStyle("verticalSpacing");
                                  if(isNaN(verticalGap)) {
                                          verticalGap = maxChildHeight/3;;
                                  }
                                  
                                  var yPosition:Number = selectedChild.height + ((abs-1) * verticalGap);
                                  var xPosition:Number = 0;
                                  var zPosition:Number = camera.z/2 + selectedChild.height + abs * horizontalGap;
                                  
                                  var zRotation:Number = rotationAngle;
                                  
                                  //some kinda fuzzy math here, I dunno, I was just playing with values
                                  //note that this only gets used if fadeEdges is true below
                                  var alpha:Number = (unscaledHeight/2 - yPosition) / (unscaledHeight/2);
                                  alpha  = Math.max(Math.min(alpha*2, 1), 0);
                                  
                                  if(i < selectedIndex) {
                                          yPosition *= -1;
                                          zRotation *= -1;
                                  }
                                  else if(i==selectedIndex) {
                                          yPosition = 0;
                                          zPosition = camera.z/2;
                                          zRotation = 0;
                                          alpha = 1;
                                  }
                                  
                                  if(fadeEdges) {
                                          //here's something sneaky. PV3D applies the colorTransform of the source movie clip to the
                                          //bitmapData that's created. So if we adjust the colorTransform that will be shown in the
                                          //3D plane as well. Cool, huh?
                                          var colorTransform:ColorTransform  = child.transform.colorTransform;
                                          colorTransform.alphaMultiplier = alpha;
                                          child.transform.colorTransform = colorTransform;
                                          plane.material.updateBitmap();
                                  }
                                  
                                  if(i!=selectedIndex) {
                                          Tweener.addTween(plane, {z:zPosition, time:tweenDuration/3});
                                          Tweener.addTween(plane, {x:xPosition, y:yPosition, rotationX:zRotation, time:tweenDuration});
                                  }
                                  else {
                                          Tweener.addTween(plane, {x:xPosition, y:yPosition, z:zPosition, rotationX:zRotation, time:tweenDuration});
                                  }
                                  
                                  if(i == selectedIndex) {
                                          var bm:EdgeMetrics = borderMetrics;
                  
                                          //We need to adjust the location of the selected child so
                                          //it exactly lines up with where our 3D plane will be. 
                                          child.x = unscaledWidth/2 - child.width/2 - bm.top;
                                          child.y = unscaledHeight/2 - child.height/2 - yPosition - bm.left;
                                          
                                          //the normal ViewStack sets the visibility of the selectedChild. That's no good for us,
                                          //so we just reset it back. 
                                          child.visible = false;
                                  }
                          }
                  }
          }
  }


(C) Æliens 18/6/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.