J2ME 遊戲邏輯類常見幾十行變數宣告,為了節省記憶體犧牲物件導向設計。作者分享「以陣列取代離散變數」的實戰技巧,讓程式碼更清爽、擴充性更強。
// 典型反模式:每個屬性一個變數
int hp, mp, money, atk, def;
int posX, posY, row, col;
int currentAction, moveDirection;
// ... 還有更多
缺點:命名困難(英文不好者尤甚)、維護時需在類別頂部與使用處來回跳轉、新增屬性需改動多處。
// 定義索引常數,語意化存取
static final int IDX_HP = 0, IDX_MP = 1, IDX_MONEY = 2;
static final int IDX_ATK = 3, IDX_DEF = 4;
static final int IDX_X = 5, IDX_Y = 6, IDX_ROW = 7, IDX_COL = 8;
static final int IDX_ACTION = 9, IDX_DIR = 10;
int[] entity = new int[20]; // 預留擴充空間
// 存取範例
entity[IDX_HP] -= damage;
entity[IDX_X] += dx; entity[IDX_Y] += dy;
if (entity[IDX_ACTION] == ACT_ATTACK) { ... }
優勢:
int[] entity 取代十幾行,程式碼乾淨entity[ 即出現索引提示,減少拼寫錯誤RPG 地圖不僅有圖塊類型,還可能有動畫、觸發事件、可通行性等動態屬性。
// 反模式:為每種動態屬性建立獨立二維陣列
int[][] mapTile;
int[][] animFrame;
int[][] animTimer;
boolean[][] walkable;
int[][] dialogTrigger;
// ... 維護噩夢
// 正解:三維陣列統一建模
// map[row][col][attribute]
static final int ATTR_TILE = 0; // 圖塊類型
static final int ATTR_ANIM_FRAME = 1; // 當前動畫幀
static final int ATTR_ANIM_TIMER = 2; // 動畫計時器
static final int ATTR_WALKABLE = 3; // 是否可通行
static final int ATTR_TRIGGER = 4; // 觸發對話 ID (0=無)
int[][][] map = new int[MAP_ROWS][MAP_COLS][10]; // 預留 10 個屬性槽
優勢:地圖所有資訊集中在單一資料結構,邏輯處理(渲染、碰撞、事件觸發)只需遍歷一個陣列,新增屬性只需擴充第三維度,極其優雅。
static final int 索引常數,避免魔術數字Object[] 或平行陣列HashMap/Vector 快得多,極適合 J2ME 受限環境new int[],應在初始化階段一次配置善用陣列不是「倒退到程序式寫法」,而是在資源受限環境下,以資料導向設計替代物件導向的務實選擇。掌握這技巧,能讓你的 J2ME 專案在複雜度增長時依然保持清晰可控。