Skip to content

Instantly share code, notes, and snippets.

@Herschel
Created March 5, 2013 00:54
Show Gist options
  • Save Herschel/5087125 to your computer and use it in GitHub Desktop.
Save Herschel/5087125 to your computer and use it in GitHub Desktop.
Retro dithered transition effect for ActionScript 2
// 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