Исходник Гайд [lib]✨ Particles.lua

stool

Известный
Автор темы
360
267
logo.png


видосики
1726384380235.png
1726384394565.png

представляю вам попытку портировать particles.js на Lua (samp moonloader) под mimgui
работает как в окне, так и в дравлисте фона

да, знаю, что в 2023 году был вариант от @ik0nka (респект тебе), но думаю, что моё решение более гибкое, хоть и требует mimgui и не использует d3d рендерер (render* функции), тем временем, представляя собой именно библиотеку, а не сниппет.

😋 постарался сделать как можно более гибкую настройку, есть недочёты, пишите в теме что добавить, что исправить, делитесь своими пресетами)

как пользоваться
для начала нужно скачать Particles.lua из вложений с этого поста и поместить файл в %папка_сампа%/moonloader/lib
далее необходимо заинклудить библиотеку, создать объект системы частиц и вызвать отрисовку. примеры ниже:
Lua:
local imgui = require 'mimgui'
local Particles = require 'Particles'

-- лучше оставить эту функцию
-- позволяет корректно определить, находится
-- ли курсор мыши в пределах окна
-- нужно для правильной работы притягивания
-- частиц к курсору
function is_mouse_hovering(win_pos, window_size, mx, my)
    local rect_max = {x = win_pos.x + window_size.x, y = win_pos.y + window_size.y}
    return imgui.IsMouseHoveringRect(win_pos, rect_max, true) and (imgui.ImVec2(mx, my) - win_pos) or nil
end

-- задаем настройки для системы частиц
local particles_settings = {
    gravity = 0,
    boundary_behavior = "bounce",
    infinite_life = true,
    color_animation = "rainbow",
    line_color_animation = "rainbow"
}

-- создаем новую систему частиц
local particles_window = Particles:new(particles_settings)

imgui.OnFrame(function() return true end, function()
    imgui.SetNextWindowSize(imgui.ImVec2(400, 600), imgui.Cond.FirstUseEver)
    imgui.Begin("Particles")

    -- задаем размеры области отрисовки на основе
    -- размера окна и его позиции, чтобы корректно
    -- отрисовать частицы
    local win_pos = imgui.GetWindowPos()
    local win_size = imgui.GetWindowSize()
    particles_window.size = {x = win_size.x, y = win_size.y}

    -- здесь мы передаем системе частиц правильную
    -- позицию курсора мыши и вызываем отрисовку
    local mouse_pos = imgui.GetMousePos()
    particles_window:update(is_mouse_hovering(win_pos, win_size, mouse_pos.x, mouse_pos.y))
    particles_window:draw(imgui.GetWindowDrawList(), win_pos)
    imgui.End()
end)
Lua:
local imgui = require 'mimgui'
local Particles = require 'Particles'

-- задаем настройки для системы частиц
local scrX, scrY = getScreenResolution()
local particles_settings = {
    gravity = 0,
    max_particles = 300,
    max_distance = 200,
    boundary_behavior = "bounce",
    infinite_life = true,
    size = imgui.ImVec2(scrX, scrY)
}

-- создаем новую систему частиц
local particles_background = Particles:new(particles_settings)

imgui.OnFrame(function() return true end, function(self)
    -- скрыли курсор, чтоб не мешался
    -- обновили позицию мыши и размер окна
    -- передали в отрисовку дравлист фона
    self.HideCursor = true
    local scrX, scrY = getScreenResolution()
    particles_background.size = imgui.ImVec2(scrX, scrY)
    particles_background:update(imgui.GetMousePos())
    particles_background:draw(imgui.GetBackgroundDrawList(), imgui.ImVec2(0,0))
end)

