2013-10-22 18 views
2

我有一個計算機圖形類的任務,我們是否需要更改遊戲代碼。這個類本身完全是關於理論的,所以我們必須爲自己弄清楚代碼,而且我從來沒有用C#編寫過程,所以對於我的任何無知都抱歉。如何使用CNA使用XNA來減少碰撞時的生命?

每當我的玩家精靈被一個盒子擊中時,我希望生命變量減少1。然而,每當它被擊中時它就會持續下去。我明白爲什麼會發生這種情況,但我不知道如何阻止它。

這是檢查兩個物體是否碰撞的代碼。

if (b.BoundBox.Intersects(player.BoundSphere)){ 
    player.hit = true; 
} 

在玩家我有更新功能:

if(hit){ 
    lives -= 1 
} 

我怎樣才能使它遞減只有一次,而不是不斷?

+0

當它命中時發生了什麼?球員? –

回答

4

發生這種情況是因爲它會不斷檢測到它正在發生碰撞,只要其中一個對象的一部分位於另一個對象內部就會發生碰撞。

你可以做些什麼來解決這個問題,當對象發生碰撞時,設置一個布爾值來表示對象已經發生了碰撞,然後啓動一個計時器,然後持續很多秒。雖然布爾值設置爲true,但當對象發生碰撞時,它不會減少生命,但如果它爲假,它會減少。定時器啓動後,將該值設置爲false,以便它們可以保持衝突。這給了對象時間離開另一個對象的'內臟'。

編輯:

這是一個非常簡單的解決,並在您的情況可能無法正常工作(因爲我不知道遊戲的規則)。更完整的解決方案是將對象分開,以便它們不再碰撞或預測每個對象所處的更新時間點,並防止它們實際發生碰撞。

+0

+1 ...通常'生命 - '意味着某種程度的重啓......或者至少是暫時的刀槍不入馬里奧。 –

+0

我想實現一個計數器,但我不知道如何。我使用gameTime函數的嘗試失敗了 –

1

對於這個問題,您不需要計時器,只需聲明另一個bool即可更新人生記錄。

if (b.BoundBox.Intersects(player.BoundSphere) && !player.hit) 
{ 
    player.hit = true; 
    player.updated = false; 
} 

在您的播放器的更新:

if (hit && !updated) 
{ 
    lives -= 1 
    updated = true; 
} 

但是,如果你想用一個計數器簡單地聲明:

TimeSpan timer = new TimeSpan(0, 0, x); //where x is how many seconds you need 

然後在Update方法:

timer -= gameTime.ElapsedGameTime; 
if (timer <= TimeSpan.Zero) 
{ 
    // do what you want 
} 
+0

+1這會很好地工作,但它只會在每場比賽中運行一次。 – iambeanie

+0

當然,當對象不再碰撞時,你必須重置布爾值或定時器。 – pinckerman