2010年6月9日 星期三

實作出像『瑪莉兄弟跳的公式』

有企畫人員跟我提跳的感覺太難看了,不要等速度移動,至少做出瑪莉兄弟的感覺,此時我腦中就出現了只要讓他們可以調整高度及重力,應該就ok了,或許會有人覺得調整重力很奇怪,但我覺得只要效果對就好,是不是有考慮到質量的問題其實不是很重要,太真實就不像遊戲了嘛。但是上網找資料,卻找不到什麼好用的公式,只好自己推導一下,發現其實不難…

這裡的做法忽略質量及空氣摩擦力,只單純以計算出初速度為目標:
重要變數定義及相關公式:
  • V1:初速度
  • V2:末(終)速度
  • A:加速度
  • S:位移
  • T:時間
  1. V2 = V1 + A*T
  2. S = V1*T + ½*A*T²

推導過程:

  1. V1 + A*T = 0(發生在最高點的時候,也就是所謂跳的高度)
  2. A*T = -V1
  3. T = -V1/A
  4. S = V1*(-V1/A) + ½*A*(-V1/A)²
  5. S = -V1²/A + ½*(V1²/A)
  6. S = -V1²/A + V1²/(2*A)
  7. V1²/A - V1²/(2*A) = -S
  8. V1²*(1/A-1/(2*A)) = -S
  9. V1² = -S/(1/A-1/(2*A))
  10. V1 = sqrt(-S/(1/A-1/(2*A)))
  11. V1 = sqrt(-S/(0.5f/A))<=============結論

程式實作:

XXXX::PreExecute()

{

  ...

  //在這裡使用公式…

  m_fAraiseSpeed = sqrt(-m_fJumpHeight/(0.5f/m_fGravity));

  ...
}

XXXX::Execute(float dT)

{

  ...

  m_fAcctime += dT;

  float fUpDownMoveRange = m_fAraiseSpeed + m_fGravity*m_fAcctime;

  fUpDownMoveRange *= dT; //這就是計算出來垂直移動的位移量。

  ...
}

沒有留言:

張貼留言