`
Grindelwald
  • 浏览: 42108 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

J2ME实现水波倒影效果(CLDC1.1及CLDC1.0)

    博客分类:
  • J2ME
阅读更多
水波渲染
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)

    最后,"效果图.gif" 文件可能是展示实现效果的示例,而 "CLDC11" 和 "CLDC10" 可能是包含具体实现代码的项目文件,分别对应 CLDC1.1 和 CLDC1.0 的实现。分析这些代码可以帮助理解不同版本间的实现差异。 总的来说...

    j2me_cldc-1_1-fcs-src-winunix.rar cldc1.1源码

    - CLDC 1.1是CLDC的第二个版本,它在CLDC 1.0的基础上进行了增强,提供了更丰富的API和更好的性能优化。该版本主要是为了适应更复杂的移动应用需求,比如增强的网络功能和多媒体支持。 2. **源码结构** - 解压后...

    j2me_cldc-1_1-fcs-src-winunix.zip_j2me cldc_j2me_cldc_j2me_cldc-

    这个压缩包 "j2me_cldc-1_1-fcs-src-winunix.zip" 包含了 CLDC 1.1 的完整源代码实现,是开发者深入了解和自定义 CLDC 运行环境的重要资料。 CLDC 是 J2ME 架构中的最低层,它提供了一个轻量级的虚拟机(KVM,即 K ...

    j2me直线轨迹源码(cldc1.0)

    "j2me直线轨迹源码(cldc1.0)"是一个项目,它专门实现了在CLDC 1.0环境下计算和绘制直线轨迹的功能。这通常与游戏开发有关,比如实现子弹或其他物体的运动轨迹。在2D游戏中,这种直线轨迹计算可以用于表示射出的...

    cldc1.0a规范

    Java技术在移动设备领域的应用主要通过J2ME(Java 2 Micro Edition)实现,而CLDC(Connected Limited Device Configuration)是J2ME的一部分,专为资源有限的设备如早期的移动电话、PDA等设计。CLDc1.0a规范是这一...

    cldc1.0的json实现

    总之,"cldc1.0的json实现"项目提供了一种在资源受限的J2ME CLDC 1.0环境中处理JSON数据的方法,这对于开发基于AJAX的移动应用至关重要,因为这允许设备与服务器进行高效的数据交互,提升用户体验。

    j2me_cldc-1_1-fcs-src-unix.zip

    总的来说,"j2me_cldc-1_1-fcs-src-unix.zip"是一个包含J2ME CLDC1.1官方源代码的压缩包,对于理解J2ME虚拟机的运作机制,尤其是KVM的实现,以及进行虚拟机移植,都具有不可估量的价值。通过深入研究这些源码,...

    图像处理 image proccess 水波倒影效果

    通过以上步骤,开发者可以在J2ME环境中实现具有水波倒影效果的图像处理。在"J2ME实现的水波倒影.txt"文件中,很可能会详细描述每一步的具体实现方法、使用的类和方法,以及可能遇到的挑战和解决方案。这个文本文件是...

    j2me_cldc.rar_cldc_j2me_j2me_cldc_java 虚拟机_虚拟机

    总结起来,J2ME CLDC是Java在嵌入式领域的关键组成部分,其轻量级的虚拟机设计是实现移动设备上Java应用程序的关键。通过研究和修改CLDC的源代码,开发者不仅可以提升应用的性能,还能深入了解Java在受限环境下的...

    j2me_cldc-1_0_4-src-winunix.zip_arm java_j2me_j2me 虚拟机_j2me_cldc

    "j2me_虚拟机" 和 "j2me_cldc-1_0" 进一步强调了这是关于J2ME的虚拟机实现,特别是CLDC 1.0规范。虚拟机是执行Java字节码的关键组件,它负责解释和执行应用程序代码,并确保跨平台兼容性。 "www.pudn.com.txt" 文件...

    J2me Cldc 1.1 Sun官方源代码

    **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-fr-spec-ko_j2me_" 指的是 CLDC 1.1 的法语和韩语版规范,它是开发CLDC应用的基础文档。这个规范详细描述了CLDC 1.1的架构、API以及如何在目标设备上实现和运行Java应用。`CLDCSpecification1.1....

    可以在cygwin下面编译通过的cldc kvm 1.1

    因此,这个资源包表明了可以在Cygwin环境下编译和运行CLDC 1.1及KVM 1.1。 标签“cldc kvm”直接对应了该资源的关键技术点,即与Java ME开发相关的CLDC和KVM。 压缩包内的文件列表提供了进一步的信息: 1. `...

    Cldc 1.1 Sun官方版源码J2me

    【Cldc 1.1 Sun官方版源码J2me】是Java 2 Micro Edition (J2ME)开发中的一个重要组成部分,它主要用于移动设备和嵌入式系统的应用程序开发。J2ME是一个Java平台的子集,设计目标是适应资源有限的设备,如手机、电视...

    Sun J2me Cldc 官方源码资料.rar

    这个"Sun J2ME CLDC 官方源码资料.rar"文件包含了CLDC 1.1版本的源码和相关文档,这对于Java手机游戏开发者来说是非常宝贵的资源。CLDC 1.1是CLDC的一个重要版本,它增加了对Java语言特性的支持,如异常处理、访问...

    j2me_android_sdk_1.0

    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 的解析

    本篇将深入探讨如何使用J2ME实现WAP 1.0的解析,并介绍XMLPull库在其中的作用。 WAP 1.0主要使用WML(Wireless Markup Language)来编写页面,这是一种XML的方言,专为移动设备设计。WML文档结构简单,便于在资源...

    J2ME_make_map.rar_j2me_midp1.0

    1. 理解J2ME和MIDP 1.0的基本架构及API。 2. 学习如何在有限的资源下加载和处理地图数据,如使用瓦片地图系统。 3. 实现地图的显示,包括地图的平移、缩放和旋转操作。 4. 掌握绘制地图元素的方法,如道路、地标等。...

    J2ME+WTK1.0

    使用J2ME和WTK1.0开发手机游戏时,开发者需要熟悉MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device Configuration)这两个核心组件。MIDP提供了用户界面和网络通信的功能,而CLDC定义了...

    j2me_cldc_1.0.4_src_winunix

    《J2ME CLDC 1.0.4 源码在 Unix 平台上的移植与KVM解析》 Java 2 Micro Edition (J2ME) 是 Java 平台的一个重要分支,专为嵌入式设备和移动设备设计,提供轻量级的计算能力。在J2ME中,Connected Limited Device ...

Global site tag (gtag.js) - Google Analytics