2012-07-27 70 views
3

我有一個移動的火星着陸器,我想檢測它何時在我正在製作的一個遊戲中打到加油站的頂部。我想知道確切地知道他們何時命中的最佳方式。什麼時候檢查碰撞

我現在在做的是我有3個計時器控制水平,垂直和引力運動。每個計時器都會使火星着陸器移動一點,所以我把碰撞檢測代碼放在每個火焰的頂部和底部,但是由於每個火焰每50毫秒發射一次a)它不會在發生碰撞時準確檢測到,b)它會調用碰撞檢測代碼很多次。

這是一個計時器看起來和它的幾乎所有3個相同的(我使遊戲在2008年VB中,這僅僅是一些僞代碼):

gravity timer: 
    detectCrash() 
    Move ship 
    detectCrash() 
End timer 
  1. 什麼是更準確的方法來查看它們是否在從碰撞到所調用的代碼的響應時間方面發生碰撞。

  2. 我該如何稱檢測的次數更少?

我可能再拍計時器每10毫秒火災左右,檢查碰撞,但那麼這將運行代碼,一個可怕的很多倍(100次),不會吧?

我也很好奇大型遊戲會如何處理這種最有可能每秒發生多次的事情。

謝謝。

+1

爲什麼在移動之前檢查碰撞?如果之前的迭代(定時器末尾的那個)沒有檢測到崩潰,那麼在定時器的開始就不會有一個,對吧?如果你擺脫了這一點,那麼你將處理時間(碰撞)減半。 – APrough 2012-07-27 12:47:55

+0

哦,是的。事情是,因爲有3個計時器,我認爲其他人可能已經移動了船,然後如果在再次移動之前檢查運動,則需要更少的時間。 – cohen 2012-07-27 12:52:52

回答

1

您不希望有單獨的定時器來移動對象和檢測碰撞。這種方法有幾個明顯的問題:

  • 它根本不能縮放;想象添加更多的對象。你會有兩個計時器(每個X和Y飛機各一個)?你會添加另一個計時器來檢測每個對象的衝突嗎?
  • 定時器可能不同步 - 想象你在X平面移動你的船的代碼比Y平面的代碼運行需要更長的時間。突然你的船垂直移動比水平移動更頻繁。

'真實'遊戲有一個單一的循環,它消除了你的大部分問題。在僞代碼:

  1. 檢查用戶輸入
  2. 制定出新的X和船舶的Y位置
  3. 檢查衝突
  4. 在屏幕上
  5. 抽籤結果
  6. 轉到1

很顯然,除了一個簡單的遊戲之外,還有其他更多的東西!但這是你想要的方法,而不是試圖爲你所做的每件事都分開循環。

+0

該死的,打我吧。 – APrough 2012-07-27 13:02:22

2

你可以做的一件事就是使用一個計時器來控制16或17毫秒(大約60幀/秒)的所有移動,但即使這可能太快,你應該也許罰款40毫秒(25幀/秒)。在這個計時器事件中,在移動之前計算對象的新位置,查看是否將在新位置發生碰撞,以及是否移動對象。

至少這就是我將如何在vb.net中做到這一點。但是我可能會使用XNA。

+0

感謝1計時器是一個好主意 – cohen 2012-07-28 06:15:23