水波渲染
package org.gameeden.micro.effect;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
/**
* 水波渲染。
* @author Sol
* @since CLDC 1.1
*/
public final class WaveRenderer
{
private long time;
/**
* 绘制波动的图像。
* @param g 指定的Graphics上下文
* @param img 图像源
* @param inverted 是否颠倒图像
* @param power 波能(0.0-1.0)
* @param x_src 图像拷贝起始象素X坐标
* @param y_src 图像拷贝起始象素Y坐标
* @param width 图像拷贝宽
* @param height 图像拷贝高
* @param x_dest 锚点的象素X坐标
* @param y_dest 锚点的象素Y坐标
* @param anchor 图像锚点
* @throws IllegalArgumentException 如果参数错误则抛出此异常
*/
public void drawImage(Graphics g,Image img,boolean inverted,double power,int x_src,int y_src,int width,int height,int x_dest,int y_dest,int anchor) throws IllegalArgumentException
{
switch(anchor)
{
case Graphics.TOP|Graphics.LEFT:
case Graphics.TOP|Graphics.RIGHT:
case Graphics.TOP|Graphics.HCENTER:
case Graphics.BOTTOM|Graphics.LEFT:
case Graphics.BOTTOM|Graphics.RIGHT:
case Graphics.BOTTOM|Graphics.HCENTER:
case Graphics.VCENTER|Graphics.LEFT:
case Graphics.VCENTER|Graphics.RIGHT:
case Graphics.VCENTER|Graphics.HCENTER:
break;
default:
throw new IllegalArgumentException();
}
if(power<0||power>1)
{
throw new IllegalArgumentException();
}
if(x_src<0||y_src<0||width<0||height<0||x_src+width>img.getWidth()||y_src+height>img.getHeight())
{
throw new IllegalArgumentException();
}
int swing=height>>3;
int offsetX=-((anchor&Graphics.RIGHT)!=0?width:(anchor&Graphics.HCENTER)!=0?width>>1:0);
int offsetY=-((anchor&Graphics.BOTTOM)!=0?height:(anchor&Graphics.VCENTER)!=0?height>>1:0);
time++;
for(int n=0,offset;n<height;n++)
{
offset=(int)((swing*(n+20)*Math.sin((double)swing*(height-n)/(n+1)+time)/height)*power);
if(n+offset<0)
{
offset=-n;
}
else if(n+offset>=height)
{
offset=height-n-1;
}
g.setClip(x_dest+offsetX,y_dest+offsetY+n,width,1);
if(inverted)
{
g.drawImage(img,x_dest+offsetX-x_src,y_dest+offsetY-y_src-height+1+(n<<1)+offset,Graphics.LEFT|Graphics.TOP);
}
else
{
g.drawImage(img,x_dest+offsetX-x_src,y_dest+offsetY-y_src-offset,Graphics.LEFT|Graphics.TOP);
}
}
}
}
测试
import java.io.IOException;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import org.gameeden.micro.effect.WaveRenderer;
public final class TestMidlet extends MIDlet
{
public TestMidlet()
{
try
{
TestCanvas testCanvas=new TestCanvas();
Display.getDisplay(this).setCurrent(testCanvas);
new Thread(testCanvas).start();
}
catch(IOException e)
{
e.printStackTrace();
}
}
protected void startApp() throws MIDletStateChangeException
{
}
protected void pauseApp()
{
}
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException
{
}
}
final class TestCanvas extends GameCanvas implements Runnable
{
private WaveRenderer waveRenderer;
private int screenWidth;
private int screenHeight;
private int screenHalfWidth;
private int screenHalfHeight;
private Graphics g;
private Image img;
private int imgWidth;
private int imgHeight;
private int height;
public TestCanvas() throws IOException
{
super(false);
setFullScreenMode(true);
waveRenderer=new WaveRenderer();
screenWidth=getWidth();
screenHeight=getHeight();
screenHalfWidth=screenWidth>>1;
screenHalfHeight=screenHeight>>1;
g=getGraphics();
img=Image.createImage("/logo.png");
imgWidth=img.getWidth();
imgHeight=img.getHeight();
}
public void run()
{
while(true)
{
render();
flushGraphics();
try
{
Thread.sleep(50);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
public void render()
{
if(height+1<imgHeight)
{
height++;
}
g.setClip(0,0,screenWidth,screenHeight);
g.drawRegion(img,0,0,imgWidth,height,Sprite.TRANS_NONE,screenHalfWidth,screenHalfHeight,Graphics.HCENTER|Graphics.BOTTOM);
waveRenderer.drawImage(g,img,true,0.5,0,0,imgWidth,height,screenHalfWidth,screenHalfHeight,Graphics.HCENTER|Graphics.TOP);
}
}
CLDC1.1效果图(模拟器录制)
- src.rar (7.2 KB)
- 描述: CLDC1.1 源码(高精度模拟)
- 下载次数: 368
- src.rar (7.3 KB)
- 描述: CLDC1.0 源码(低精度模拟)
- 下载次数: 240
分享到:
相关推荐
最后,"效果图.gif" 文件可能是展示实现效果的示例,而 "CLDC11" 和 "CLDC10" 可能是包含具体实现代码的项目文件,分别对应 CLDC1.1 和 CLDC1.0 的实现。分析这些代码可以帮助理解不同版本间的实现差异。 总的来说...
- CLDC 1.1是CLDC的第二个版本,它在CLDC 1.0的基础上进行了增强,提供了更丰富的API和更好的性能优化。该版本主要是为了适应更复杂的移动应用需求,比如增强的网络功能和多媒体支持。 2. **源码结构** - 解压后...
这个压缩包 "j2me_cldc-1_1-fcs-src-winunix.zip" 包含了 CLDC 1.1 的完整源代码实现,是开发者深入了解和自定义 CLDC 运行环境的重要资料。 CLDC 是 J2ME 架构中的最低层,它提供了一个轻量级的虚拟机(KVM,即 K ...
"j2me直线轨迹源码(cldc1.0)"是一个项目,它专门实现了在CLDC 1.0环境下计算和绘制直线轨迹的功能。这通常与游戏开发有关,比如实现子弹或其他物体的运动轨迹。在2D游戏中,这种直线轨迹计算可以用于表示射出的...
Java技术在移动设备领域的应用主要通过J2ME(Java 2 Micro Edition)实现,而CLDC(Connected Limited Device Configuration)是J2ME的一部分,专为资源有限的设备如早期的移动电话、PDA等设计。CLDc1.0a规范是这一...
总之,"cldc1.0的json实现"项目提供了一种在资源受限的J2ME CLDC 1.0环境中处理JSON数据的方法,这对于开发基于AJAX的移动应用至关重要,因为这允许设备与服务器进行高效的数据交互,提升用户体验。
总的来说,"j2me_cldc-1_1-fcs-src-unix.zip"是一个包含J2ME CLDC1.1官方源代码的压缩包,对于理解J2ME虚拟机的运作机制,尤其是KVM的实现,以及进行虚拟机移植,都具有不可估量的价值。通过深入研究这些源码,...
通过以上步骤,开发者可以在J2ME环境中实现具有水波倒影效果的图像处理。在"J2ME实现的水波倒影.txt"文件中,很可能会详细描述每一步的具体实现方法、使用的类和方法,以及可能遇到的挑战和解决方案。这个文本文件是...
总结起来,J2ME CLDC是Java在嵌入式领域的关键组成部分,其轻量级的虚拟机设计是实现移动设备上Java应用程序的关键。通过研究和修改CLDC的源代码,开发者不仅可以提升应用的性能,还能深入了解Java在受限环境下的...
"j2me_虚拟机" 和 "j2me_cldc-1_0" 进一步强调了这是关于J2ME的虚拟机实现,特别是CLDC 1.0规范。虚拟机是执行Java字节码的关键组件,它负责解释和执行应用程序代码,并确保跨平台兼容性。 "www.pudn.com.txt" 文件...
**J2ME CLDC 1.1:Sun官方源代码详解** J2ME(Java 2 Micro Edition)是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如手机、智能手表等。在J2ME的体系结构中,CLDC(Connected Limited Device ...
标题中的 "cldc-1_1-fr-spec-ko_j2me_" 指的是 CLDC 1.1 的法语和韩语版规范,它是开发CLDC应用的基础文档。这个规范详细描述了CLDC 1.1的架构、API以及如何在目标设备上实现和运行Java应用。`CLDCSpecification1.1....
因此,这个资源包表明了可以在Cygwin环境下编译和运行CLDC 1.1及KVM 1.1。 标签“cldc kvm”直接对应了该资源的关键技术点,即与Java ME开发相关的CLDC和KVM。 压缩包内的文件列表提供了进一步的信息: 1. `...
【Cldc 1.1 Sun官方版源码J2me】是Java 2 Micro Edition (J2ME)开发中的一个重要组成部分,它主要用于移动设备和嵌入式系统的应用程序开发。J2ME是一个Java平台的子集,设计目标是适应资源有限的设备,如手机、电视...
这个"Sun J2ME CLDC 官方源码资料.rar"文件包含了CLDC 1.1版本的源码和相关文档,这对于Java手机游戏开发者来说是非常宝贵的资源。CLDC 1.1是CLDC的一个重要版本,它增加了对Java语言特性的支持,如异常处理、访问...
Android下实现的J2ME API类库,使用此SDK可以无缝将你J2ME APP移植成android APP, 支持MIDP2.0、cldc1.0,WMA,jsr75等常用API 20111204更新新版: 1 JAD.MF文件:增加屏幕方向设置 2 JAD.MF文件:增加游戏专用摇杆...
本篇将深入探讨如何使用J2ME实现WAP 1.0的解析,并介绍XMLPull库在其中的作用。 WAP 1.0主要使用WML(Wireless Markup Language)来编写页面,这是一种XML的方言,专为移动设备设计。WML文档结构简单,便于在资源...
1. 理解J2ME和MIDP 1.0的基本架构及API。 2. 学习如何在有限的资源下加载和处理地图数据,如使用瓦片地图系统。 3. 实现地图的显示,包括地图的平移、缩放和旋转操作。 4. 掌握绘制地图元素的方法,如道路、地标等。...
使用J2ME和WTK1.0开发手机游戏时,开发者需要熟悉MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device Configuration)这两个核心组件。MIDP提供了用户界面和网络通信的功能,而CLDC定义了...
《J2ME CLDC 1.0.4 源码在 Unix 平台上的移植与KVM解析》 Java 2 Micro Edition (J2ME) 是 Java 平台的一个重要分支,专为嵌入式设备和移动设备设计,提供轻量级的计算能力。在J2ME中,Connected Limited Device ...