我需要編寫一個非常簡單的2D HTML帆布遊戲,包含一個角色和幾面牆。地圖(俯視圖)是一個多維數組(1=walls
)HTML Canvas遊戲:二維碰撞檢測
map = [
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0],
[1,0,0,1,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1],
[1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,0,1,1],
[1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,1,1,0,1,1],
[0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,0,1,1],
[1,1,1,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,1,1],
[1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,0,0,1,1],
[1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,1,0,0,1,1],
[1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
];
的字符不應該能夠行走在牆上......所以他只能遊走在「0」。我已經獲得了地圖渲染和角色的行走部分,但我無法弄清楚如何檢查碰撞。
一個非常簡單的版本可以在JSBin找到。您可以使用箭頭鍵或WASD移動(黑色方塊)。
我已經嘗試過通過使用像這樣做的一個非常簡單的碰撞檢測:
function checkCollision(x, y) {
if (map[ Math.round(x) ][ Math.round(y) ] !== 0) {
return true; // Collision
}
return false;
}
但是這並不完全工作(見JSBin)。與Math.round
字符和牆重疊...如果我使用Math.ceil
或Math.floor
它更糟糕。
有沒有什麼辦法可以改善這種「碰撞檢測」,讓角色無法越過紅牆?
的JavaScript在吸用大數字的工作... – kappaallday