Skip to content

Пиксели

Модуль спрайтов поддерживает также работу с пиксельной графикой. Вы можете создавать объекты -- наборы пикселей, модифицировать их и рисовать в спрайты.

Создание пикселей осуществляется функцией 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(текст, цвет(как в спрайтах), стиль) -- создать пиксели с текстом;

Например:

lua
	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)

Ещё один пример (автор примера, Андрей Лобанов):

lua
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] а на вход получают координаты с плавающей точкой.