我一直在閱讀關於在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
我應該注意到,找到拼貼後,Mario World使用函數查找表來處理拼貼衝突,這意味着每個拼貼只執行想要執行的代碼。 – Sukasa 2009-07-15 06:09:57