首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 手機遊戲物理模拟:拋物線軌跡整數運算實作詳解

     編輯:J2ME

早期 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²

整數化關鍵技巧

1. 三角函數查表法(放大 100,000 倍)

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°-θ)

2. 座標計算同步縮放

因查表值已放大 100,000 倍,座標計算時需同步縮小:

x = (Vx * t) / 100000;
y = (Vy * t - 5 * t * t) / 100000;

3. 時間步進緩衝機制

遊戲主迴圈極快(毫秒級),需降低時間增長頻率:

int t = 0, tTemp = 0;
while (running) {
    Thread.sleep(10);
    if (firing) {
        tTemp++;
        if (tTemp > 10) {  // 調整此值控制模擬速度
            t += 1;
            tTemp = 0;
        }
    }
}

4. 進一步放大時間係數(20,000 倍)修正軌跡

// 綜合公式:時間放大 20000,三角函數放大 100000
x = (Vx * t) / 100000;
y = (Vy * t - 5 * t * t * 20000) / 100000;

5. 螢幕座標系轉換與偏移修正

原點在左上角,Y 軸向下為正,需翻轉並加入初始高度:

int screenH = getHeight();
int objH = img.getHeight();
x = (Vx * t) / 100000;
y = (100000 * (screenH - objH) - (Vy * t - 5 * t * t * 20000)) / 100000;

6. 高度偏移補償(解決 45° 角高度不足)

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° 拋物線(軌跡自然)


不同角度、初速度、風速組合軌跡

實作建議

  • 查表範圍建議涵蓋 0°~90° 每 1° 或 5°,平衡精度與記憶體
  • 偏移係數需實測調整,不同解析度裝置可能不同
  • 風速、空氣阻力等進階效果可同樣用整數放大法擴展
  • CLDC 1.1+ 裝置可直接使用 float 簡化運算,但整數法相容性最佳
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved