淮海工学院计算机工程学院
实验报告书
课程名: 《手持设备软件开发》
题 目: 实验3:J2ME手机游戏程序设计 班 级: 软件 学 号: 1 姓 名:
评语: 成绩: 指导教师: 批阅时间: 年 月 日
《手持设备软件开发》实验报告 - 1 -
一、实验目的与要求
掌握J2ME手机游戏设计的一般方法,掌握游戏画布,分块图层,精灵和图层管理类的使用方法。掌握控制游戏画面更新及固定帧率的方法。
二、实验内容
对实例MIDP项目Game中的SimpleSprite游戏应用程序做如下的修改: 1.使用动态分块修改游戏的背景使得在游戏运行过程中小花与小草连续的变换。 2.增加命令,可以控制sprite0移动的速度,同时保证画面的稳定更新。 3.sprite1在游戏开始时出现的位置随机生成,但要保证不与sprite0发生碰撞。
三、实验步骤
SimpleSpriteCanvas.java
package SimpleSprite;
import javax.microedition.lcdui.*; import javax.microedition.lcdui.game.*; import java.util.*;
public class SimpleSpriteCanvas extends GameCanvas{
private boolean isPlay; private long delay;
// 值为true时游戏线程反复执行
// 线程执行时的延时,控制游戏每帧的时间 // 保存屏幕的宽度和高度
// 定义背景为分块图层
private int width, height;
private TiledLayer background;
private Sprite sprite0, sprite1; //sprite0 大的 , sprite1 小的 private Image backImage, spriteImage;
// 生成背景、精灵所用图像
private final int toLeft[]={0, 1, 1, 2, 2, 3, 3, 4}; //精灵0向左运动的帧序列 private final int toRight[]={5, 6, 6, 7, 7, 8, 8, 9}; //精灵0向右运动的帧序列 private int xStep = 0, yStep = 0;
private boolean pxCollides = false; //碰撞检测方式,默认矩形检查 private boolean rightToLeft = true; private int aniIndex1, aniIndex2; private int state=1;
private int moveLength=2; //初始步长 private int xPosition=30,yPosition=80;
// 构造方法
public SimpleSpriteCanvas() {
super(true);
《手持设备软件开发》实验报告 - 2 -
}
width = getWidth(); height = getHeight(); delay = 50;
background = createBackground();
sprite0 = createSprite(\sprite1 = createSprite(\sprite0.setPosition(180,70); createPosition();//产生随机位置 sprite1.setPosition(xPosition,yPosition); collidesFind();
sprite0.setFrameSequence(toLeft);
sprite1.defineCollisionRectangle(0, 0, 64, 64);
// 启动线程体 public void start() {
isPlay = true;
Thread1 thread1= new Thread1(); }
// 停止线程执行
public void stop() { isPlay = false; }
Thread2 thread2= new Thread2(); thread1.start(); thread2.start();
// 线程体,游戏主体 class Thread1 extends Thread {
public void run() {
Graphics g = getGraphics(); // 获取脱机屏幕缓冲区中图形对象
long beginTime = 0, endTime = 0; while (isPlay == true) {
beginTime = System.currentTimeMillis(); queryKey();
// 查询按键状态
《手持设备软件开发》实验报告 - 3 -
}
}
sprite0Move(); drawScreen(g);
// 绘制屏幕
endTime = System.currentTimeMillis(); if (endTime - beginTime < delay) { }
try {
Thread.sleep(delay - (endTime - beginTime));
} catch (InterruptedException ie) { }
} 动
动
下移动
// 主动查询按键状态,进行处理 private void queryKey() {
int keyStates = getKeyStates();
// 查询游戏按键状态,游戏按键被按下时
// 如果未超过左侧范围,向左移动
if ((keyStates & LEFT_PRESSED) != 0)
xStep = -1*moveLength;
if ((keyStates & RIGHT_PRESSED) !=0) // 如果未超过TiledLayer右侧范围,向右移
xStep = moveLength;
// 如果未超过TiledLayer上侧范围,向上移
if ((keyStates & UP_PRESSED) != 0)
yStep = -1*moveLength;
// 如果未超过TiledLayer下侧范围,向
if ((keyStates & DOWN_PRESSED) !=0)
yStep = moveLength;
}
// 在屏幕上显示游戏画面
private void drawScreen(Graphics g) {
g.setColor(0x99ccff);
g.fillRect(0, 0, getWidth(), getHeight()); background.paint(g); sprite0.nextFrame(); sprite1.nextFrame(); sprite0.paint(g); sprite1.paint(g); flushGraphics();

