javax.microedition.lcdui.game.Sprite 是 MIDP 2.0 專為遊戲角色動畫設計的高階 API,支援靜態/動態、透明/不透明幀序列。單張包含多個動作幀的 PNG(如 64×16 含 4 個 16×16 幀)可直接建構動畫精靈,配合 setFrame(index) 切換動作。
tank.midp.core 套件,資源置於 /res/img/player1.png(需透明背景 PNG,建議用 Photoshop 處理)。UP=0, DOWN=1, RIGHT=2, LEFT=3。public class TankGameCanvas extends GameCanvas implements Runnable {
private Sprite spriteTank;
private int currentX, currentY, width, height;
private long delay = 20; // 幀間隔 ms
private boolean isPlay = true;
public TankGameCanvas() {
super(true); // 關閉系統繪圖緩衝,自行管理
width = getWidth(); height = getHeight();
currentX = width / 2; currentY = height / 2;
try {
Image img = Image.createImage("/res/img/player1.png");
spriteTank = new Sprite(img, 16, 16); // 切割 16x16 幀
} catch (Exception e) { e.printStackTrace(); }
}
public void start() { new Thread(this).start(); }
public void stop() { isPlay = false; }
public void run() {
Graphics g = getGraphics();
while (isPlay) {
handleInput();
render(g);
try { Thread.sleep(delay); } catch (InterruptedException ignored) {}
}
}
private void handleInput() {
int ks = getKeyStates();
if ((ks & LEFT_PRESSED) != 0) { currentX = Math.max(0, currentX - 1); spriteTank.setFrame(INDEX_OF_LEFT); }
if ((ks & RIGHT_PRESSED) != 0) { currentX = Math.min(width - 16, currentX + 1); spriteTank.setFrame(INDEX_OF_RIGHT); }
if ((ks & UP_PRESSED) != 0) { currentY = Math.max(0, currentY - 1); spriteTank.setFrame(INDEX_OF_UP); }
if ((ks & DOWN_PRESSED) != 0) { currentY = Math.min(height - 16, currentY + 1); spriteTank.setFrame(INDEX_OF_DOWN); }
}
private void render(Graphics g) {
g.setColor(0); g.fillRect(0, 0, width, height); // 清背景
spriteTank.setPosition(currentX, currentY);
spriteTank.paint(g); // 一行代碼繪製精靈
flushGraphics(); // 雙緩衝翻轉
}
}
啟動後可用方向鍵控制坦克四向移動,動畫幀自動切換。完整專案可作為 MIDP 2.0 遊戲開發起手模板。


