Difference between revisions of "Gradients (日本語)"

(Created page with "==gradient== === 概要 === <source lang="lua">gradient {color1, color2, color3, ..., direction = 'horizontal' or 'vertical'}</source> 引数テーブルの "direction" によ...")
 
m
Line 75: Line 75:
 
[[Category:Snippets (日本語)]]
 
[[Category:Snippets (日本語)]]
 
{{#set:Author=SelectricSimian}}
 
{{#set:Author=SelectricSimian}}
 +
{{#set:LOVE Version=any}}
 
{{#set:Description=画像と補間を使用してグラデーションを高速描画します。}}
 
{{#set:Description=画像と補間を使用してグラデーションを高速描画します。}}

Revision as of 00:03, 15 November 2016

gradient

概要

gradient {color1, color2, color3, ..., direction = 'horizontal' or 'vertical'}

引数テーブルの "direction" により指定された方向へ、階調度全体を一定間隔で均一に配置を行った配色テーブルからグラデーションのオブジェクト (実際は単なる画像) を作成します。

Source

function gradient(colors)
    local direction = colors.direction or "horizontal"
    if direction == "horizontal" then
        direction = true
    elseif direction == "vertical" then
        direction = false
    else
        error("Invalid direction '" .. tostring(direction) "' for gradient.  Horizontal or vertical expected.")
    end
    local result = love.image.newImageData(direction and 1 or #colors, direction and #colors or 1)
    for i, color in ipairs(colors) do
        local x, y
        if direction then
            x, y = 0, i - 1
        else
            x, y = i - 1, 0
        end
        result:setPixel(x, y, color[1], color[2], color[3], color[4] or 255)
    end
    result = love.graphics.newImage(result)
    result:setFilter('linear', 'linear')
    return result
end

drawinrect

概要

drawinrect(img, x, y, w, h, r, ox, oy, kx, ky)

絶対的な大きさの長方形にて拡大・縮小された画像を描画する便利な関数です(画像の大きさとは相対的な大きさではなく、 love.graphics.draw() が処理するものです)。ほぼに常に拡大・縮小されたものを描画したい理由があるとき、および配色数により境界が変更されることを望まない場合、グラデーションに対して有用です。

ソース

function drawinrect(img, x, y, w, h, r, ox, oy, kx, ky)
    return -- 効率的にするためのちょっとした付け足しのための末尾の呼び出し。
    love.graphics.draw(img, x, y, r, w / img:getWidth(), h / img:getHeight(), ox, oy, kx, ky)
end

用例

画面中央に 100 x 100 ピクセルの水平方向の虹 (すなわち、上部は赤であり、下部は紫) を描画します。

require "gradient"

local rainbow = gradient {
    direction = 'horizontal';
    {255, 0, 0};
    {255, 255, 0};
    {0, 255, 0};
    {0, 255, 255};
    {0, 0, 255};
    {255, 0, 0};
}

function love.draw()
    drawinrect(rainbow, love.graphics.getWidth() / 2 - 50, love.graphics.getHeight() / 2 - 50, 100)
end

画面全体を塗りつぶす垂直方向の白黒領域 (すなわち、左部は黒であり、右部は白) を描画します。

require "gradient"

local greyscale = gradient {
    direction = 'vertical';
    {0, 0, 0};
    {255, 255, 255};
}

function love.draw()
    drawinrect(greyscale, 0, 0, love.graphics.getWidth(), love.graphics.getHeight())
end