[AS3.0] Animated Reflection Class

In my previous post i had made a reflection class which makes a nice and need reflection for you. But when you want to reflect an animated clip it did not animate the reflection. Well….. i have made an upgrade on that Reflection class and now you can pass in a parameter if it’s animated or not.


Demo:
Animated Reflection


Usage:
var refl :Reflection = new Reflection( your_clip_to_be_reflected,
reflection_height,
reflection_strenght,
reflection_yOffset,
animated boolean ) ;

addChild( refl );


View CodeACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package
{
	import flash.display.*;
	import flash.geom.*;
	import flash.events.*;
 
	public class Reflection extends Sprite
	{
		//publics:
		public var reflectedClip      :DisplayObjectContainer;
		public var reflectionHeight   :Number;
		public var reflectionStrength :Number;
		public var reflectionOffsetY  :Number;
		public var animating          :Boolean = false;
 
		//privates:
		private var reflectionHolder  :Sprite;
		private var bm_reflection     :Bitmap;
		private var refMask           :Sprite;
		private var animated          :Boolean;
 
		//////////////////////////////////////////////
		//               CONSTRUCTOR:
		//////////////////////////////////////////////
		public function Reflection( reflectedClip:DisplayObjectContainer, height:Number = 255, strength:Number = 1, reflectionOffsetY:Number = 1, animated:Boolean = false )
		{
			this.reflectedClip       = reflectedClip;
			this.reflectionHeight    = height;
			this.reflectionStrength  = strength;
			this.reflectionOffsetY   = reflectionOffsetY;
			this.animated            = animated;
			build();
		}
 
		//////////////////////////////////////////////
		//               BUILDER FUNCTIONS:
		//////////////////////////////////////////////
		private function build():void
		{
			buildReflection ();
			attachItems     ();
			positionElements();
 
			if ( animated )
				setListeners();
		}
 
		private function buildReflection():void
		{
			reflectionHolder = new Sprite();
 
			var bmd:BitmapData = new BitmapData( reflectedClip.width, reflectedClip.height, true, 0xc61916 );
			bmd.draw( reflectedClip );
 
			bm_reflection             = new Bitmap( bmd );
			bm_reflection.y           = bm_reflection.height;
			bm_reflection.x           = 0;
			bm_reflection.rotation    = 180;
			bm_reflection.scaleX      = -1;
			bm_reflection.alpha       = reflectionStrength;
 
			refMask                   = new Sprite();
			var fillType      :String = GradientType.LINEAR;
			var colors        :Array  = [0xFFFFFF, 0x0000FF];
			var alphas        :Array  = [100, 0];
			var ratios        :Array  = [0, reflectionHeight];
			var matr          :Matrix = new Matrix();
			var spreadMethod  :String = SpreadMethod.PAD;
 
			matr.createGradientBox(reflectedClip.height * .9, reflectedClip.width, 0,0, 0);
			refMask.graphics.beginGradientFill(fillType, colors, alphas, ratios, matr, spreadMethod);
			refMask.graphics.drawRect(0, 0, reflectedClip.height, reflectedClip.width);
 
			refMask.y                        = 0;
			refMask.x                        = bm_reflection.width
			refMask.rotation                 = 90;
 
			bm_reflection.cacheAsBitmap      = true;
			refMask.cacheAsBitmap            = true;
			bm_reflection.mask               = refMask;
		}
 
		private function setListeners():void
		{
			animationRender( true );
		}
 
		//////////////////////////////////////////////
		//        ATTACHER & POSITION FUNCTIONS:
		//////////////////////////////////////////////
		private function attachItems():void
		{
			this.addChild( reflectionHolder );
			reflectionHolder.addChild( bm_reflection );
			reflectionHolder.addChild( refMask );
		}
 
		private function positionElements():void
		{
			this.x = reflectedClip.x;
			this.y = reflectedClip.y + reflectedClip.height + reflectionOffsetY;
		}
 
		//////////////////////////////////////////////
		//       ANIMATION RENDERER:
		//////////////////////////////////////////////
		public function animationRender( confirm:Boolean ):void
		{
			if ( confirm )
			{
				animating = true;
				this.addEventListener( Event.ENTER_FRAME, render )
			}
			else
			{
				animating = false
				this.removeEventListener( Event.ENTER_FRAME, render )
			}
		}
 
		private function render( evt:Event ):void
		{
			bm_reflection.bitmapData.fillRect( bm_reflection.getRect(bm_reflection), 0x00ffffff );
			bm_reflection.bitmapData.draw( reflectedClip )
		}
 
		//////////////////////////////////////////////
		//               KILL FUNCTION:
		//////////////////////////////////////////////
		public function kill():void
		{
			reflectionHolder.removeChild( refMask );
			reflectionHolder.removeChild( bm_reflection );
			this.removeChild( reflectionHolder );
		}
	}
}


Have fun,
Rackdoll

Comments are closed.


Categories
Archives
LinkedIn
R. Kollau