topical media & game development
#graphic-flex-image-effects-07-source-aether-effects-carnival-KaleidoscopeEffect.ax
#graphic-flex-image-effects-07-source-aether-effects-carnival-KaleidoscopeEffect.ax
[swf]
[flash]
flex
package aether.effects.carnival {
import aether.effects.ImageEffect;
import aether.utils.MathUtil;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.Sprite;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.display.Shape;
public class @ax-graphic-flex-image-effects-07-source-aether-effects-carnival-KaleidoscopeEffect extends ImageEffect {
private var _startAngle:Number;
private var _segments:uint;
public function @ax-graphic-flex-image-effects-07-source-aether-effects-carnival-KaleidoscopeEffect(
segments:uint=8,
startAngle:Number=0,
blendMode:String=null,
alpha:Number=1
) {
init(blendMode, alpha);
_segments = segments;
if (_segments % 2 > 0) _segments++;
_startAngle = MathUtil.degreesToRadians(startAngle);
}
private function drawSegment(index:uint, segment:BitmapData, center:Point, angle:Number):Bitmap {
var bitmap:Bitmap = new Bitmap(segment);
if (index % 2 > 0) {
bitmap.scaleY = -1;
bitmap.rotation = (index+1)*angle;
} else {
bitmap.rotation = index*angle;
}
bitmap.x = center.x;
bitmap.y = center.y;
return bitmap;
}
override protected function applyEffect(bitmapData:BitmapData):void {
var w:Number = bitmapData.width;
var h:Number = bitmapData.height;
var r:Number = Math.min(w,h)/2;
var segmentAngle:Number = 360/_segments;
var theta:Number = MathUtil.degreesToRadians(segmentAngle);
var angle:Number = Math.PI-theta;
var x:Number = Math.cos(theta)*r;
var y:Number = Math.sin(theta)*r;
var matrix:Matrix = new Matrix();
matrix.translate(-w/2, -h/2);
matrix.rotate(-_startAngle);
var image:BitmapData = new BitmapData(w, h, true, 0x00000000);
image.draw(bitmapData, matrix);
var shape:Shape = new Shape();
shape.graphics.beginBitmapFill(image, null, false);
shape.graphics.lineTo(r, 0);
shape.graphics.lineTo(x, y);
shape.graphics.lineTo(0, 0);
shape.graphics.endFill();
var segment:BitmapData = new BitmapData(shape.width, shape.height, true, 0x00000000);
segment.draw(shape);
var sprite:Sprite = new Sprite();
var center:Point = new Point(w/2, h/2);
for (var i:uint; i < _segments; i++) {
sprite.addChild(drawSegment(i, segment, center, segmentAngle));
}
bitmapData.fillRect(bitmapData.rect, 0x00000000);
bitmapData.draw(sprite);
}
}
}
(C) Æliens
04/09/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.