Skip to content

Instantly share code, notes, and snippets.

@JordanMagnuson
Last active October 29, 2015 16:26
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JordanMagnuson/1062f873e1e843bfc4bc to your computer and use it in GitHub Desktop.
Save JordanMagnuson/1062f873e1e843bfc4bc to your computer and use it in GitHub Desktop.
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Point;
import flash.geom.Rectangle;
import net.flashpunk.graphics.Image;
import net.flashpunk.FP;
/**
* Extends FP's Image class, and create an image with a "ripple" effect when underwater.
*/
public class RippleImage extends Image
{
public var originalBitmapData:BitmapData;
public var t:Number = 0; // t is time elapsed, which is used to generate the sine wave offset value.
public function RippleImage(source:*, clipRect:Rectangle = null)
{
super(source, clipRect);
originalBitmapData = _source;
underwaterOverlay = FP.getBitmap(Assets.UNDERWATER_OVERLAY);
}
/** @private Renders the image. */
override public function render(target:BitmapData, point:Point, camera:Point):void
{
t += FP.elapsed;
applyRippleEffect();
super.render(target, point, camera);
}
public function applyRippleEffect():void
{
var displacedBitmapData:BitmapData = new BitmapData(originalBitmapData.width, originalBitmapData.height, true, 0);
var alphaBitmapData:BitmapData;
var offset:Number = 0;
var lastOffset:Number = 0;
var rect:Rectangle;
var pt:Point;
var waterLine:Number = Global.floatController.u(_point.x + originX // Water line can be set however you want. Could be constant.
for (var i:int = 0; i < originalBitmapData.height; i++) //Go through each row of pixels in originalBitmapData
{
offset = 0;
alphaBitmapData = null;
if ((_point.y) + i > waterLine)
{
// If we're below the water line, offset this line of pixels, and apply alpha data.
offset = getSinOffset(i, t);
alphaBitmapData = underwaterOverlay;
}
rect = new Rectangle(0, i, originalBitmapData.width, 1);
pt = new Point(offset, i);
displacedBitmapData.copyPixels(originalBitmapData, rect, pt, alphaBitmapData, null, false);
lastOffset = offset;
}
_source = displacedBitmapData;
updateBuffer();
}
/**
* Creates an offset based on a sine wave.
**/
public function getSinOffset(x:Number, t:Number):Number
{
var offset:Number;
offset = Math.sin(x/2 - 10*t); // These coeficients can be altered to taste.
offset = Math.round(offset);
return offset;
}
/**
* Creates a random offset... can be used instead of the sine wave offset.
*/
public function getRandomOffset(lastOffset:Number):Number
{
var offset:Number;
offset = lastOffset + FP.choose(0, -1, 1);
offset = FP.clamp(offset, -1, 1);
return offset;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment