您的位置:首页 > 其它

在J2me中实现水波纹效果

2010-09-15 16:39 281 查看
(源自:http://www.javaeye.com/topic/120527

在J2me中实现水波纹效果

作者:pandonix

日期:2007年9月4日

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明

原文地址:http://pandonix.javaeye.com

在J2me中实现水波纹效果
常常在有的网站上面看到一些比较绚丽的水波纹效果。其实,这些都是粒子系统的程序实现。在JSP开发中,已经提供了很多这种特效的实现代码。现在,由于cldc1.1已经支持浮点数运算,所以,我们可以直接在j2me中实现如图所示的特效:

java 代码

import javax.microedition.lcdui.game.*;

import javax.microedition.lcdui.*;

/**

*

*
Title: 在J2me中实现水波纹效果

*

*
Description:

*

*
Copyright: Copyright (c) 2007

*

*
Company:

*

* @author pandonix

* @version 1.0

*/

public class SplashCanvas extends Canvas implements Runnable{

Image img;

Image imgBuff;

Graphics ibg;

int w,h;

int num=0;

double angle;

int wave;

public SplashCanvas() {

this.setFullScreenMode(true);

try{

init();

}

catch(Exception e){

}

}

public void init() throws Exception

{

img=Image.createImage("/1.png");

w=img.getWidth();

h=img.getHeight();

imgBuff=Image.createImage(2*w,h);

ibg=imgBuff.getGraphics();

ibg.drawImage(img,0,0,0);

}

public void paint(Graphics g) {

g.setColor(255,255,255);

g.fillRect(0,0,g.getClipWidth(),g.getClipHeight());

angle=num*Math.PI/6;

double parm = 14.0;

for(int i=0;i

{

wave=(int)((i/parm+1)*Math.sin(h/parm*(h-i)/(i+1)+angle));

ibg.drawRegion(img, 0, i, w, 1, 0, 0, i + wave, 0);

}

num=++num%12;

g.drawImage(img,10,0,0);

g.drawRegion(imgBuff,0,0,2*w,h,Sprite.TRANS_MIRROR_ROT180,10,h,0);

}

public void run(){

while(true){

try{

Thread.sleep(80);

repaint();

}

catch(Exception e){

}

}

}

}

思考:

该算法最关键部分采用了浮点数运算,由于只有cldc1.1才支持,所以对水波纹特效的通用性产生了质疑。其实,在cldc1.0也不是不能实现。首先,可以采用将int放大的方式来代替小数,例如,采用1400来表示1.4,最后对结果进行/1000处理。这也是j2me中对于小数的通常处理。其次,可以按照放大int的思路来模拟sin,即,将sin的值放大1000倍以后,采用数组存放起来。

当然,还可以采用开源的浮点数库,例如,在j2mepolish中就提供了HFloat这样的类,遗憾的是,该类的实现效率很低。





描述:

大小: 21.4 KB

查看次数: 19

src.rar (1.8 KB)

描述:

下载次数: 73
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: