Создание Javascript TileEngine с возможностью прокрутки в Canvas

Основой для этого кода является блог Джона Э. Грэма http://johnegraham2.com/blog/2010/09/25/project-javascript-2d-tile-engine-with-html5-canvas-part-4-using-zones-for-further-optimization/

Он отлично работает для рисования мозаичных изображений на экране, но я не могу понять, как отрегулировать его по 1 строке / столбцу за раз, нажимая клавиши вверх, вниз, влево или вправо.

Вот пример с прозрачностью, помогающей визуализировать зоны http://simplehotkey.com/Javascript/canvas.html (загрузка позиций из 1188 плиток, но для заполнения экрана рисуется всего пара сотен) Я загрузил массив с 70000 записи, и это было все еще быстро, потому что он только рисует то, что на экране, но не может понять, как скользить все на основе ввода...

Я пришел с парой идей и не уверен, что лучше.

Здесь показан один скрин стоимости плитки:

 tilesArray = [ 
              0,0,0,0,0,0,0,1,2,9,6,0,0,7,0,0,1,0,
              0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,
              0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,9,0,
              0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,9,0,
              0,9,9,9,9,9,9,0,7,2,0,0,0,0,0,1,2,0,
              0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,
              0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,
              0,9,0,7,2,9,9,9,9,9,9,9,9,9,9,9,9,0,
              0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,
              0,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,
              0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
              ];

Где 0 - настенная плитка (по периметру), 9 - плитка для пола, 7 - дверь и пара других случайных плиток.

Это именно то, что загружается на экран, но я не могу понять, как сдвинуть все 1 фрагмент в любом направлении на основе ввода, вверх, вниз, влево, вправо.

Единственная идея, к которой я сейчас склоняюсь, это просто использовать указанный выше массив в качестве основы для рендеринга и каким-то образом подавать в него новые значения на основе ввода с клавиатуры из другого массива. Может быть, вырезать из другого, гораздо большего массива (содержащего все плитки для всего уровня) и использовать этот фрагмент для заполнения массива, который фактически отображается?

Это заменяет каждую плитку каждый кадр, хотя...

для получения информации от игрока я использовал:

//Key listener 
document.onkeydown = function(e){
e = e?e:window.event;
console.log(e.keyCode + "Down");
switch (e.keyCode){
    case 38:
    //UP KEY
    Game.inputReaction('up');   
    //Game.moveDir('up');
    break;
    case 40:
    //DOWN KEY  
    //Game.inputReaction(40);
    //Game.moveDir('down');
    break;
    case 37:
    //Left Key  
    //Game.inputReaction(37);
    break;
    }
}

Другая альтернатива - попытаться настроить плитки уже на экране и добавить новые плитки, но этот движок не использует глобальные переменные, поэтому я не уверен, как программно влиять на движок плиток на основе ввода.... как я могу добавить другой метод (inputReaction(num)) и вызвать некоторые действия из моего ввода с клавиатуры (console.log()), но я не могу получить доступ к другим методам, на самом деле рисующим плитки. Или, может быть, мне нужно сделать копию объекта, изменить его и вернуть? но это довольно сложно.

Я думаю, что может быть проще настроить значения массива, которые подаются в "движок" (массив выше), чем изменять то, как движок вычисляет то, что рисуется. Вы можете это подтвердить?

1 ответ

Решение

Добавьте абстракцию камеры, которую вы можете перемещать по карте, а затем сместите позиции рисования в соответствии с положением камеры. Когда камера перемещается на 10 пикселей на юг, все плитки перемещаются на 10 пикселей на север, то же самое происходит с востоком и западом. Поскольку вы рисуете только те плитки, которые видны, потери производительности не будут значительными.

Рендерер смотрит на камеру, чтобы выяснить, что нужно нарисовать, и вы можете выставить объект камеры наружу, чтобы манипулировать им. Таким образом, вам нужно всего лишь изменить положение камеры, чтобы изменить то, что отображается на экране.

Я сделал это в доказательстве концептуального движка листов год назад и смог плавно прокручивать и масштабировать огромные карты тайлов.

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

Другие вопросы по тегам