效果演示
主要源码如下
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);
}
}
}