📄 simpletiledlayercanvas.java
字号:
package SimpleTiledLayer;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class SimpleTiledLayerCanvas extends GameCanvas implements Runnable {
private boolean isPlay; // 值为true时游戏线程反复执行
private long delay; // 线程执行时的延时,控制游戏每帧的时间
private int width, height; // 保存屏幕的宽度和高度
private int currentX = -128, currentY = 32; // 当前绘图位置
private int counter = 0;
private int aniIndex1, aniIndex2;
private TiledLayer background; // 定义背景为分块图层
private Image backImage; // 生成背景所用图像
// 构造方法
public SimpleTiledLayerCanvas() {
super(true);
width = getWidth();
height = getHeight();
delay = 20;
background = createBackground();
}
// 启动线程体
public void start() {
isPlay = true;
Thread t = new Thread(this);
t.start();
}
// 停止线程执行
public void stop() { isPlay = false; }
// 线程体,游戏主体
public void run() {
Graphics g = getGraphics(); // 获取脱机屏幕缓冲区中图形对象
long beginTime = 0, endTime = 0;
while (isPlay == true) {
beginTime = System.currentTimeMillis(); // 游戏每一帧开始时间
queryKey(); // 查询按键状态
drawScreen(g); // 绘制屏幕
endTime = System.currentTimeMillis(); // 游戏每一帧结束时间
if (endTime - beginTime < delay) { // 判断运行时间是否超过规定时间
try {
Thread.sleep(delay - (endTime - beginTime));
} catch (InterruptedException ie) { }
}
}
}
// 主动查询按键状态,进行处理
private void queryKey() {
int keyStates = getKeyStates(); // 查询游戏按键状态
// 游戏按键被按下时,TiledLayer的绘图位置相应的进行改变
// 如果未超过TiledLayer左侧范围,图层X坐标向右移动
if ((keyStates & LEFT_PRESSED) != 0)
currentX = Math.min(0, currentX + 2);
// 如果未超过TiledLayer右侧范围,图层X坐标向左移动
if ((keyStates & RIGHT_PRESSED) !=0 )
currentX = Math.max(currentX - 2, width - background.getWidth());
// 如果未超过TiledLayer上侧范围,图层Y坐标向下移动
if ((keyStates & UP_PRESSED) != 0)
currentY = Math.min(32, currentY + 2);
// 如果未超过TiledLayer下侧范围,图层Y坐标向上移动
if ((keyStates & DOWN_PRESSED) !=0)
currentY = Math.max(currentY - 2, height - background.getHeight());
}
// 在屏幕上显示游戏画面
private void drawScreen(Graphics g) {
g.setColor(0x99ccff);
g.fillRect(0, 0, getWidth(), getHeight());
background.setPosition(currentX, currentY);
background.paint(g);
flushGraphics();
}
// 建立分块图层
private TiledLayer createBackground() {
try {
backImage = Image.createImage("/SimpleTiledLayer/bgtiles.png");
} catch (Exception e) {}
TiledLayer tiledLayer = new TiledLayer(16,10,backImage,32,32);
// 建立动态分块
aniIndex1 = tiledLayer.createAnimatedTile(6);
aniIndex2 = tiledLayer.createAnimatedTile(2);
// 数组中存放单元格中需要填充的分块号
int[] map = {
7, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 7, 0,
0, 0, 0, 7, 0, 0, 8, 0, 7, 0, 0, 7, 0, 7, 0, 0,
0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0,-1, 0,
0, 0, 0,-1, 0, 0, 0,-1,-1,-1, 0, 1, 2, 2, 2, 3,
0, 0, 1, 2, 3,-1, 1, 2, 2, 2, 3, 1, 2, 2, 2, 3,
0,-1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1, 2, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
};
// 将分块填充进相应的单元格
for (int i=0; i < map.length; i++) {
int column = i % 16;
int row = (i - column) / 16;
tiledLayer.setCell(column,row,map[i]);
}
return tiledLayer;
}
// 实现分块图层上的动画效果
public void act() {
// 直接改变单元格中的分块
background.setCell(6, 1, counter%2+7);
// 改变动态分块中存放的静态分块号
if (counter%2 == 0) {
background.setAnimatedTile(aniIndex1, 5);
background.setAnimatedTile(aniIndex2, 4);
}
else {
background.setAnimatedTile(aniIndex1, 6);
background.setAnimatedTile(aniIndex2, 2);
}
counter ++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -