render
Модуль render рисует фигуры поверх игры и переводит координаты мира в координаты экрана. Здесь — фигуры и экран; стеки состояний, шрифты и картинки описаны на отдельных страницах.
Общие правила#
- Только внутри события
render. Функции рисования работают только во время раздачи событияrender. Вне его — ошибкаthis function may only be called inside the 'render' event. Без события работаютscreen_size,world_to_screen,offscreen,camera_angles, а также загрузка шрифтов и картинок иmeasure_text. - Прямоугольник задаётся как
(pos, size): второйvector2— это размер, правый нижний угол =pos + size. - Скругление
rounding— число (один радиус на все углы) или таблица{tl, tr, br, bl}(левый верхний, правый верхний, правый нижний, левый нижний). Если не передано — углы прямые. - Углы дуг.
start— начальный угол в градусах (по умолчанию 0),pct— доля полного круга (1 — весь круг, 0.5 — половина; по умолчанию 1). - Необязательные аргументы засчитываются только при точном типе: вместо числа нельзя передать строку с числом.
nilозначает «не передан».
color(255, 0, 0)без альфы невидим: альфа по умолчанию 0. Пишитеcolor(255, 0, 0, 255).
render.screen_size()#
Размер экрана в пикселях. Работает и вне события render.
Возвращает: vector2 — ширина и высота.
local font = render.load_font("Verdana", 14, "outline")
events.render:set(function()
local center = render.screen_size() / 2
render.text(center, color(255, 255, 255, 255), font, "c", "+")
end)
render.world_to_screen(pos: vector)#
Переводит точку мира в точку экрана. Результат округляется до целых пикселей.
| Параметр | Тип | Описание |
|---|---|---|
pos |
vector |
точка в мире |
Возвращает: vector2 или nil, если точку нельзя спроецировать (например, она позади камеры).
events.render:set(function()
for _, pawn in ipairs(entity.pawns(true)) do
local p = render.world_to_screen(pawn:origin())
if p then
render.circle(p, color(255, 60, 60, 255), 4) -- точка у ног врага
end
end
end)
render.offscreen(pos: vector, t?: number)#
Проецирует точку мира для стрелки-указателя у края экрана. Если точка видна на экране, возвращается её экранная позиция. Если точка за краем экрана или позади камеры, возвращается точка на окружности вокруг центра экрана в направлении на неё.
| Параметр | Тип | Описание |
|---|---|---|
pos |
vector |
точка в мире |
t |
number |
радиус окружности в долях половины меньшей стороны экрана: 0 — центр, 1 — край. Зажимается в [0, 1]; по умолчанию 1 |
Пример: на экране 3440×1440 половина меньшей стороны — 720 px, при t = 0.25 точка ставится в 180 px от центра.
Возвращает: vector, number, boolean:
- точку на экране (
vector,zвсегда 0); - угол направления на точку в градусах (0, если точка видна);
true, если точка за краем экрана;false, если она видна.
Работает и вне события render. Если размер экрана не получен, ошибка offscreen: screen size unavailable.
-- Точка-указатель на каждого врага за краем экрана
events.render:set(function()
for _, pawn in ipairs(entity.pawns(true)) do
local p, ang, off = render.offscreen(pawn:origin(), 0.8)
if off then
render.circle(vector2(p.x, p.y), color(255, 60, 60, 255), 5)
end
end
end)
render.camera_angles()#
Углы основной камеры игры.
Возвращает: angle — копия углов камеры.
local font = render.load_font("Verdana", 14, "outline")
events.render:set(function()
local a = render.camera_angles()
render.text(vector2(20, 60), color(255, 255, 255, 255), font, nil, string.format("pitch %.1f yaw %.1f", a.x, a.y))
end)
render.line(a: vector2, b: vector2, col: color, thickness?: number)#
Рисует отрезок.
| Параметр | Тип | Описание |
|---|---|---|
a |
vector2 |
начало |
b |
vector2 |
конец |
col |
color |
цвет |
thickness |
number |
толщина, по умолчанию 1 |
Возвращает: ничего.
-- Линия от центра низа экрана к каждому врагу
events.render:set(function()
local s = render.screen_size()
local from = vector2(s.x / 2, s.y)
for _, pawn in ipairs(entity.pawns(true)) do
local p = render.world_to_screen(pawn:origin())
if p then
render.line(from, p, color(255, 200, 0, 180), 1)
end
end
end)
render.bezier(p1: vector2, p2: vector2, p3: vector2, p4: vector2, col: color, thickness: number, segments?: number)#
Рисует кубическую кривую Безье от p1 к p4 с контрольными точками p2 и p3.
| Параметр | Тип | Описание |
|---|---|---|
p1 … p4 |
vector2 |
начало, две контрольные точки, конец |
col |
color |
цвет; при альфе 0 ничего не рисуется |
thickness |
number |
толщина (обязательна) |
segments |
number |
число отрезков; по умолчанию 0 — подбирается автоматически |
Возвращает: ничего.
events.render:set(function()
render.bezier(vector2(40, 300), vector2(90, 240), vector2(140, 360), vector2(190, 300), color(0, 200, 255, 255), 2)
end)
render.rect(pos: vector2, size: vector2, col: color, rounding?: number|table)#
Рисует залитый прямоугольник.
| Параметр | Тип | Описание |
|---|---|---|
pos |
vector2 |
левый верхний угол |
size |
vector2 |
размер |
col |
color |
цвет заливки |
rounding |
number или table |
скругление углов |
Возвращает: ничего.
events.render:set(function()
render.rect(vector2(20, 100), vector2(160, 40), color(20, 20, 20, 200), 6)
end)
render.rect_outline(pos: vector2, size: vector2, col: color, thickness?: number, rounding?: number|table)#
Рисует контур прямоугольника.
| Параметр | Тип | Описание |
|---|---|---|
pos |
vector2 |
левый верхний угол |
size |
vector2 |
размер |
col |
color |
цвет |
thickness |
number |
толщина, по умолчанию 1 |
rounding |
number или table |
скругление углов |
Возвращает: ничего.
events.render:set(function()
-- скруглены только верхние углы
render.rect_outline(vector2(20, 100), vector2(160, 40), color(255, 255, 255, 255), 1, { 6, 6, 0, 0 })
end)
render.rect_shadow(pos: vector2, size: vector2, col: color, rounding?: number|table, blur?: number, offset?: vector2)#
Рисует мягкую тень прямоугольника.
| Параметр | Тип | Описание |
|---|---|---|
pos |
vector2 |
левый верхний угол |
size |
vector2 |
размер |
col |
color |
цвет тени |
rounding |
number или table |
скругление углов |
blur |
number |
размытие, по умолчанию 0 |
offset |
vector2 |
смещение тени, по умолчанию (0, 0) |
Возвращает: ничего.
events.render:set(function()
local pos, size = vector2(20, 160), vector2(160, 40)
render.rect_shadow(pos, size, color(0, 0, 0, 200), 6, 12, vector2(0, 2))
render.rect(pos, size, color(30, 30, 30, 255), 6)
end)
render.rect_gradient(pos: vector2, size: vector2, c1: color, c2: color, c3: color, c4: color, rounding?: number|table)#
Рисует прямоугольник с градиентом по углам.
| Параметр | Тип | Описание |
|---|---|---|
pos |
vector2 |
левый верхний угол |
size |
vector2 |
размер |
c1 |
color |
левый верхний угол |
c2 |
color |
правый верхний угол |
c3 |
color |
левый нижний угол |
c4 |
color |
правый нижний угол |
rounding |
number или table |
скругление углов |
Возвращает: ничего.
events.render:set(function()
local a, b = color(255, 80, 80, 255), color(80, 80, 255, 255)
-- горизонтальный градиент: слева красный, справа синий
render.rect_gradient(vector2(20, 220), vector2(160, 8), a, b, a, b, 4)
end)
render.rect_glow(pos: vector2, size: vector2, col: color, rounding?: number|table)#
Рисует светящуюся полосу-акцент. Из скругления берётся только радиус левого верхнего угла.
| Параметр | Тип | Описание |
|---|---|---|
pos |
vector2 |
левый верхний угол |
size |
vector2 |
размер |
col |
color |
цвет свечения |
rounding |
number или table |
скругление |
Возвращает: ничего.
events.render:set(function()
render.rect_glow(vector2(20, 240), vector2(4, 40), color(120, 160, 255, 255), 8)
end)
render.rect_window(pos: vector2, size: vector2, rounding?: number|table)#
Рисует фон окна в стиле меню (с размытием фона и тенью). Из скругления берётся радиус левого верхнего угла.
| Параметр | Тип | Описание |
|---|---|---|
pos |
vector2 |
левый верхний угол |
size |
vector2 |
размер |
rounding |
number или table |
скругление |
Возвращает: ничего.
- Вызов снимает действующий
render.push_blur.
local font = render.load_font("Verdana", 14)
events.render:set(function()
render.rect_window(vector2(20, 300), vector2(180, 50), 10)
render.text(vector2(110, 325), color(255, 255, 255, 255), font, "c", "Окно скрипта")
end)
render.rect_window_shadow(pos: vector2, size: vector2, rounding?: number|table)#
Рисует только тень окна в стиле меню. Радиус левого верхнего угла применяется ко всем углам.
| Параметр | Тип | Описание |
|---|---|---|
pos |
vector2 |
левый верхний угол |
size |
vector2 |
размер |
rounding |
number или table |
скругление |
Возвращает: ничего.
events.render:set(function()
render.rect_window_shadow(vector2(220, 300), vector2(120, 50), 8)
render.rect(vector2(220, 300), vector2(120, 50), color(25, 25, 25, 255), 8)
end)
render.circle(center: vector2, col: color, radius: number, start?: number, pct?: number)#
Рисует залитый круг или сектор. При альфе 0 или radius <= 0 ничего не рисуется.
| Параметр | Тип | Описание |
|---|---|---|
center |
vector2 |
центр |
col |
color |
цвет |
radius |
number |
радиус |
start |
number |
начальный угол, градусы; по умолчанию 0 |
pct |
number |
доля круга; по умолчанию 1 |
Возвращает: ничего.
events.render:set(function()
render.circle(vector2(60, 400), color(255, 0, 255, 255), 16, 0, 0.75) -- три четверти круга
end)
render.circle_outline(center: vector2, col: color, radius: number, start?: number, pct?: number, thickness?: number)#
Рисует окружность или дугу контуром.
| Параметр | Тип | Описание |
|---|---|---|
center |
vector2 |
центр |
col |
color |
цвет |
radius |
number |
радиус |
start |
number |
начальный угол, градусы; по умолчанию 0 |
pct |
number |
доля круга; по умолчанию 1 |
thickness |
number |
толщина, по умолчанию 1 |
Возвращает: ничего.
-- Индикатор здоровья дугой вокруг прицела
events.render:set(function()
local me = entity.local_pawn()
if not me or not me:is_alive() then return end
local center = render.screen_size() / 2
render.circle_outline(center, color(80, 255, 120, 255), 24, -90, me:health() / 100, 2)
end)
render.circle_gradient(center: vector2, edge: color, inner: color, radius: number, softness?: number, start?: number, pct?: number)#
Рисует круг с радиальным градиентом от центра к краю.
| Параметр | Тип | Описание |
|---|---|---|
center |
vector2 |
центр |
edge |
color |
цвет края |
inner |
color |
цвет центра |
radius |
number |
радиус |
softness |
number |
доля радиуса, занятая переходом от цвета края к цвету центра; по умолчанию 1 — плавный градиент |
start |
number |
начальный угол, градусы; по умолчанию 0 |
pct |
number |
доля круга; по умолчанию 1 |
- Малые значения
softness(например, 0.1) дают сплошной круг цветаinnerс тонким переходом кedgeу края. - Значения от 0.5 и выше дают плавный градиент. Значения больше 1 работают как 1.
Возвращает: ничего.
events.render:set(function()
-- плавный градиент
render.circle_gradient(vector2(120, 400), color(255, 0, 0, 0), color(255, 0, 0, 255), 20)
-- сплошной круг с мягким краем
render.circle_gradient(vector2(180, 400), color(255, 0, 0, 0), color(255, 0, 0, 255), 20, 0.1)
end)
render.circle_shadow(center: vector2, col: color, radius: number, blur: number, start?: number, pct?: number, offset?: vector2)#
Рисует мягкую тень круга.
| Параметр | Тип | Описание |
|---|---|---|
center |
vector2 |
центр |
col |
color |
цвет тени |
radius |
number |
радиус |
blur |
number |
размытие (обязательно) |
start |
number |
начальный угол, градусы; по умолчанию 0 |
pct |
number |
доля круга; по умолчанию 1 |
offset |
vector2 |
смещение, по умолчанию (0, 0) |
Возвращает: ничего.
events.render:set(function()
local c = vector2(180, 400)
render.circle_shadow(c, color(0, 0, 0, 255), 14, 10)
render.circle(c, color(240, 240, 240, 255), 14)
end)
render.circle_blur(center: vector2, alpha: number, radius: number, start?: number, pct?: number)#
Рисует круг размытого фона.
| Параметр | Тип | Описание |
|---|---|---|
center |
vector2 |
центр |
alpha |
number |
прозрачность размытия, 0–1 |
radius |
number |
радиус |
start |
number |
начальный угол, градусы; по умолчанию 0 |
pct |
number |
доля круга; по умолчанию 1 |
Возвращает: ничего.
events.render:set(function()
render.circle_blur(vector2(240, 400), 1, 28)
end)
render.triangle(a: vector2, b: vector2, c: vector2, col: color)#
Рисует залитый треугольник.
| Параметр | Тип | Описание |
|---|---|---|
a, b, c |
vector2 |
вершины |
col |
color |
цвет |
Возвращает: ничего.
-- Стрелка-указатель над центром экрана
events.render:set(function()
local c = render.screen_size() / 2
render.triangle(vector2(c.x, c.y - 40), vector2(c.x + 8, c.y - 52), vector2(c.x - 8, c.y - 52), color(255, 255, 255, 255))
end)
render.triangle_outline(a: vector2, b: vector2, c: vector2, col: color, thickness?: number)#
Рисует контур треугольника.
| Параметр | Тип | Описание |
|---|---|---|
a, b, c |
vector2 |
вершины |
col |
color |
цвет |
thickness |
number |
толщина, по умолчанию 1 |
Возвращает: ничего.
events.render:set(function()
render.triangle_outline(vector2(300, 380), vector2(320, 410), vector2(280, 410), color(255, 255, 255, 255), 1.5)
end)
render.poly(points: table, col: color)#
Рисует выпуклый залитый многоугольник.
| Параметр | Тип | Описание |
|---|---|---|
points |
table |
массив вершин {vector2, ...} |
col |
color |
цвет |
Возвращает: ничего.
events.render:set(function()
render.poly({ vector2(340, 380), vector2(360, 390), vector2(350, 410), vector2(330, 400) }, color(0, 128, 255, 255))
end)
render.polyline(points: table, col: color, closed: boolean, thickness: number)#
Рисует ломаную линию.
| Параметр | Тип | Описание |
|---|---|---|
points |
table |
массив точек {vector2, ...} |
col |
color |
цвет |
closed |
boolean |
замкнуть ломаную (обязательно) |
thickness |
number |
толщина (обязательно) |
Возвращает: ничего.
-- График FPS за последние 60 кадров
local history = {}
events.render:set(function()
table.insert(history, 1 / math.max(globals.absoluteframetime, 0.001))
if #history > 60 then table.remove(history, 1) end
local pts = {}
for i, fps in ipairs(history) do
pts[i] = vector2(20 + i * 3, 500 - math.min(fps, 300) / 3)
end
if #pts > 1 then
render.polyline(pts, color(0, 255, 120, 255), false, 1)
end
end)
render.poly_gradient(anchor: vector2|nil, points: table, edge: color, center: color, extent?: number)#
Рисует многоугольник с градиентом от края к центру.
| Параметр | Тип | Описание |
|---|---|---|
anchor |
vector2 или nil |
точка-центр градиента; nil — центром считается среднее всех вершин |
points |
table |
массив вершин {vector2, ...} |
edge |
color |
цвет края |
center |
color |
цвет центра |
extent |
number |
протяжённость градиента, по умолчанию 1 |
Возвращает: ничего.
events.render:set(function()
local pts = { vector2(400, 380), vector2(480, 380), vector2(480, 440), vector2(400, 440) }
render.poly_gradient(vector2(440, 410), pts, color(0, 255, 0, 0), color(0, 255, 0, 255), 0.6)
end)
render.poly_shadow(points: table, col: color, thickness: number, offset: vector2)#
Рисует тень многоугольника. Все аргументы обязательны.
| Параметр | Тип | Описание |
|---|---|---|
points |
table |
массив вершин {vector2, ...} |
col |
color |
цвет тени |
thickness |
number |
ширина тени |
offset |
vector2 |
смещение тени |
Возвращает: ничего.
events.render:set(function()
local pts = { vector2(500, 380), vector2(580, 380), vector2(540, 440) }
render.poly_shadow(pts, color(0, 0, 0, 255), 20, vector2(4, 4))
render.poly(pts, color(200, 200, 200, 255))
end)