2013-05-04 15 views
3

我正在嘗試製作一個小遊戲,僅僅爲了它的樂趣,我碰到了一些碰撞問題。我的播放器和2D陣列中的一個塊之間的碰撞檢測

我在畫布上繪製了一個玩家,在另一個畫布上繪製了一些塊(16 x 16px)。

但我在檢測水平碰撞時遇到了問題。

...

我的問題歸結爲:

我的播放器使用X,Y座標存儲爲:

var p_x; var p_y; 

這些值是玩家在像素左下角座標。

但我的塊是在一個稱爲二維數組:

var g_levelarray; 

並且每個塊爲16×16像素,從而,例如,如果我做的:

g_levelarray[3][2] = 1; 

意味着一個塊將被繪製在畫布左:48像素和帆布底部32PX

...

但後來我有我的代碼檢查塊(根據玩家),其中x和y是playercoordinates

function blockexists(x, y) { 
    var xpos = parseInt(x/g_blocksize); 
    var ypos = parseInt(y/g_blocksize); 


    $("#checkedblock").html("checked block: " + xpos + " " + ypos); 


    if (g_levelarray[xpos][ypos] != undefined) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

但查了一些錯誤,由於它四捨五入了號碼,當我打了塊從半年下來頂部的事實存在(如如下圖所示),它允許玩家進入區塊。

the error i have http://userhome.org/test/error.png

我也曾嘗試Math.round代替parseInt函數但這隻會在玩家中的一個問題。

那麼,如何以正確的方式編寫此代碼,以便我的玩家不會進入該塊?

THX提前

+0

如果'g_levelarray [xpos] [ypos]'代表一個字符串,然後 在您的代碼中'indexOf()'方法內部發生了什麼? – 2013-05-04 20:40:16

+0

我想我起初誤解了你,但是我明白你的觀點。代碼索引是錯誤的。它應該是indexOf('t')== -1。大聲笑。但仍然沒有問題,但:)但我現在剛剛刪除。 – JohnMalkowich 2013-05-04 21:00:41

+0

'return g_levelarray [xpos] [ypos]!= undefined'會更乾淨。 – Shikiryu 2013-05-04 21:19:21

回答

1

而不是僅僅使用parseIntround嘗試使用範圍。

取下限(Math.floor)和上限Math.ceil並通過檢查數組中的這些值來檢查塊是否存在於此範圍內。