水波渲染
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
分享到:
相关推荐
J2ME平台实现的水波倒影效果,包含CLDC1.1和CLDC1.0两个版本
j2me_cldc-1_1-fcs-src-winunix.rar cldc1.1源码
实现了cldc1.0下的直线轨迹运算 如果有更好的修改意见 请联系本人 谢谢
j2me cldc1.0的json实现,用来做mobile ajax的数据解析很有用。
java,j2me开发资料,有关cldc,编写手机程序使用
图像处理 image proccess 水波倒影效果,使用J2ME写的代码
cldc参考实现 包括kvm
J2ME CLDC1.1官方源代码, 有研究J2ME虚拟机移植的朋友共享
Android下实现的J2ME API类库,使用此SDK可以无缝将你J2ME APP移植成android APP, 支持MIDP2.0、cldc1.0,WMA,jsr75等常用API 20111204更新新版: 1 JAD.MF文件:增加屏幕方向设置 2 JAD.MF文件:增加游戏专用摇杆...
Sun J2me Cldc 官方源码资料,Cldc 1.1版本资料,一个专门用于J2ME手机游戏的开发包,很多Java手机游戏开发者都会用到这个包。
已经移植好的java虚拟机,直接运行在ARM平台上!
JAVA版的贪吃蛇游戏,严格来说是J2ME的贪吃蛇,基于CLDC1.1版本,画面没怎么美化,不过程序内核加入了新的思路,还是值得看一下的。
通过j2me实现的wap 1.0的解析,能够解析基于wap1.0的wap网站,例如开心网,163等,解析是基于xmlpull 开源实现的
这是Cldc 1.1 Sun官方网的源码,也是一个用于J2ME手机游戏的开发包,很多J2ME开发者都会用到这个包,也是一种游戏开发必备工具。
内容索引:JAVA源码,游戏娱乐,Cldc,MIDP J2me Cldc是Sun官方的一个用于J2ME手机游戏的开发包,很多J2ME开发者都会用到这个包。
用在嵌入式设备上的JAVA虚拟机源码.并且已经修改过.
j2me cldc kvm移植 unix
J2ME+WTK1.0,wtk1.0,需要jdk1.41支持。用于基于J2ME的手机游戏开发。
J2ME 实现歌词滚动效果(在包 lrc目录里),另外还有其他一些入门级的实例,解压后倒入eclipse中 直接运行即可 (源码)
J2ME实现的断点续传,解决下载文件问题