您的位置:首页 > 其它

J2ME游戏开发实例讲解

2005-03-25 18:42 477 查看
跳过J2ME,我们先来讲点游戏的理论.具体到华容道这个游戏,主要有三个方面,贴

图.游戏操作.逻辑判断.这里讲讲贴图,其他两方面放在概要设计和详细设计里讲.所谓的

贴图,其实就是画图,就是在要显示图形的位置上输出一副图片,(要是牵扯到动画就要麻烦

一些,可以使用TimerTask.Thread或Rannable之类的技术),这副图片可以是事先准备好的也

可以是临时处理的.在J2ME中有一个Image类,专门用于管理图片,它有createImage()方

法,可以直接读取图片文件(J2ME只支持PNG格式的图片),也可以截取已有的图片的一部分

(这样我们可以把很多图片放在一起,然后一张一张的截下来,好处是节省存储空间和文件读

取时间,对于手机这两者都是性能的瓶颈).
J2ME还有一个Graphics类,专门用于绘图,它有drawImage()方法,可以把一副图片在

指定的位置上显示出来,它还有drawRect()方法和setColor()方法,这两个方法在后面我们进

行游戏操作时就会用到,这里先交代一下.有了图片和绘图的方法,还需要知道把图画到谁身

上,J2ME提供了一个Canvas类,字面意思就是画布,它有一个paint()方法用于刷新页面,还

有一个repaint()方法用于调用paint()方法.听着有些糊涂是吧,不要紧,我来结合具体程序

讲解一下.为了今后编程的方便,我们创建两个类Images和Draw,Images用于保存一些常量

值和图片,Draw主要是用于画图,这两个类的源代码如下。

Images类的源代码如下:

package huarongroad;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

public class Images {//保存常量
//绘图位置常量
public static final int UNIT = 32;//方块的单位长度
public static final int LEFT = 10;//画图的左边界顶点
public static final int TOP = 9;//画图的上边界顶点
//地图位置常量
public static final int WIDTH = 4;//地图的宽度
public static final int HEIGHT = 5;//地图的高度
//地图标记常量
public static final byte CAOCAO = (byte) /'a/'; <A href="file://曹">file://曹</A>操的地图标记
public static final byte MACHAO = (byte) /'b/';//马超的地图标记
public static final byte HUANGZHONG = (byte) /'c/';//黄忠的地图标记
public static final byte GUANYU = (byte) /'d/';//关羽的地图标记
public static final byte ZHANGFEI = (byte) /'e/';//张飞的地图标记
public static final byte ZHAOYUN = (byte) /'f/';//赵云的地图标记
public static final byte ZU = (byte) /'g/';//卒的地图标记
public static final byte BLANK = (byte) /'h/';//空白的地图标记
public static final byte CURSOR = (byte) /'i/';//光标的地图标记
//地图组合标记常量
public static final byte DLEFT = (byte) /'1/'; <A href="file://组">file://组</A>合图形左边标记
public static final byte DUP = (byte) /'2/'; <A href="file://组">file://组</A>合图形上边标记
public static final byte DLEFTUP = (byte) /'3/'; <A href="file://组">file://组</A>合图形左上标记
//图片常量
public static Image image_base;//基本图片
public static Image image_Zhaoyun;//赵云的图片
public static Image image_Caocao;//曹操的图片
public static Image image_Huangzhong;//黄忠的图片
public static Image image_Machao;//马超的图片
public static Image image_Guanyu;//关羽的图片
public static Image image_Zhangfei;//张飞的图片
public static Image image_Zu;//卒的图片
public static Image image_Blank;//空白的图片
public static Image image_Frame;//游戏框架的图片

public Images() {//构造函数
}

public static boolean init() {//初始化游戏中用到的图片
try {
image_base = Image.createImage("/huarongroad/BITBACK.png");
image_Frame = Image.createImage(image_base, 126, 0, 145, 177,
Sprite.TRANS_NONE);
//Sprite类是用来翻转图片的,是MIDP2.0新新增加的支持游戏的特性
image_Zhaoyun = Image.createImage(image_base, 0, 0, UNIT, 2 * UNIT,
Sprite.TRANS_NONE);
image_Caocao = Image.createImage(image_base, UNIT, 0, 2 * UNIT,
2 * UNIT, Sprite.TRANS_NONE);
image_Huangzhong = Image.createImage(image_base, 3 * UNIT, 0, UNIT,
2 * UNIT,
Sprite.TRANS_NONE);
image_Machao = Image.createImage(image_base, 0, 2 * UNIT, UNIT,
2 * UNIT,
Sprite.TRANS_NONE);
image_Guanyu = Image.createImage(image_base, UNIT, 2 * UNIT,
2 * UNIT, UNIT,
Sprite.TRANS_NONE);
image_Zhangfei = Image.createImage(image_base, 3 * UNIT, 2 * UNIT,
UNIT, 2 * UNIT,
Sprite.TRANS_NONE);
image_Zu = Image.createImage(image_base, 0, 4 * UNIT, UNIT, UNIT,
Sprite.TRANS_NONE);
image_Blank = Image.createImage(image_base, 1 * UNIT, 4 * UNIT,UNIT,
UNIT,
Sprite.TRANS_NONE);

return true;
}catch (Exception ex) {
return false;
}
}
}

Draw类的源代码如下:

package huarongroad;

import javax.microedition.lcdui.*;

public class Draw {
//绘制游戏中的图片
public Draw(Canvas canvas) {//构造函数
}

public static boolean paint(Graphics g, byte img, int x, int y) {
//在地图的x,y点绘制img指定的图片
try {
paint(g, img, x, y, Images.UNIT);//把地图x,y点转化成画布的绝对坐标,绘图
return true;
}
catch (Exception ex) {
return false;
}
}

public static boolean paint(Graphics g, byte img, int x, int y, int unit) {
try {case Images.CAOCA//画曹操
//变成绝对坐标,并做调整
g.drawImage(Images.image_Caocao, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.GUANYU://画关羽
g.drawImage(Images.image_Guanyu, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.HUANGZHONG://画黄忠
g.drawImage(Images.image_Huangzhong, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.MACHA//画马超
g.drawImage(Images.image_Machao, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.ZHANGFEI://画张飞
g.drawImage(Images.image_Zhangfei, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.ZHAOYUN://画赵云
g.drawImage(Images.image_Zhaoyun, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.ZU://画卒
g.drawImage(Images.image_Zu, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.BLANK://画空白
g.drawImage(Images.image_Blank, Images.LEFT + x * unit,
Images.TOP + y * unit,
Graphics.TOP | Graphics.LEFT);
break;
case Images.CURSOR://画光标
g.drawRect(Images.LEFT + x * unit,
Images.TOP + y * unit,Images.UNIT,Images.UNIT);
break;
}
return true;
}catch (Exception ex) {
return false;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: