Пиксели
Модуль спрайтов поддерживает также работу с пиксельной графикой. Вы можете создавать объекты -- наборы пикселей, модифицировать их и рисовать в спрайты.
Создание пикселей осуществляется функцией pixels.new().
Примеры:
local p1 = pixels.new(320, 200) -- создали пиксели 320x200
local p2 = pixels.new 'gfx/apple.png' -- создали пиксели из
-- изображения
local p3 = pixels.new(320, 200, 2) -- создали пиксели 320x200,
-- которые при отрисовке их в спрайт -- будут смасштабированы до
-- 640x400
Объект пиксели имеет следующие методы:
при описании использованы обозначения: r, g, b, a -- компоненты пикселя: красный, зелёный, синий, и прозрачность. Все значения от 0 до 255). x, y - координаты левого верхнего угла, w, h -- ширина и высота области.
- :size() -- вернуть размер и масштаб (как 3 значения);
- :clear(r, g, b, [a]) -- быстрая очистка пикселей;
- :fill(r, g, b, [a]) -- заливка (с учётом прозрачности);
- :fill(x, y, w, h, r, g, b, [a]) -- заливка области (с учётом прозрачности);
- :val(x, y, r, g, b, a) - задать значение пикселя
- :val(x, y) -- получить компоненты r, g, b, a
- :pixel(x, y, r, g, b, a) -- нарисовать пиксель (с учётом прозрачности существующего пикселя);
- :line(x1, y1, x2, y2, r, g, b, a) -- линия;
- :lineAA(x1, y1, x2, y2, r, g, b, a) -- линия с AA;
- :circle(x, y, radius, r, g, b, a) -- окружность;
- :circleAA(x, y, radius, r, g, b, a) -- окружность с AA;
- :poly({x1, y1, x2, y2, ...}, r, g, b, a) -- полигон;
- :polyAA({x1, y1, x2, y2, ...}, r, g, b, a) -- полигон с AA;
- :blend(x1, y1, w1, h1, pixels2, x, y) -- рисовать область пикселей в другой объект пиксели, полная форма;
- :blend(pixels2, x, y) -- короткая форма;
- :fill_circle(x, y, radius, r, g, b, a) -- залитый круг;
- :fill_triangle(x1, y1, x2, y2, x3, y3, r, g, b, a) -- залитый треугольник;
- :fill_poly({x1, y1, x2, y2, ...}, r, g, b, a) -- залитый полигон;
- :copy(...) -- как blend, но не рисовать, а копировать (быстро);
- :scale(xscale, yscale, [smooth]) -- масштабирование в новый объект pixels;
- :rotate(angle, [smooth]) -- поворот в новый объект pixels;
- :draw_spr(...) -- как draw, но в спрайт, а не пиксели;
- :copy_spr(...) -- как copy, но в спрайт, а не пиксели;
- :compose_spr(...) -- то же самое, но в режиме compose;
- :dup() -- создать копию пикселей;
- :sprite() -- создать спрайт из пикселей.
Также, есть возможность работы со шрифтами:
- pixels.fnt(fnt(шрифт.ttf, размер) -- создать шрифт;
При этом, у созданного объекта "шрифт" существует метод text:
- :text(текст, цвет(как в спрайтах), стиль) -- создать пиксели с текстом;
Например:
local fnt = pixels.fnt("sans.ttf", 64)
local t = fnt:text("HELLO, INSTEAD!", 'black')
pxl:copy_spr(sprite.scr())
pxl2:draw_spr(sprite.scr(), 100, 200);
t:draw_spr(sprite.scr(), 200, 400)Ещё один пример (автор примера, Андрей Лобанов):
require "sprite"
require "timer"
sprite.direct(true)
declare 'pxl' (false)
declare 't' (0)
function game:timer()
local x, y, i
t = t + 1
for x = 0, 199 do
for y = 0, 149 do
i = (x * x + y * y + t)
pxl:val(x, y, 0, i, i / 2)
end
end
pxl:copy_spr(sprite.scr())
end
function start(load)
pxl = pixels.new(200, 150, 4)
timer:set(20)
endПри процедурной генерации с помощью pixels удобно использовать шумы Перлина. В INSTEAD существуют функции:
- instead.noise1(x) - 1D шум Перлина;
- instead.noise2(x, y) - 2D шум Перлина;
- instead.noise3(x, y, z) - 3D шум Перлина;
- instead.noise4(x, y, z, w) - 4D шум Перлина;
Все эти функции возвращают значение в диапазоне [-1; 1] а на вход получают координаты с плавающей точкой.