日期:2014-05-20  浏览次数:20663 次

在J2me中实现水波纹效果

作者:pandonix

日期:200794

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

原文地址: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,?1,?0,?0,?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这样的类,遗憾的是,该类的实现效率很低。

?


1 楼 univasity 2008-04-29  
强~~ 谢谢分享