經常在有的網站上面看到一些比擬壯麗的水波紋後果。實在,這些都是粒子系統的程序實現。在JSP開發中,已經供給了許多這種殊效的實現代碼。現在,由於cldc1.1已經支撐浮點數運算,所以,我們可以直接在J2ME中實現如圖所示的殊效:Java 代碼
- import Javax.microedition.lcdui.game.*; import Javax.microedition.lcdui.*; 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這樣的類,遺憾的是,該類的實現效率很低。
作者:pandonix
日期:2007年9月4日
版權聲明:可以任意轉載,轉載時請務必以超鏈接情勢標明文章原始出處和作者信息及本聲明