早期 Java 手機普遍不支援浮點運算(CLDC 1.0 無 float/double),導致無法直接使用 Math.sin()/Math.cos() 分解速度向量。本文介紹「放大係數整數模擬法」實作拋物線物理,並透過查表法與偏移修正提升精度。
標準拋物線公式(初速度 V₀、角度 θ、重力 g=10、時間 t):
Vx = V₀ × cosθ
Vy = V₀ × sinθ
x = Vx × t
y = Vy × t - ½gt² = Vy×t - 5t²
Hashtable angleTable = new Hashtable();
angleTable.put("0", new Integer(0));
angleTable.put("30", new Integer(50000)); // sin30° = 0.5
angleTable.put("45", new Integer(70711)); // sin45° ≈ 0.70711
angleTable.put("60", new Integer(86603)); // sin60° ≈ 0.86603
angleTable.put("90", new Integer(100000)); // sin90° = 1.0
// 餘弦值同理:cosθ = sin(90°-θ)
因查表值已放大 100,000 倍,座標計算時需同步縮小:
x = (Vx * t) / 100000;
y = (Vy * t - 5 * t * t) / 100000;
遊戲主迴圈極快(毫秒級),需降低時間增長頻率:
int t = 0, tTemp = 0;
while (running) {
Thread.sleep(10);
if (firing) {
tTemp++;
if (tTemp > 10) { // 調整此值控制模擬速度
t += 1;
tTemp = 0;
}
}
}
// 綜合公式:時間放大 20000,三角函數放大 100000
x = (Vx * t) / 100000;
y = (Vy * t - 5 * t * t * 20000) / 100000;
原點在左上角,Y 軸向下為正,需翻轉並加入初始高度:
int screenH = getHeight();
int objH = img.getHeight();
x = (Vx * t) / 100000;
y = (100000 * (screenH - objH) - (Vy * t - 5 * t * t * 20000)) / 100000;
int offset = t * 400000; // 經驗偏移係數
if (Vy == 0) offset = 0; // 水平拋射不需偏移
// 加入風速影響(同樣放大處理)
x = ((Vx + windSpeed) * t) / 100000;
y = (100000 * (screenH - objH) - (Vy * t - 5 * t * t * 20000 + offset)) / 100000;

圖 1:無偏移修正的 45° 拋物線(高度偏低)

圖 2:加入偏移修正後的 45° 拋物線(軌跡自然)

不同角度、初速度、風速組合軌跡
float 簡化運算,但整數法相容性最佳