Я пытаюсь реализовать эффект освещения в игре HTML5/JavaScript, используя замену плитки. То, что у меня есть сейчас, вроде работает, но переходы выглядят недостаточно плавными/естественными при перемещении источника света. Вот где я сейчас:
- Прямо сейчас у меня есть фоновая карта, к которой применен тайловый лист PNG со спектром света/тени — переходя от самой темной плитки к полностью прозрачной. По умолчанию самая темная плитка рисуется по всему уровню при запуске, закрывая все остальные слои и т. д.
- Я использую предопределенные размеры плитки (40 x 40 пикселей) для вычисления положения каждой плитки и сохранения ее координат x и y в массиве.
- Затем я создаю прозрачный объект «сетка» размером 40 x 40 пикселей в каждой позиции в массиве.
- Используемый мной движок ([ImpactJS][1]) затем позволяет мне рассчитать расстояние от моего объекта источника света до каждого экземпляра этого объекта блока сетки.
- Затем я могу заменить плитку под каждой из этих плиток блока сетки плиткой с соответствующей прозрачностью.
В настоящее время я выполняю такие вычисления в каждом экземпляре объекта блока сетки, который появляется на карте:
var dist = this.distanceTo( ig.game.player );
var percentage = 100 * dist / 960;
if (percentage < 2) {
// Spawns tile 64 of the shadow spectrum tilesheet at the specified position
ig.game.backgroundMaps[2].setTile( this.pos.x, this.pos.y, 64 );
} else if (percentage < 4) {
ig.game.backgroundMaps[2].setTile( this.pos.x, this.pos.y, 63 );
} else if (percentage < 6) {
ig.game.backgroundMaps[2].setTile( this.pos.x, this.pos.y, 62 );
}
(извините за странный интервал, я до сих пор не научился правильно вставлять сюда код)
Проблема в том, что, как я уже сказал, этот тип расчета не делает источник света очень естественным. Переключение тайлов выглядит слишком резким, тогда как в идеале они должны плавно появляться и исчезать, используя лист тайлов спектра (я скопировал лист тайлов из другой игры, в которой это удается, поэтому я знаю, что это не проблема с оттенками тайлов. Я просто не уверен как это делает другая игра). Я думаю, что, возможно, мой метод использования процентов для переключения плиток можно было бы заменить какой-то лучшей / более динамичной формулой близости, которая позволила бы более плавные переходы? Может у кого-нибудь есть идеи, что я могу сделать, чтобы улучшить визуальные эффекты здесь, или лучший способ вычисления близости с информацией, которую я собираю о каждой плитке?