在J2me中实现水波纹效果

作者:pandonix

日期:2007年9月4日

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

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

 

在J2me中实现水波纹效果

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

java 代码
  1. import javax.microedition.lcdui.game.*;  
  2. import javax.microedition.lcdui.*;  
  3. /** 
  4.  * 
  5.  * 

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

     
  6.  * 
  7.  * 

    Description: 

     
  8.  * 
  9.  * 

    Copyright: Copyright (c) 2007

     
  10.  * 
  11.  * 

    Company: 

     
  12.  * 
  13.  * @author pandonix 
  14.  * @version 1.0 
  15.  */  
  16. public class SplashCanvas extends Canvas implements Runnable{  
  17.   
  18.     Image img;  
  19.     Image imgBuff;  
  20.     Graphics ibg;  
  21.     int w,h;  
  22.     int num=0;  
  23.     double angle;  
  24.     int wave;  
  25.   
  26.     public SplashCanvas() {  
  27.         this.setFullScreenMode(true);  
  28.         try{  
  29.             init();  
  30.         }  
  31.         catch(Exception e){  
  32.   
  33.         }  
  34.     }  
  35.   
  36.     public void init() throws Exception  
  37.     {  
  38.           img=Image.createImage("/1.png");  
  39.           w=img.getWidth();  
  40.           h=img.getHeight();  
  41.           imgBuff=Image.createImage(2*w,h);  
  42.           ibg=imgBuff.getGraphics();  
  43.           ibg.drawImage(img,0,0,0);  
  44.      }  
  45.   
  46.     public void paint(Graphics g) {  
  47.         g.setColor(255,255,255);  
  48.         g.fillRect(0,0,g.getClipWidth(),g.getClipHeight());  
  49.         angle=num*Math.PI/6;  
  50.         double parm = 14.0;  
  51.         for(int i=0;i
  52.         {  
  53.               wave=(int)((i/parm+1)*Math.sin(h/parm*(h-i)/(i+1)+angle));  
  54.                   ibg.drawRegion(img, 0, i, w, 100, i + wave, 0);  
  55.   
  56.         }  
  57.         num=++num%12;  
  58.         g.drawImage(img,10,0,0);  
  59.         g.drawRegion(imgBuff,0,0,2*w,h,Sprite.TRANS_MIRROR_ROT180,10,h,0);  
  60.   
  61.     }  
  62.   
  63.     public void run(){  
  64.         while(true){  
  65.             try{  
  66.                 Thread.sleep(80);  
  67.                 repaint();  
  68.             }  
  69.             catch(Exception e){  
  70.   
  71.             }  
  72.         }  
  73.     }  
  74. }  

思考:

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

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

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值