2015-10-18 5 views
3

Следующий код должен заменить индекс tilemap пробелом, однако ничего не происходит.Неправильно изменен Tilemap Pacman

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 [я] или даже tilemap [у] вместо tilemap [я] [ j], он делает то, что, по вашему мнению, будет, и tilemap [i] [j] работает для перемещения tilemap в петле, в которой он находится. Другими словами, это изменяет всю строку на карте плитки:

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.split ("");}); '. Тогда ваш синтаксис работает так, как ожидалось, и не загрязняет код. – Nolo

ответ

1

tilemap - это одномерный массив строк по 16 символов. Синтаксически строки принимают обозначение массива для поиска символа в них, что делает stringgVar[i] эквивалентом stringVar.charAt(i) Это объясняет, почему при чтении массива tilemap[i][j] возвращает j-й символ в i-й строке, хранящейся в tilemap, не вызывая ошибки.

И теперь вы столкнулись с тем, что я никогда раньше не видел.

Если вы назначаете то tilemap[i][j] Javascript принимает строку из i-го массива tilemap, рассматривает его как струнного объекта, к которому могут быть добавлены свойства и добавляет свойство с именем со значением j и значение свойства, указанное в RHS присвоения.

Если вы попытаетесь прочитать его после назначения, синтаксис массива, используемый для чтения, имеет приоритет, и вы просто получите j-й символ i-й строки.

Благодарим вас. Потрясающие!


Бесплатное обновление: вы не можете обновлять символы в примитивном объекте String, вы можете использовать только его значение или части своего значения для создания новой строки. Изучите методы String substr или substring, чтобы достичь того, что вы хотите сделать. (Вам необходимо будет заменить полную строковую запись в tilemap при ее обновлении.)