效果演示

主要源码如下

package {
    import starling.display.*;
    import starling.textures.*;
    import starling.events.EnterFrameEvent;
    import flash.display.BitmapData;
    import flash.geom.Point;
    import flash.display.Bitmap;
    import starling.filters.DisplacementMapFilter;
    import flash.display.BitmapDataChannel;

    public class StarlingWaterRipple extends Sprite {
	private var seed:int = Math.random() * 100;
        private var image:Image; // 显示的图片
        private var displacementMap:BitmapData; // 位移贴图
        private var displacementTexture:Texture; // Starling 纹理
        private var displacementFilter:DisplacementMapFilter; // 位移滤镜
        private var offsetX:Number = 0; // 水波流动的偏移量
        private var offsetY:Number = 0; 

	[Embed(source="assets/photo.jpeg")]
	private static var Photo:Class;

        public function StarlingWaterRipple() {
            // 加载图片
            var bitmap:Bitmap = new Photo(); // 替换成你的图片
            var texture:Texture = Texture.fromBitmap(bitmap);
            image = new Image(texture);
            addChild(image);

            // 创建位移贴图 (必须包含颜色通道信息)
            displacementMap = new BitmapData(image.width, image.height, false, 0x808080);
            displacementTexture = Texture.fromBitmapData(displacementMap);

            // 创建位移滤镜 (通道选择 RED 和 GREEN)
            displacementFilter = new DisplacementMapFilter(displacementTexture, BitmapDataChannel.RED, BitmapDataChannel.GREEN, 10, 10);
            image.filter = displacementFilter;

            // 监听帧更新
            addEventListener(EnterFrameEvent.ENTER_FRAME, updateRipple);
        }

        private function updateRipple(event:EnterFrameEvent):void {
            offsetX += 5; // 水波流动速度
            offsetY += 5;

            // 生成动态水波效果(必须使用 RED 和 GREEN 通道)
            displacementMap.perlinNoise(50, 50, 2, seed, false, true, BitmapDataChannel.RED | BitmapDataChannel.GREEN, false, [new Point(offsetX, offsetY)]);

            // 更新 Starling 纹理
            displacementTexture.root.uploadBitmapData(displacementMap);

            // 重新应用滤镜,确保效果生效
            image.filter = new DisplacementMapFilter(displacementTexture, BitmapDataChannel.RED, BitmapDataChannel.GREEN, 5, 5);
        }
    }
}