2009-07-15 63 views
19

我一直在閱讀關於在stackoverflow和其他網站上的遊戲碰撞檢測。他們中的很多人都在談論BSP,限制elipses,整合等。但是,在NES上,他們設法在遊戲中進行地板和牆壁碰撞檢測,我很難相信他們做了許多計算來檢測牆壁碰撞。老遊戲是如何與牆壁,地板和天花板進行碰撞檢測的?

我想我的問題是,由於由只是磚的水平,他們怎麼檢測與牆壁和地板的碰撞在遊戲像馬里奧和洛克人其中有一點的處理能力?

  • 他們是否遵循運動路徑並確定最接近的連接瓦片? (有點搜索)(先驗)
  • 他們是否確定了與地面的碰撞,然後找出調整角色的最佳方式? (後驗)如果時間步長可變,這是有風險的,如果速度足夠快,你可以跳過一個瓦片。儘管我假設NES遊戲的時間步與電視的刷新率同步。
  • 當你在地面時重力總是會影響你的角色嗎?或者當你決定在瓷磚上行走時,你是否「關閉」?當你走出懸崖邊緣時呢?否則,你需要某種方式來確定你下方的瓷磚。
  • 如果你已經有瓷磚相撞,將您只是發現瓷磚的邊緣,你的角色移動到它的一側(根據行駛方向)?
  • 如何在超級metroid和馬里奧傾斜瓷磚?
  • 怎麼樣'平臺',你可以跳過底部和頂部。如果你正在做'後驗',你會如何處理與這些瓷磚的碰撞?

我寫了一些基本上是'priori'的碰撞代碼,因爲它搜索你將在某個方向上碰到的第一個tile。我只是想知道是否有更好的方法。 (只是用後的,其實碰撞檢測,而不是也許)

例如,代碼來檢查瓷磚碰撞的向下移動(我檢查VERT則水平移動):

def tile_search_down(self, char, level): 
     y_off = char.vert_speed 
     assert y_off > 0 

     # t_ are tile coordintes 
     # must be int.. since we're adding to it. 
     t_upper_edge_y = int(math.ceil((char.y+char.h)/self.tile_height)) #lowest edge 
     while (t_upper_edge_y*self.tile_height) < (char.y+char.h+y_off): # lowest edge + offset 

      t_upper_edge_x = int(math.floor(char.x/self.tile_width)) 
      while (t_upper_edge_x*self.tile_width) < (char.x+char.w): 

       t_x = t_upper_edge_x 
       t_y = t_upper_edge_y 
       if self.is_tile_top_solid(t_x, t_y, plane): 
        char.y = t_y*self.tile_height - char.h 
        char.vert_speed = 0.0 
        char.on_ground = True 
        return 

       t_upper_edge_x += 1 
      t_upper_edge_y += 1 

     char.y += y_off 

回答

17

的各類NES-的你正在談論的時代遊戲,一切都是二維的。這一件事簡化了很多事情。

那個時代(特別是那些使用硬件精靈,如64代)的一些機器有硬件的碰撞檢測。大多數不依賴於硬件衝突檢測的遊戲都會使用邊界框或命中掩碼(精靈的1位位圖)。

無論哪種方式,碰撞檢測,通常是做「後天」,除特殊情況下,像世界的邊緣。有些遊戲實際上確實存在一些錯誤,當你碰到某些東西時移動得太快會導致你通過它。 (事實上​​,80年代初期的遊戲評論往往會在碰撞檢測精確程度是發表評論。)

對於平臺遊戲,你通常會檢查,看看是否字符應用重力之前的「接地」。

單向平臺的東西不是太難對付的事實後,因爲你知道精靈的速度矢量,所以你可以用它來確定碰撞是否應該註冊。

12

對於遊戲,如超級馬里奧世界(SNES),遊戲存儲在存儲器中的格式,使得它容易把馬里奧的X/Y位置,將其轉​​換成片地址,然後立即檢查周圍的地磚水平那個地址。由於水平總是固定的寬度(儘管你可以看到不同的區域),它使得處理更容易管理,因爲它總是與馬里奧的位置有固定的偏移,例如,地址+ 1爲馬里奧旁邊的瓷磚,地址+ 0x300爲他下面的瓷磚等。

+0

我應該注意到,找到拼貼後,Mario World使用函數查找表來處理拼貼衝突,這意味着每個拼貼只執行想要執行的代碼。 – Sukasa 2009-07-15 06:09:57

12

這裏有文章深入瞭解編程任天堂娛樂系統(NES)「平臺遊戲」。

我可能沒有被正確使用Google,因爲我還沒有這篇文章時偶然發現之前。