作者:潇潇 出处: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的网站。