📄 mygamecanvas.java
字号:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.media.*;
import java.io.*;
public class MyGameCanvas extends GameCanvas implements Runnable {
boolean running; // 根据thread显示有无loop处理的flag
final static int GRID_SIZE = 32; // 一个tiled的尺寸
TiledLayer map; // map用Layer
LayerManager layerManager; // LayerManager
int width; // Canvas的宽度
int height; // Canvas的高度
int heroX = 1; // 在中央显示map坐标(x)
int heroY = 2; // 在中央显示map坐标(y)
Image mapImage; // TiledLayer使用的map image
Sprite hero; // 主人公的sprite
int heroFrame = 0; // 主人公的sprite的index
int floor; // floor号码
long gameStartTime; // 游戏开始的时刻
Player player; // 播放声音用Player
int mapW; // map的横向尺寸
int mapH; // map的纵向尺寸
/**
* MyGameCanvas的constructor
*/
public MyGameCanvas() throws Exception {
super(true);
// 取得canvas的尺寸
width = getWidth();
height = getHeight();
mapImage = Image.createImage("/map.png"); // tiled用image
Image heroImage = Image.createImage("/hero.png"); // 主人公image
hero = new Sprite(heroImage, GRID_SIZE, GRID_SIZE);
// 从WAV文件取得InputStream
InputStream in = getClass().getResourceAsStream("footstep.wav");
// 生成Player对象
player = Manager.createPlayer(in, "audio/x-wav");
//layerManager
layerManager = new LayerManager();
layerManager.append(hero);
// 设定map的初始size
mapW = 11;
mapH = 11;
// 设定map
resetMap(mapW, mapH);
// 设定floor号码为1
floor = 1;
// thread的开始
running = true;
Thread t = new Thread(this);
t.start();
// 记录游戏开始时刻
gameStartTime = System.currentTimeMillis();
}
/**
* 重新设定map
*/
private void resetMap(int width, int height) {
// 生成TiledLayer
map = new TiledLayer(width, height, mapImage, GRID_SIZE, GRID_SIZE);
// 取得map信息
int[][] mapData = MapGenerator.getMap(width, height);
// 在TiledLayer中设定map信息
for (int y = 0; y < mapData.length; y++) {
for (int x = 0; x < mapData[y].length; x++) {
map.setCell(x, y, mapData[y][x]);
}
}
// 在layerManager中添加map
layerManager.append(map);
}
/**
* thread的执行
*/
public void run() {
Graphics g = getGraphics();
while (running) {
long startTime = System.currentTimeMillis();
tick();
keyEvent(getKeyStates());
draw(g);
long endTime = System.currentTimeMillis();
int duration = (int)(endTime - startTime);
if(duration < 200) {
try {
Thread.sleep(200 - duration);
}
catch (InterruptedException e) {
stop();
}
}
}
}
/**
* 根据按键状态切换处理
*/
private void keyEvent(int keyStates) {
// 保存目前的坐标值
int preX = heroX;
int preY = heroY;
if ((LEFT_PRESSED & keyStates) != 0 ) { heroX--; } // 向左移动
else if ((RIGHT_PRESSED & keyStates) != 0 ) { heroX++; } // 向右移动
else if ((UP_PRESSED & keyStates) != 0 ) { heroY--; } // 向上移动
else if ((DOWN_PRESSED & keyStates) != 0 ) { heroY++; } // 向下移动
// 遇到障碍物(岩石或洞穴)则返回移动前的位置
int cellType = map.getCell(heroX, heroY);
if ( cellType == 4 || cellType == 5) {
heroX = preX;
heroY = preY;
}
// 设定坐标值
hero.setPosition(heroX * GRID_SIZE,heroY * GRID_SIZE);
// 遇到上升台阶则移动到上面一层
if( cellType == 7 ) {
upFloor();
}
}
/**
* 上台阶
*/
private void upFloor() {
// 描绘的更新
Graphics g = getGraphics();
draw(g);
// 播放上台阶的声音
try {
player.start();
Thread.sleep(1000);
} catch(Exception e) {}
// 在画面中显示下面的层数
floor++;
g.setColor(0, 0, 0);
g.fillRect(0, 0, width, height);
Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE);
g.setColor(255, 255, 255);
g.drawRect(50, 100, width - 100, height - 200);
g.setFont(font);
g.drawString("[ " + floor + "F ]", width/2, 135, g.BOTTOM|g.HCENTER);
flushGraphics();
// 只有1秒待机
try {
Thread.sleep(1000);
} catch(Exception e) {}
// 从layerManager中消除目前的map
layerManager.remove(map);
// 只增大2map尺寸
if(mapW < 25) {
mapW += 2;
mapH += 2;
}
// 更新map
resetMap(mapW, mapH);
// 重新设定主人公坐标值
heroX = 1;
heroY = 1;
}
/**
* 每经过一定时间的处理
*/
private void tick() {
// 更新主人公的sprite的index
heroFrame = (heroFrame + 1) % 2;
hero.setFrame(heroFrame);
}
/**
* 描绘的更新
*/
private void draw(Graphics g) {
// 指定描绘区域
layerManager.setViewWindow(
heroX * GRID_SIZE - (width - GRID_SIZE) / 2,
heroY * GRID_SIZE - (height - 40 - GRID_SIZE) / 2,
width, height - 40);
// map的描绘
g.setColor(0, 0, 0);
g.fillRect(0, 0, width, height);
layerManager.paint(g,0,0);
// status的描绘
g.setColor(255,255,255);
g.fillRect(0, height - 40, width, 40);
g.setColor(0, 0, 0);
int gameTime = (int)(System.currentTimeMillis() - gameStartTime ) / 1000;
g.drawString("" + floor + "F : " + mapW + "x" + mapH, width/2, height - 20, g.BOTTOM|g.HCENTER);
g.drawString("" + gameTime + "sec", width/2, height - 5, g.BOTTOM|g.HCENTER);
// 描绘的更新
flushGraphics();
}
/**
* thread的停止
*/
public void stop() {
running = false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -