Last active
October 29, 2015 16:26
-
-
Save JordanMagnuson/1062f873e1e843bfc4bc to your computer and use it in GitHub Desktop.
This file contains 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
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