作者:潇潇  出处:www.j2mefans.com
该文章为本站原创,如有引用,请注明出处和作者


    前面的例子我们都是使用方块来表示物体的,是不是对这样简单的界面感到厌烦了。别着急,这一节我们就来谈在游戏中使用图像的问题。
    其实装载图像很简单:
    先定义一个Image类的变量用来存储图像:
Image fileImage = null;
     然后我们使用Image类的createImage方法,将要载入图像的地址传递给该函数,就会返回一个该图的指针,将它存放在前面定义的Image类变量中:
Try
{
    fileImage = Image.create.Image(filename);
}
catch( IOExcption ioe )
{
    System.out.println(“can’t  load  file : ” + filename );
}
    我们举一个简单的例子,做一个游戏的开始界面:

    先构建一个MIDlet类文件。
    添加下面两行代码,为程序编译运行提供相应的库。
import javax . microedition . midlet . * ;
import javax . microedition . lcdui . * ;
     然后定义一个jiguoheMIDlet的类结构,要求继承自MIDlet类,并扩展CommandListener接口。
public class jiguoheMIDlet extends MIDlet implements CommandListener {

}
    在类中添加下面代码:
    先定义一个我们要创建的启动界面类的实例,该类我们命名为Ocanvas。
  private OCanvas canvas;
      这样我们就可以在后面将他启动并显示出来。
    紧接着,我们要分别实现MIDlet类的几个函数。下面是startApp ( )
  public void startApp ( ) {
    if ( canvas = = null ) {
//将负责现实的类通过我们自定义的Ocanvas类的构造函数,传递给Ocanvas类
      canvas = new Ocanvas ( Display . getDisplay ( this ) ) ;
       //定义了一个Command控件变量并创建一个新的Command实例
      Command exitCommand = new Command ( " Exit " ,  Command . EXIT ,  0 ) ;
      //将命令添加到界面中
canvas . addCommand ( exitCommand ) ;
//设定对该命令的监听
      canvas . setCommandListener ( this ) ;
    }
    
    //创建成功后启动画布
    canvas . start ( ) ;
  }
  另外两个函数为空
  public void pauseApp ( ) { }
  
  public void destroyApp ( boolean unconditional ) { }
  
  //定义命令处理函数,当被监听的命令被触发时, 执行该代码
  public void commandAction ( Command c , Displayable s ) {
    if  ( c . getCommandType ( ) = = Command . EXIT ) {
      destroyApp ( true ) ;
      notifyDestroyed ( ) ;
    }
  }
有了MIDlet类我们程序就可以运行了,下面我们来添加程序的核心,就是有关界面绘制和显示的部分。
仍然实现添加必需的库文件:
import javax.microedition.lcdui.*;
//因为有错误处理,所以添加下面的库
import java.io.*;

然后定义我们前面提到的界面类Ocanvas,他继承自Canvas类
public class OCanvas extends Canvas { }
在类中添加下面的代码:
  //因为从MIDlet类的子类中传递过来了显示类Display,所以得到他的一个实例来绘制图像
  private Display display;
  //这里定义一个图像类,用来显示启动界面
private Image    title;
然后,构造显示类的构造函数:
  public Ocanvas ( Display d ) {
    //继承父类的功能
       super ( ) ;
          //存储显示类的实例
       display = d ;
  }
定义显示类的成员函数strat ( ) :
  void start ( ) {
    display . setCurrent ( this ) ;
    repaint ( ) ;
  }
最后实现图像显示函数,该函数命名为paint ( ) ,在每次图像更新时自动调用:
  public void paint (Graphics g ) {
     //清除屏幕
     g . setColor ( 255 , 255 , 255 ) ; // 设置白色
     g . fillRect ( 0 , 0 , getWidth ( ) , getHeight ( ) ) ; //用白色填充屏幕


     // 创建并载入图像
    try {
      title = Image . createImage ( " / title . png " ) ;
      
    }
    catch ( IOException e ) {
      System . err . println ( " Failed loading images ! " ) ;
    }
    
    //绘制图像
    g . drawImage ( title , 0 , 0 , Graphics . TOP | Graphics . LEFT ) ;
  }
结果当然和你的图像title.png有关了。
当然我们也可以将我们地游戏主角也换成图像的。
主要的修改在paint方法中:
//在绘图的最后添加下面代码:
//绘制英雄
                 g.drawImage(hero,x,y,Graphics.HCENTER|Graphics.VCENTER);
      其中hero是Image类的变量,可以通过前面的方法得到一个英雄的图像。x,y表示他的位置,可以在按键控制部分进行相应的控制。
    赶快试一试吧!

    可以看到英雄在屏幕上移动了,只是不爽的是MIDP1.0不支持透明图像。所以我们的英雄不能很好的和背景颜色相融合。
    想了很多方法,最后通过查资料才知道,MIDP1.0不支持透明图像,只有NOKIA的开发包里的一些扩展提供了该功能。
    所以,还是放弃MIDP1.0吧,专注于MIDP2.0吧!当然也要多看NOKIA的网站。