Created
March 5, 2013 00:54
-
-
Save Herschel/5087125 to your computer and use it in GitHub Desktop.
Retro dithered transition effect for ActionScript 2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// DITHERED FADER CODE | |
/* Usage: | |
f_FadeInit(pixelSize) - call at start of movie, pixelSize is size of pixels | |
f_FaderFunction(time, color, callback, extra); | |
f_FaderFunction can be f_FadeDissolve, f_FadeDither, f_FadeDitherGradient | |
time - Time the fade takes to complete | |
color - Color of the fade (0 to fade in) | |
extra - For gradient fades, determines the fade origon | |
*/ | |
f_FadeInit(2); | |
var FADE_TIME:Number = 1.0; | |
function randomColor():Number { return int(0xff000000 | int(Math.random()*0xff)<<16 | int(Math.random()*0xff)<<8 | int(Math.random()*0xff)); } | |
function fadeIn() | |
{ | |
switch(random(5)) | |
{ | |
case 0: f_FadeDissolve(FADE_TIME, randomColor(), fadeIn); break; | |
case 1: f_FadeDither(FADE_TIME, randomColor(), fadeIn); break; | |
case 2: f_FadeDitherGradient(FADE_TIME, randomColor(), fadeIn, "top"); break; | |
case 3: f_FadeDitherGradient(FADE_TIME, randomColor(), fadeIn, "middle"); break; | |
case 4: f_FadeDitherGradient(FADE_TIME, randomColor(), fadeIn, "bottom"); break; | |
} | |
} | |
fadeIn(); | |
import flash.geom.Point; | |
import flash.display.BitmapData; | |
var fadeBitmap:BitmapData | |
var fadeMc:MovieClip; | |
var fadeCurTime:Number; | |
var fadeTotalTime:Number; | |
var fadeColor:Number; | |
var fadeCallback:Function; | |
var dissolveSeed:Number; | |
var dissolvePixelsPerTick:Number; | |
var ditherStep:Number; | |
var ditherGradientSteps:Array = new Array(16); | |
var ditherGradientAlign:Number; | |
var ditherSequence:Array = [[0,0],[2,2],[2,0],[0,2],[1,1],[3,3],[3,1],[1,3],[1,0],[3,2],[3,0],[1,2],[0,1],[2,3],[2,1],[0,3]]; | |
/*[ | |
[1/17, 13/17, 4/17, 16/17], | |
[9/17, 5/17, 12/17, 8/17], | |
[3/17, 15/17, 2/17, 14/17], | |
[11/17, 7/17, 10/17, 6/17] | |
];*/ | |
function f_FadeInit(pixelSize:Number, depth:Number):Void | |
{ | |
if(fadeBitmap) fadeBitmap.dispose(); | |
if(fadeMc) fadeMc.removeMovieClip(); | |
pixelSize = int(pixelSize); | |
if(pixelSize < 1) pixelSize = 1; | |
if(!depth || isNaN(depth)) depth = 16000; | |
fadeBitmap = new BitmapData(Math.ceil(Stage.width/pixelSize), Math.ceil(Stage.height/pixelSize), true, 0); | |
fadeMc = createEmptyMovieClip("fadeMc", depth); | |
fadeMc.attachBitmap(fadeBitmap, 0); | |
fadeMc._xscale = fadeMc._yscale = 100*pixelSize; | |
} | |
function f_FadeDissolve(time:Number, color:Number, completeCallback:Function):Void | |
{ | |
dissolvePixelsPerTick = Math.ceil(fadeBitmap.width * fadeBitmap.height / (time*30)); | |
dissolveSeed = int(Math.random()*10000); | |
fadeCurTime = 0; | |
fadeTotalTime = Math.ceil(time*30); | |
fadeCallback = completeCallback; | |
fadeColor = color; | |
fadeMc.onEnterFrame = dissolveTick; | |
} | |
function f_FadeDither(time:Number, color:Number, completeCallback:Function):Void | |
{ | |
fadeCurTime = 0; | |
fadeTotalTime = Math.ceil(time*30); | |
fadeCallback = completeCallback; | |
fadeColor = color; | |
fadeMc.onEnterFrame = ditherTick; | |
ditherStep = 0; | |
} | |
function f_FadeDitherGradient(time:Number, color:Number, completeCallback:Function, align:String):Void | |
{ | |
fadeCurTime = 0; | |
fadeTotalTime = Math.ceil(time*30); | |
fadeCallback = completeCallback; | |
fadeColor = color; | |
fadeMc.onEnterFrame = ditherGradientTick; | |
for(var i:Number=0; i<16; i++) | |
ditherGradientSteps[i] = 0; | |
switch(align.toLowerCase()) | |
{ | |
case "middle": ditherGradientAlign = 1; break; | |
case "bottom": ditherGradientAlign = 2; break; | |
default: | |
case "top": ditherGradientAlign = 0; | |
} | |
} | |
function f_FadeClear(color:Number):Void | |
{ | |
if(color == undefined || isNaN(color)) | |
color = 0; | |
fadeBitmap.fillRect(fadeBitmap.rectangle, color); | |
fadeMc.onEnterFrame = null; | |
} | |
function dissolveTick():Void | |
{ | |
dissolveSeed = fadeBitmap.pixelDissolve(fadeBitmap, fadeBitmap.rectangle, null, dissolveSeed, dissolvePixelsPerTick, fadeColor); | |
fadeCurTime++; | |
if(fadeCurTime >= fadeTotalTime) | |
{ | |
fadeMc.onEnterFrame = null; | |
fadeCallback(); | |
} | |
} | |
function ditherTick():Void | |
{ | |
fadeCurTime++; | |
var percent:Number = fadeCurTime / fadeTotalTime; | |
while(percent - ditherStep/17 >= 1/17 && ditherStep < 16) | |
{ | |
var x:Number; | |
var y:Number; | |
for(x = ditherSequence[ditherStep][0]; x<fadeBitmap.width; x+=4) | |
{ | |
for(y = ditherSequence[ditherStep][1]; y<fadeBitmap.height; y+=4) | |
{ | |
fadeBitmap.setPixel32(x, y, fadeColor); | |
} | |
} | |
ditherStep++; | |
} | |
if(fadeCurTime >= fadeTotalTime) | |
{ | |
fadeMc.onEnterFrame = null; | |
fadeCallback(); | |
} | |
} | |
function ditherGradientTick():Void | |
{ | |
fadeCurTime++; | |
var x:Number; | |
var y:Number; | |
var i:Number; | |
for(i=0; i<16; i++) | |
{ | |
var percent:Number | |
if(ditherGradientAlign == 0) percent = (fadeCurTime - i*(fadeTotalTime*0.5)/16) / (fadeTotalTime*0.5); | |
else if(ditherGradientAlign == 1) percent = (fadeCurTime - Math.abs(8-i)*(fadeTotalTime*0.5)/8) / (fadeTotalTime*0.5); | |
else percent = (fadeCurTime - (15-i)*(fadeTotalTime*0.5)/16) / (fadeTotalTime*0.5); | |
while(percent >= 0 && percent - ditherGradientSteps[i]/17 >= 1/17 && ditherGradientSteps[i] < 16) | |
{ | |
var hStart:Number = i*Math.ceil(fadeBitmap.height/16); | |
var hEnd:Number = (i+1)*Math.ceil(fadeBitmap.height/16); | |
if(hEnd > fadeBitmap.height) hEnd=fadeBitmap.height; | |
for(x = ditherSequence[ditherGradientSteps[i]][0]; x<fadeBitmap.width; x+=4) | |
{ | |
for(y = hStart + ditherSequence[ditherGradientSteps[i]][1]; y<hEnd; y+=4) | |
{ | |
fadeBitmap.setPixel32(x, y, fadeColor); | |
} | |
} | |
ditherGradientSteps[i]++; | |
} | |
} | |
if(fadeCurTime >= fadeTotalTime) | |
{ | |
fadeMc.onEnterFrame = null; | |
fadeCallback(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment