2015-10-18 20 views
3

以下代碼應該用空格替換tilemap索引,但不會發生任何反應。Pacman Tilemap無法正確更改

tilemap的:

var tilemap = [ 

    "wwwwwwwwwwwwwwww", 
    "wmmmmmmmmmmmmmmw", 
    "wmwmwmwwwwmwmwmw", 
    "wmmbwmmmmmmwbmmw", 
    "wmwwwwwwwwwwwwmw", 
    "wmwmmmmssmmmmwmw", 
    " mwmwwwsswwwmwm ", 
    "wmwmwwwwwwwwmwmw", 
    " mwmwmmmmmmwmwm ", 
    "wmwmwmwwwwmwmwmw", 
    "wmwmmmmmmmmmmwmw", 
    "wmwmwwwwwwwwmwmw", 
    "wmwmwbmmmmbwmwmw", 
    "wmwmwmwwwwmwmwmw", 
    "wmmmmmmmmmmmmmmw", 
    "wwwwwwwwwwwwwwww",]; 

代碼改變tilmap:

if (Player.x > j*25 && 
Player.x < j*25+25 && 
Player.y > i*25 && 
Player.y < i*25+25 
) { 
    tilemap[i][j] = ' '; 
} 

是什麼奇怪的是,如果它是tilemap的[I],甚至tilemap的研究[J],而不是tilemap的[I] [ j],它會做你會想到的,並且tilemap [i] [j]用於遍歷它所在的循環中的tilemap。換句話說,這改變了tile地圖中的整個行:

if (Player.x > j*25 && 
    Player.x < j*25+25 && 
    Player.y > i*25 && 
    Player.y < i*25+25 
) { 
    tilemap[i] = ' '; 
} 
+0

這已經很晚了,但有很多用處,但一個乾淨的方法是使用'var map = [「www ...」 ...]的forEach(函數(E){e.split( 「」);});'。然後你的語法就像預期的那樣工作,不會弄髒代碼。 – Nolo

回答

1

tilemap是一個由16個字符組成的單維數組。語法字符串接受數組符號來查找它們中的字符使得stringgVar[i]等效於stringVar.charAt(i)這解釋了爲什麼當讀取數組時,tilemap[i][j]返回保存在tilemap中的第i個字符串中的第j個字符而不會引發錯誤。

現在你遇到了我從未見過的東西。

如果您分配東西tilemap[i][j] JavaScript邁出的第i個字符串從tilemap的陣列,將其視爲可加入,其性能String對象,並增加了與j值命名屬性以及在作業的RHS中指定的財產價值。

但是,如果您嘗試在賦值後將其讀回,則用於讀取的數組語法優先,而您只獲取第i個字符串的第j個字符。

謝謝你的提問。真棒!


免費更新:您無法更新原始String對象內的字符,只能使用其值或其部分值組成新字符串。看看使用String方法substrsubstring來實現你想要做的事情。 (當你更新它時,你將需要在tilemap中替換一個完整的字符串條目。)