程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> 在J2me中實現水波紋成果

在J2me中實現水波紋成果

編輯:J2ME
經常在有的網站上面看到一些比擬壯麗的水波紋後果。實在,這些都是粒子系統的程序實現。在JSP開發中,已經供給了許多這種殊效的實現代碼。現在,由於cldc1.1已經支撐浮點數運算,所以,我們可以直接在J2ME中實現如圖所示的殊效:Java 代碼 
  1. import Javax.microedition.lcdui.game.*;  import Javax.microedition.lcdui.*;  public class SplashCanvas extends Canvas implements Runnable{  
  2.       Image img;  
  3.     Image imgBuff;      Graphics ibg;  
  4.     int w,h;      int num=0;  
  5.     double angle;      int wave;  
  6.       public SplashCanvas() {  
  7.         this.setFullScreenMode(true);          try{  
  8.             init();          }  
  9.         catch(Exception e){    
  10.         }      }  
  11.       public void init() throws Exception  
  12.     {            img=Image.createImage("/1.png");  
  13.           w=img.getWidth();            h=img.getHeight();  
  14.           imgBuff=Image.createImage(2*w,h);            ibg=imgBuff.getGraphics();  
  15.   ibg.drawImage(img,0,0,0);       }  
  16.       public void paint(Graphics g) {  
  17.         g.setColor(255,255,255);          g.fillRect(0,0,g.getClipWidth(),g.getClipHeight());  
  18.         angle=num*Math.PI/6;          double parm = 14.0;  
  19.         for(int i=0;i        {  
  20.               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);  
  21.           }  
  22.         num=++num%12;          g.drawImage(img,10,0,0);  
  23.        g.drawRegion(imgBuff,0,0,2*w,h,Sprite.TRANS_MIRROR_ROT180,10,h,0);    
  24.     }    
  25.     public void run(){          while(true){  
  26.             try{                  Thread.sleep(
  27. 80);  
  28.                 repaint();              }  
  29.             catch(Exception e){    
  30.             }          }  
  31.     }  }  

      思考:

      該算法最要害部分采用了浮點數運算,由於只有cldc1.1才支撐,所以對水波紋殊效的通用性產生了質疑。實在,在cldc1.0也不是不能實現。首先,可以采用將int放大的方法來代替小數,例如,采用1400來表現1.4,最後對成果進行/1000處理。這也是J2ME中對於小數的通常處理。其次,可以按照放大int的思路來模仿sin,即,將sin的值放大1000倍以後,采用數組存放起來。

      當然,還可以采用開源的浮點數庫,例如,在J2MEpolish中就供給了HFloat這樣的類,遺憾的是,該類的實現效率很低。


      作者:pandonix

      日期:2007年9月4日

      版權聲明:可以任意轉載,轉載時請務必以超鏈接情勢標明文章原始出處和作者信息及本聲明

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved