[Алгоритм Java] Корректное удаление освещения

Всем привет, я делаю простейшую систему освящения для моего 2D клона любимых кубиков. Нужно доработать удаление освещения, что я не могу сделать.
код:

// Аргумент level игнорируется!
public void createLight(int x, int y, byte level) {
  for (int by = -14; by < 15; by++)
  for (int bx = -14; bx < 15; bx++) {
      int distance = Math.abs(bx) + Math.abs(by);
      byte light = (byte) (14 - distance);
      if (distance >= 15) continue;
      if (light <= world.getBlock(x + bx, y + by).getLightLevel()) continue;

      world
      .getBlock(x + bx, y + by)
      .setLightLevel(light);
    } 
}

public void removeLight(int x, int y, byte level) {
  for (int by = -14; by < 15; by++)
  for (int bx = -14; bx < 15; bx++) {
      int distance = Math.abs(bx) + Math.abs(by);
      if (distance >= 15) continue;

      byte light = (byte) (14f - distance);
      if (world.getBlock(x + bx, y + by).getLightLevel() == light)
          world.getBlock(x + bx, y + by).setLightLevel((byte) 0);
    }
}

установка:


текущее удаление:

Нужно сделать так, чтобы после удаления света, другие корректировались в области удалённого света.

Это чистая математика, спроси чат гпт

Кроме того, в алгоритме сразу нужно предусмотреть, что свет может падать и от других источников. И просто обновлять свет только в одних участках, попутно сравнивая.
В целом, половина этого алгоритма только у тебя, так еще и неправильная.

P.s. комментарий написан на первый взгляд, без особых думок и тем более тестов.

Фактически вся ошибка здесь. Ты зачем-то просто приводишь свет к 0 удаляя его.Забывая что у тебя 2 источника. А удаление при обнаружении дистанции (радиуса) срабатывает на освещении 1, которая соприкосается и даже накладывается на 2 источник. Но из-за приведения к 0, ты буквально просто убрал свет и 1 и 2 - потому что никаких проверок не сделал. Тебе лучше обновлять каждый блок, вынеси в отдельный метод.

1 лайк
  1. Ошибка или недоработка. Ты вычисляешь где у тебя свет будет, это очень плохо оптимизируемый участок. А именно, что каждое движение придётся обновлять - это bad practice.
    Конечно вряд-ли ты поймёшь концепт чанков, раз с таким не справился. Поэтому есть другая идея.
    Вынеси источники света, а также те блоки которые уже были обновлены в коллекцию.
    А именно их координаты, источник света уже будет задан всегда и его не нужно будет искать. Просто будет сверка. Блоки которые были обновлены, тоже самое. Буквально. Прошла итерация - добавляем этот блок, и он не трогается никогда, пока это ты не изменишь в игре. Существенно и память сэкономит и цпу, что важно в 2д

terraria 2.0

Привет! Я учёл твои три совета, с ними я согласен, эти дни я потратил на исправление проблемы и создания гладкого освещения. Рендер всего я вынес в отдельный класс как и чанки освещения, так как я обдумал создание еще одного класса чанка где уже находится сжатые мыши блоков, в чем еще раз я убеждаюсь в твоем мнении .:slight_smile: Также потратил дни на базовые паки для добавления блоков, а то в последствии добавлять различные блоки через код, ну такоооое.


1 лайк

это top-down майнкрафт?

или аля террария

аля террария*

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

Ну и это правильно решение, иначе бы нарушение DRY, а в случае игр и их граф. составляющей была бы и одна из крит. ошибок.

В целом, тебе всю карту нужно вынести в такую архитектуру, Поэтому советую почитать про паттерн Tile based design и ECS. Даст большой буст и в изучении, да и ты наверное сразу поймешь больше, чем за год простого поэтапного улучшения.

1 лайк

Эта тема была автоматически закрыта через 12 часов после последнего ответа. В ней больше нельзя отвечать.