2D 動畫中,物件需沿預定義軌跡移動。需解決:
本文採用無損圖像 + Swing + 自定義動畫引擎方案。

| 顏色 (RGB) | 行為常量 | 含義 |
|---|---|---|
| 白 (255,255,255) | STATE_NONE | 無映射/可通行區域 |
| 黑 (0,0,0) | STATE_HALLWAY | 走廊,沿當前方向前進 |
| 綠 (0,255,0) | STATE_START | 起點 |
| 紅 (200,0,0) | STATE_EXIT | 出口 |
| 紅 (255,0,0) | STATE_HINT | 方向提示(優先轉向) |
| 藍 (0,0,255) | STATE_INTERSECTION | 十字路口 |
void processControl(Image img, int x, int y, int w, int h) {
int[] pmap = new int[w * h];
PixelGrabber pg = new PixelGrabber(img, x, y, w, h, pmap, 0, w);
pg.grabPixels();
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < pmap.length; i++) {
int r = (pmap[i] >> 16) & 0xff;
int g = (pmap[i] >> 8) & 0xff;
int b = pmap[i] & 0xff;
if (r == 255 && g == 255 && b == 255) continue; // STATE_NONE 不入表
else if (r == 0 && g == 0 && b == 0) map.put(i, STATE_HALLWAY);
else if (r == 0 && g == 255 && b == 0) map.put(i, STATE_START);
else if (r == 200 && g == 0 && b == 0) map.put(i, STATE_EXIT);
else if (r == 255 && g == 0 && b == 0) map.put(i, STATE_HINT);
else if (r == 0 && g == 0 && b == 255) map.put(i, STATE_INTERSECTION);
}
// map 供運行時查詢 stateAt(x,y)
}
interface Entity {
void addToPanel(JPanel panel, boolean shared);
void updateTick(); // 每幀調用
}
public void updateTick() {
// 處理延遲啟動、停留點
Point2D loc = getPosition();
int x = (int)loc.getX(), y = (int)loc.getY();
switch (manager.stateAt(x, y)) {
case STATE_EXIT: atExit = true; break;
case STATE_START:
case STATE_INTERSECTION:
// 掃描四鄰域尋找 HINT 或可通行方向
// 設定方向 DIR_NORTH/EAST/SOUTH/WEST
case STATE_HALLWAY:
case STATE_HINT:
// 按方向移動一步,若撞牆則嘗試轉向
setNextPoint(new Point(x, y));
}
}
public void prepareNextFrame(boolean update, boolean shared) {
if (update) manager.moveEntities();
mainPanel.removeAll();
for (Person p : manager.getPeople()) p.addToPanel(mainPanel, shared);
for (Entity e : manager.getEntities()) e.addToPanel(mainPanel, shared);
}
public void runUpdates(int delay) {
new Timer(true).scheduleAtFixedRate(new TimerTask() {
public void run() {
SwingUtilities.invokeLater(() -> { prepareNextFrame(true, true); repaint(); });
}
}, 0, delay);
}
無損圖像作為控制路徑載體,結合 Swing 輕量級組件與定時器驅動,實現了直觀、可擴展的 2D 動畫框架。適合遊戲原型、模擬演示、教學演示等場景。