早期手機處理器普遍不支援浮點運算,導致無法直接使用 sin、cos 分解初速度。本文介紹「先放大後縮小」的定點數近似算法,並引入偏移量修正,在無 FPU 的裝置上實現逼真的拋物線運動。
預先計算 0°~90° 的正弦值,放大 100,000 倍存入 Hashtable:
Hashtable angleValue = new Hashtable();
angleValue.put("0", new Integer(0));
angleValue.put("30", new Integer(50000));
angleValue.put("60", new Integer(86603));
angleValue.put("90", new Integer(100000));
// ... 其他角度
餘弦值可由 cos(θ) = sin(90°-θ) 取得。
設初速度 V0,角度 angle,重力 g=10,時間 t。
分量速度(已放大 100,000 倍):
Vx = V0 * cos(angle) / 100000;
Vy = V0 * sin(angle) / 100000;
位移公式(再縮小 100,000 倍):
x = Vx * t / 100000;
y = (Vy * t - 5 * t * t) / 100000;
主迴圈極快,需降低時間增長頻率:
int t = 0, tTemp = 0;
while (true) {
Thread.sleep(10);
if (bFire) {
tTemp++;
if (tTemp > 10) { t++; tTemp = 0; }
}
}
將時間再放大 20,000 倍代入公式:
x = Vx * t / 100000;
y = (Vy * t - 5 * t * t * 20000) / 100000;
原點置於螢幕底部,並加入高度偏移 pianyi 增加彈道高度:
int pianyi = t * 400000;
if (Vy == 0) pianyi = 0; // 平拋不加偏移
x = (Vx + windSpeed) * t / 100000;
y = (100000*(getHeight()-imgH) - (Vy*t - 100000*t*t + pianyi)) / 100000;
windSpeed 同樣為放大後的整數,模擬風力影響。
於 Nokia 7650 模擬器驗證,45° 發射角下軌跡圓滑,偏移量修正後最高點明顯提升,視覺效果接近真實拋物線。可依遊戲節奏微調 pianyi 係數與時間縮放倍率。
定點數查表法是 J2ME 時代實現三角函數物理模擬的經典技巧。透過合理的放大縮小比例、時間緩衝與偏移修正,能在無浮點運算的裝置上呈現流暢、自然的拋物線動畫,為射擊、運動類遊戲奠定物理基礎。