2012-05-10 36 views
0

我正在與XNA進行一場比賽。 我有我的相機,我的背景和我的滾動類準備去。是否有「If(X增加)」功能?

我唯一缺乏的就是在攝像頭位置發生變化時告訴滾動工作。有沒有對此的聲明?

像:

if (cameraposition.X ""Increases"") 
{ 
    Scrolling.Update() 
} 

感謝。

+2

你會要麼必須註冊,以處理在cameraposition或在X值的事件(如果支持的話)或記住舊值和比較。我懷疑可能有事件? – Rup

+2

我真的不知道XNA,但看起來像'CameraPosition.Change'事件。 – phg

+0

請注意遊戲開發中的事件。通常使用輪詢,只需檢查每個幀的期望狀態。 – TJHeuvel

回答

6

你將不得不跟蹤舊相機的位置,看看它是否改變。所以,你如果是:

if(cameraPosition.X != oldCameraPosition.X) 

在您要更新oldCameraPosition可變每一幀的結束,因爲這樣的:

oldCameraPosition = cameraPosition; 

兩個位置之間的差別通常被稱爲三角洲,或速度。現在滾動你可以用相機Delta調用你的更新,所以你滾動相同(或修改量)。例如:

//In Camera.cs 
Scrolling.Update(oldCameraPosition - cameraPosition); 

//In your scrolling class 
void Update(Vector3 offset) 
{ 
background.Position += offset * .5f; 
} 

這樣,每次相機移動時,您的背景平面以一半的速度移動。用不同的修飾符來欺騙3次,你會產生一個paralex效果。

通常情況下,您會希望爲此使用事件,但是可以爲遊戲開發制定例外規定。輪詢通常是要走的路,因爲你已經有一個很像事件循環的遊戲循環。 無論哪種方式,只要首先更改攝像頭的位置,就打電話給Scrolling.Update()會更有意義。

+4

對於純 「增加」,做'如果(cameraPosition.X> oldCameraPosition.X)' – Attila

+0

我可能已經摔過。 – TJHeuvel

+0

@Attila:相機位置也可能下降,所以!=是正確的選擇。如果有任何*差異*,選擇*差異*並將其應用於滾動:基本上,這就是邏輯。 – Tigran

3

它的性能自然的選擇,但如果你簡單地說:

Scrolling.Update(cameraPosition.X, cameraPosition.Y) 

如果滾動已經在有效位置,不會改變任何東西。

應該在使用前自然測量。通過這種方式,您將避免存儲狀態變量或附加變量來存儲「舊」信息。

+0

一個好的選擇,但如果你想要緩解新的位置,它可能會導致問題。通常情況下,你停下的位置不會與所需的位置完全一樣,所以背景可能會結結塊。 – TJHeuvel