Создание эффекта тумана, меняющегося в зависимости от альфы

Я пытаюсь реализовать «туман войны» в инструменте картирования, который я разрабатываю.

Для каждой ячейки сетки, если ячейка «затуманена», цвет устанавливается равным серому, умноженному на текущий цвет ячейки. В противном случае цвет ячейки устанавливается таким, каким обычно должен быть цвет ячейки.

Ниже моя функция draw.

for x = 0, (self.gridSize - 1) * self.scale, self.scale do
        for y = 0, (self.gridSize - 1) * self.scale, self.scale do
            local mouseX, mouseY = camera:mousepos()

            local curCell = self:getCell(x, y, true)
            local state = Grid:getState(x, y, true)

            if fog and curCell.fogged then
                local color = multiplyColors(curCell.color, {100,100,100,10})
                color[4] = 150
                if curCell:getState() == 1 then
                    love.graphics.setColor(color)
                else
                    love.graphics.setColor({100, 100, 100, 100})
                end
                love.graphics.rectangle('fill', x, y, self.scale, self.scale)
            elseif math.floor(mouseX / self.scale) == math.floor(x / self.scale) and math.floor(mouseY / self.scale) == math.floor(y / self.scale) then
                love.graphics.setColor(255, 0, 0, 30)
                love.graphics.rectangle('fill', x, y, self.scale, self.scale)

            elseif state == 1 then
                love.graphics.setColor(curCell.color)
                love.graphics.rectangle('fill', x, y, self.scale, self.scale)

            elseif state == 0 and self.bGridLines then
                love.graphics.setColor(100, 100, 100, 10)
                love.graphics.rectangle('line', x, y, self.scale, self.scale)
            end
        end
    end

А вот функция multiplyColors

function multiplyColors(c1, c2)
    local newColor = {}

    newColor[1] = math.floor((c1[1] * c2[1]) / 255)
    newColor[2] = math.floor((c1[2] * c2[2]) / 255)
    newColor[3] = math.floor((c1[3] * c2[3]) / 255)

    return newColor

end

Хотя это создает приятный эффект, мне нужна возможность установить непрозрачность тумана.

Например, если я изменяю строку color[4] = 150 на color[4] = 255, желаемый вывод должен быть что-то вроде этого что я на самом деле получаю при изменении этой строки. Аналогичным образом, изменение строки на color[4] = 0 дает это (что, по общему признанию, выглядит довольно аккуратно) вместо что-то вроде этого.

Вот ссылка на полный репозиторий: https://github.com/camdenb/DnD-Map-Creator

Спасибо!


person camden    schedule 05.02.2015    source источник


Ответы (1)


Простой способ получить разные уровни непрозрачности тумана — нарисовать туман по всему экрану, написав вне циклов:

love.graphics.setBackgoundColor(100, 100, 100) -- fog, everywhere

После этого, если ячейка туманная, нарисуйте ее с более низким значением альфа, чтобы показать туман под ней.

   if fogged and curCell.fogged then
      local c = curCell.color
      -- you can change 100 for various amounts of fog
      -- 0 means all fog and 255 means no fog
      love.graphics.setColor(c[1], c[2], c[3], 100)
      -- more code to draw...
   end

Вы можете поэкспериментировать с различными режимами наложения. В вики LÖVE есть несколько примеров получения различных эффектов при смешивании туманного фона с отрисовываемыми ячейками. сверху.

person ryanpattison    schedule 05.02.2015
comment
Это работает, спасибо! Интересно, что local c = curCell.color, а затем c[4] = 100 устанавливает альфу curCell в 0 (вместо только значения c, что является предполагаемым эффектом). Думаю, мне нужно больше узнать о том, как работают переменные Lua! - person camden; 06.02.2015
comment
Вот ссылка на справку по Lua о взаимосвязях между таблицами и переменными, назначенными таблицам. Таблица всегда анонимна. Между переменной, содержащей таблицу, и самой таблицей нет фиксированной связи. - person camden; 06.02.2015
comment
local c = curCell.color, а затем love.graphics.setColor(c[1], c[2], c[3], 100) — еще один вариант, если вы не хотите создавать так много временных таблиц. - person ryanpattison; 06.02.2015
comment
Ага, я так и сделал :) - person camden; 06.02.2015