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;
}
}
}
图.游戏操作.逻辑判断.这里讲讲贴图,其他两方面放在概要设计和详细设计里讲.所谓的
贴图,其实就是画图,就是在要显示图形的位置上输出一副图片,(要是牵扯到动画就要麻烦
一些,可以使用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;
}
}
}
相关文章推荐
- 用NetBeans开发J2ME游戏实例讲解(三)
- J2ME游戏开发实例讲解
- 在NetBeans平台上开发J2ME游戏实例讲解(第三部分)
- J2ME游戏开发实例讲解
- 在NetBeans平台上开发J2ME游戏实例讲解(第二部分)
- J2ME游戏开发实例讲解
- 在NetBeans平台上开发J2ME游戏实例讲解(第一部分)
- J2ME游戏开发实例讲解
- 用NetBeans平台开发J2ME游戏实例讲解1
- 在NetBeans平台上开发J2ME游戏实例讲解(第三部分)
- 在NetBeans平台上开发J2ME游戏实例讲解(第二部分)
- NetBeans开发J2ME游戏实例讲解
- 用NetBeans开发J2ME游戏实例讲解(一)
- 用NetBeans平台开发J2ME游戏实例讲解2
- 用NetBeans开发平台开发J2ME游戏实例讲解(第四部分)
- J2ME游戏开发实例讲解(1)
- 用NetBeans开发J2ME游戏实例讲解(二)
- unity 主角攻击动画状态机原理 实例讲解 手游戏开发
- Android游戏开发教程之九:VideoView类实例讲解
- 实例讲解:开发SWING的XML框架(1)