首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java Swing模拟水波纹扩散效果动画片

2013-11-04 
Java Swing模拟水波纹扩散效果动画基于Java语言模拟水波纹运动效果,分为两种方法,一种采用简单的叠加计算

Java Swing模拟水波纹扩散效果动画

基于Java语言模拟水波纹运动效果,分为两种方法,一种采用简单的叠加计算

不使用sine函数模拟水波纹,好处是计算量小,另外一种采用sine函数来计算

水波纹扩展,计算量大,但是效果比较真实。


第一种简单的叠加效果水波模拟,是很多简单的2D游戏中会用的,关键是计

算水波的迁移,然后剩以能量衰减因子。Java实现的代码如下:


UI加水波计算的完全源代码如下:

package com.gloomyfish.water.ripple.study;import java.awt.image.BufferedImage;import com.gloomyfish.filter.study.AbstractBufferedImageOp;public class WaterPixelRender extends AbstractBufferedImageOp {private int[][] waveData;private double rIndex = 2.0;private int counter = 0;public WaterPixelRender(){}public int[][] getWaveData() {return waveData;}public void setWaveData(int[][] waveData) {this.waveData = waveData;}@Overridepublic BufferedImage filter(BufferedImage src, BufferedImage dest) {counter++;int width = src.getWidth();        int height = src.getHeight();        if ( dest == null )        dest = createCompatibleDestImage( src, null );        int[] inPixels = new int[width*height];        int[] outPixels = new int[width*height];        getRGB( src, 0, 0, width, height, inPixels );        int index = 0;        int nrow = 0, ncol = 0;        for(int row=0; row<height-1; row++) {        int ta = 0, tr = 0, tg = 0, tb = 0;        for(int col=0; col<width-1; col++) {                        int xDiff = waveData[row+1][col] - waveData[row][col];            int yDiff = waveData[row][col+1] - waveData[row][col];            double xAngle = Math.atan(xDiff);            double xRefraction = Math.asin( Math.sin( xAngle ) / rIndex );            double xDisplace = Math.tan( xRefraction ) * xDiff ;            double yAngle = Math.atan( yDiff );            double yRefraction = Math.asin( Math.sin( yAngle ) / rIndex );            double yDisplace =Math.tan(yRefraction ) * yDiff;            if(xDiff < 0)             {            if(yDiff < 0)            {            nrow = (int)(row - xDisplace);            ncol = (int)(col - yDisplace);            }            else            {            nrow = (int)(row - xDisplace);            ncol = (int)(col + yDisplace);            }            }            else            {            if(yDiff < 0)            {            nrow = (int)(row + xDisplace);            ncol = (int)(col - yDisplace);            }            else            {            nrow = (int)(row + xDisplace);            ncol = (int)(col + yDisplace);            }            }            if(nrow < 0 || nrow >= height)            {            nrow = 0;            }            if(ncol < 0 || ncol >= width)            {            ncol = 0;            }                                index = nrow * width + ncol;        ta = (inPixels[index] >> 24) & 0xff;                tr = (inPixels[index] >> 16) & 0xff;                tg = (inPixels[index] >> 8) & 0xff;                tb = inPixels[index] & 0xff;                index = row * width + col;                outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;        }        }        setRGB( dest, 0, 0, width, height, outPixels );        return dest;}}
复制代码以后替换图片路径即可运行,转载请注明出处

热点排行