2013-06-26 52 views
2

我一直在努力學習XNA,雖然我無法獲取書籍,但我一直依靠MSDN和教程來指導我一路走來,現在我可以繪製小精靈並改變它們的位置並使用Intersect和I我現在正在嘗試爲Windows Phone 7和8手機開發一款基本的加速度計。我的加速度計代碼有什麼問題?

我有一些塊和一個球。我希望能夠通過向上/向下/向左/向右傾斜手機來移動球(或滾動它)。

如果您在下面看到,綠色圓點代表球可以移動的區域。雖然深灰色的塊只是界限,如果球觸及它們,它會反彈離開它們(稍後,我不關心這個部分)。

我的問題是,我怎樣才能讓球響應正確的傾斜動作?

嘗試並獲得非常基本的傾斜移動,我有:

protected override void Initialize() 
    { 
     // TODO: Add your initialization logic here 

     Accelerometer accelerometer = new Accelerometer(); 
     accelerometer.CurrentValueChanged += accelerometer_CurrentValueChanged; 
     accelerometer.Start(); 

     base.Initialize(); 
    } 

    void accelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e) 
    { 

      this.squarePosition.X = (float)e.SensorReading.Acceleration.Z * GraphicsDevice.Viewport.Width + GraphicsDevice.Viewport.Width/2.0f; 

      if (Window.CurrentOrientation == DisplayOrientation.LandscapeLeft) 
      { 
       this.squarePosition.X = +(float)e.SensorReading.Acceleration.X * GraphicsDevice.Viewport.Width + GraphicsDevice.Viewport.Width/2; 
      } 
      else 
      { 
       this.squarePosition.X = (float)e.SensorReading.Acceleration.X * GraphicsDevice.Viewport.Width + GraphicsDevice.Viewport.Width/2; 
      } 
     } 

但它絕對震撼。這是非常緊張的,就像對象不停地跳起來就像它有一個扣押或什麼東西,我甚至不確定這是否是正確的方式去做這件事。

enter image description here

+0

我從來沒有寫過加速度計的代碼,所以我無法爲你提供很多幫助。不過,有些東西正在困擾着我:afaik,加速度計檢測速度變化。因此,每當加速度計值發生變化時,您都不應該更新位置:您應該在XNA'Update'方法中根據加速度計的最新值更改位置。這樣,如果你傾斜手機然後停止移動,球將繼續平穩移動。或者您可以使用陀螺儀:http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202943(v=vs.105).aspx –

+0

此外,您正在分配到'squarePosition.X '從加速度計Z軸讀取的值,然後用從X軸讀取的值覆蓋它。我認爲這兩個任務中的一個應該是用於'squarePosition.Y'的 –

回答

4

你的主要問題是直接將加速度與位置相關聯,而不是使用加速度來影響速度和速度來影響球的位置。你已經取得了這樣的球的位置多少你傾斜,而不是加速根據你傾斜多少。

目前,只要加速度計讀數發生變化,球的位置就設置爲讀數。您需要將球的加速度分配給讀數,並通過該加速度週期性地增加速度,並且以該速度週期性地增加球的位置。

XNA可能有一個內置的方式做到這一點,但我不知道XNA這樣我就可以告訴你我會怎麼做沒有幫助從一個框架/庫:

// (XNA probably has a built-in way to handle acceleration.) 
// (Doing it manually like this might be informative, but I doubt it's the best way.) 
Vector2 ballPosition; // (when the game starts, set this to where the ball should be) 
Vector2 ballVelocity; 
Vector2 ballAcceleration; 

... 

void accelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e) { 
    var reading = e.SensorReading.Acceleration; 
    // (below may need to be -reading.Z, or even another axis) 
    ballAcceleration = new Vector2(reading.Z, 0); 
} 

// (Call this at a consistent rate. I'm sure XNA has a way to do so.) 
void AdvanceGameState(TimeSpan period) { 
    var t = period.TotalSeconds; 
    ballPosition += ballVelocity * t + ballAcceleration * (t*t/2); 
    ballVelocity += ballAcceleration * t; 

    this.squarePosition = ballPosition; 
} 

如果你不知道t * t/2來自哪裏,那麼你可能會想要閱讀基礎物理。這將有助於瞭解如何使球以您想要的方式移動。物理學的相關位被稱爲kinematicsvideos)。