параметры для настроек системы частиц (settings table)
параметр
тип
описание
возможные значения
gravity
number
гравитация, ну или вертикальная скорость частиц0, 0.1, 0.5
(любое число)
boundary_behavior
string
поведение частиц на границе экрана"bounce" (отскакивать)
"respawn" (сдохнуть и появиться заново)
infinite_life
bool
"умрёт" ли частица через какое-то время (math.random(50, 150))true/false
magnetism
string
тип притяжения"none" (отключить)
"cursor" (относительно мыши)
"particles" (относительно других частиц)
"both" (относительно и мыши и частиц)
magnetism_strength
number
сила притяжения10, 100, 1000
(любое число)
magnetism_radius
number
радиус притяжения100, 500, 1000
(любое число)
speed_range
table
диапазон для рандомной скорости при создании частицы{min, max}
(например {-1.5, 1.5})
min_speed
number
минимальная гарантированная скорость (не будет ниже установленной)0.5, 1.1, 2.0
(любое число)
max_speed
number
максимальная гарантированная скорость10.5, 11.1, 20.0
(любое число)
wind
number
ветер (горизонтальная скорость частиц)0, 0.5, 1
(любое число)
friction
number
трение. симулирует торможение частиц об "воздух"рекомендуемое значение от 0 до 1
1
- отключает фрикцию вообще
0 - тормозит мгновенно (нахуя?)

Lua:
        max_particles = 100,
        gravity = 0.1,
        color = {1,1,1,1},
        line_color = {1,1,1,0.3},
        max_distance = 100,
        boundary_behavior = "respawn",
        infinite_life = false,
        magnetism = "none",
        magnetism_strength = 1000,
        magnetism_radius = 150,
        speed_range = { -1.0, 1.0 },
        min_speed = 0.5,
        max_speed = 5.0,
        color_animation = "none",
        line_color_animation = "none",
        rainbow_speed = 0.005,
        line_rainbow_speed = 0.005,
        line_thickness = 1,
        particle_size = 2,
        wind = 0,
        friction = 0.98,
        size = imgui.ImVec2(500,500)
параметры системы частиц

параметр
тип
описание
возможные значения
particles
table
список частиц в системе
1726359718627.jpeg
max_particles
number
максимальное количество частиц
(СИЛЬНО ВЛИЯЕТ НА FPS, НЕ СТАВЬТЕ ОГРОМНЫЕ ЧИСЛА)
1, 10, 100
(любое число)
size
ImVec2
размер области отрисовки{x, y} {500, 500}
settings
table
настройки системы частиц (выше)
1726359718627.jpeg
color_cycle
number
текущая позиция цикла смены цвета (используется в режиме "rainbow")0, 0.01, 0.05
(любое число)
line_color
table
цвет линии
{r, g, b, a} {0.0, 1.0, 0.5, 0.72}
line_thickness
number
толщина линии0, 0.1, 1, 10
(любое число, желательно от 0)

функции

функция
входные параметры
возвращаемое значение
описание
Particles:new
settings (table)
настройки системы частиц
объект системы частиц Particles
создаёт новую систему частиц с указанными настройками (есть настройки по умолчанию)
Particles:update
mouse_pos (ImVec2)
позиция мыши в формате {x, y}
-​
обновляет состояние всех частиц. принимает позицию курсора для работы magnetism (в режиме "cursor" или "both")
Particles:draw
draw_list (table)
дравлист для отрисовки частиц (GetBackgroundDrawList или GetWindowDrawList)

win_pos (table)
позиция окна для корректного смещения частиц
-​
отрисовывает все частицы и линии в кадре
Particle:new
x (number)
начальная позиция x

y (number)
начальная позиция y

vx (number)
начальная скорость по x

vy (number)
начальная скорость по y

life (number)
время жизни частицы (при infinite_life = false)

settings (table)
настройки частицы унаследованные от системы частиц
объект частицы Particle​
создаёт новую частицу
Particle:update
size (ImVec2)
размер системы частиц для обработки границ отрисовки

mouse_pos (ImVec2)
позиция мыши для отработки magnetism

particles (table)
список частиц для magnetism в режиме "particles" и "both"
-​
обновляет состояние частицы
Particle:respawn
size (ImVec2)
размер системы частиц для обработки границ отрисовки
-​
пересоздание частицы на рандомной позиции
Particle:draw
draw_list (table)
дравлист для отрисовки частиц (GetBackgroundDrawList или GetWindowDrawList)

win_pos (ImVec2)
позиция окна для корректного смещения частиц

color (number)
цвет частицы

size_override (number, optional)
радиус частицы в обход настроек (хз нахуя, забыл пока делал)
-​
отрисовка частицы
 

Вложения

  • Particles.lua
    9.3 KB · Просмотры: 11
Последнее редактирование: